GNU debugger
Udviklet af | GNU-projekt |
---|---|
Første version | 1986 |
Sidste version | 10,2 (25. april 2021) |
Depositum | sourceware.org/git/gitweb.cgi?p=binutils-gdb.git |
Skrevet i | C og skema |
Operativ system | GNU / Linux , BSD ( d ) , Microsoft Windows og macOS |
Sprog | engelsk |
Type | Fejlfinding |
Licens | GPL-3.0 + ( d ) |
Internet side | www.gnu.org/software/gdb |
GNU Debugger , også kaldet GDB , er denstandard debugger for GNU-projektet . Den er bærbar på mange Unix- lignende systemer og fungerer til flere programmeringssprog, såsom C , C ++ , Fortran , Ada , Objective-C og Go . Det blev skrevet af Richard Stallman i 1988. GDB er gratis software , frigivet under GNU GPL- licensen.
GDB blev først skrevet af Richard Stallman i 1986 sammen med sit GNU- system , efter at GNU Emacs blev betragtet som "rimelig stabil". GDB er gratis software frigivet under GNU General Public License (GPL). Det er inspireret af DBX debugger , som var en del af Unix- distributionen af Berkeley .
Fra 1990 til 1993 blev det vedligeholdt af John Gilmore . Nu vedligeholdes den af GDB-styregruppen, som blev oprettet af Free Software Foundation .
GDB arbejder på mange forskellige processorarkitekturer og tillader fjernfejlfinding (via serielt link eller IP-forbindelse) af applikationer, der kører på en målplatform adskilt fra udviklingsplatformen. Dette muligvis på to forskellige typer processorer.
GDB giver dig mulighed for at debugge et kørende program (ved at rulle det ned i instruktion ved instruktion eller undersøge og ændre dets data), men det tillader også fejlfinding efter slagtning ved at analysere en kernefil , der repræsenterer indholdet af et afsluttet program. Unormalt.
GDB's interface er en simpel kommandolinje, men der er frontend-applikationer, der giver den en meget mere brugervenlig grafisk grænseflade. Ddd- hjælpeprogrammet gør det for eksempel muligt at klikke på en linjekode direkte i listen for at placere et brudpunkt der, mens GDB alene kræver indtastning af linjenummeret. Bemærk også, at GDB ofte påberåbes i baggrunden af integrerede udviklingsmiljøer som Eclipse .
GDB tilbyder en "fjern" -tilstand, som ofte kan bruges ved debugging på integrerede systemer. Fjernbetjening er, når GDB kører på en computer, og det program, der debugges, kører på en anden computer . GDB kan også kommunikere med den eksterne "stub", som forstår GDB-protokollen via en seriel enhed eller via TCP / IP- protokollen . Et erstatningsprogram kan oprettes ved at linke til de relevante stubfiler leveret med GDB, som implementerer målsiden af kommunikationsprotokollen. Det er også muligt at bruge gdbserver til at fejle programmet eksternt uden at skulle ændre det.
KGDB bruger også den samme tilstand til at debugge en kørende Linux-kerne på kildeniveau med gdb. Med KGDB kan kerneudviklere debugge en kerne på samme måde, som de debugger applikationsprogrammer. Det giver dig mulighed for at placere breakpoints i kernekoden, gå igennem koden og også observere variabler. På nogle arkitekturer, hvor hardwarefejlregistreringer er tilgængelige, er det muligt at definere kontrolpunkter, der udløser breakpoints, når bestemte hukommelsesadresser udføres. KGDB kræver en ekstra computer, der er tilsluttet computeren, for at blive debugget ved hjælp af et serielt eller Ethernet- kabel . På FreeBSD- operativsystemet er det også muligt at debugge ved hjælp af direkte adgang til Firewire-hukommelse.
gdb-program | kør gdb med programmet "program" |
---|---|
kør -v | start programmet fyldt med parameteren "-v" |
bt | viser opkaldsspor (nyttigt i tilfælde af, at programmet går ned) |
info registrerer | viser alle registre |
sig hånd | adskille hovedfunktionen |
Overvej følgende kildekode skrevet i C:
//Bibliothèques standard du C #include <stdio.h> #include <stdlib.h> #include <string.h> size_t foo_len( const char *s ) { return strlen( s ); } int main( int argc, char *argv[] ) { const char *a = NULL; printf( "size of a = %lu\n", foo_len(a) ); return 0; }Hvis du bruger GCC- kompilatoren på Linux , skal ovenstående kode kompileres med -g-flag for at inkludere de relevante fejlretningsoplysninger om den genererede binære, så den kan inspiceres ved hjælp af GDB. Under forudsætning af, at filen, der indeholder ovenstående kode, kaldes eksempel.c, kan kommandoen til kompilering være:
$ gcc exemple.c -Og -g -o exempleOg binærfunktionen kan nu udføres:
$ ./exemple Segmentation faultNår binærfunktionen udføres, genererer den en segmenteringsfejl, GDB kan bruges til at inspicere problemet for at løse det.
$ gdb ./exemple GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /path/exemple...done. (gdb) run Starting program: /path/exemple Program received signal SIGSEGV, Segmentation fault. 0x0000000000400527 in foo_len (s=0x0) at exemple.c:8 8 return strlen (s); (gdb) print s $1 = 0x0Problemet er til stede på linje 8 og opstår, når strlen-funktionen kaldes (fordi dens argument, s, er NULL). Afhængigt af implementeringen af strlen (online eller ej) kan resultatet være anderledes, for eksempel:
GNU gdb (GDB) 7.3.1 Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /tmp/gdb/exemple...done. (gdb) run Starting program: /tmp/gdb/exemple Program received signal SIGSEGV, Segmentation fault. 0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6 (gdb) bt #0 0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6 #1 0x08048435 in foo_len (s=0x0) at exemple.c:8 #2 0x0804845a in main (argc=<optimized out>, argv=<optimized out>) at exemple.c:16For at løse dette problem skal variablen a (i hovedfunktionen) indeholde en gyldig streng. For eksempel :
//Bibliothèques standard du C #include <stdio.h> #include <stdlib.h> #include <string.h> size_t foo_len( const char *s ) { return strlen(s); } int main( int argc, char *argv[] ) { //correction ici const char *a = "Hello World!\n"; printf( "size of a = %lu\n", foo_len(a) ); return 0; }Hvis vi nu kompilerer og kører binær igen med GDB, er resultatet korrekt:
GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /path/exemple...done. (gdb) run Starting program: /path/exemple size of a = 13 [Inferior 1 (process 14290) exited normally]GDB viser på standardoutputtet, at programmet sluttede normalt.