GDB Zelfstudie
Aan de slag met GDB
Zoeken…
Opmerkingen
GDB (GNU Project debugger) is een command line base debugger die goed is in het analyseren van lopende en gevulde programma's. Volgens de gebruikershandleiding ondersteunt GDB C, C ++, D, Go, Objective-C, Fortran, Java, OpenCL C, Pascal, Rust, assembly, Modula-2 en Ada.
GDB heeft dezelfde functieset als de meeste debuggers, maar verschilt van de meeste die ik heb gebruikt en is allemaal gebaseerd op typopdrachten in plaats van op GUI-elementen te klikken. Sommige van deze functies zijn onder meer:
- Breekpunten instellen
- De waarde van variabelen afdrukken.
- De waarde van variabelen instellen om dingen te testen.
- De stapel bekijken
Wat is GDB?
GDB, kort voor GNU Debugger, is de meest populaire debugger voor UNIX-systemen om C- en C ++ -programma's te debuggen. GNU Debugger, ook wel gdb genoemd, is de meest populaire debugger voor UNIX-systemen voor het debuggen van C- en C ++ -programma's.
GNU Debugger helpt u bij het verkrijgen van informatie over het volgende:
Als er een kerndump is gebeurd, op welke stelling of uitdrukking is het programma gecrasht?
Als er een fout optreedt tijdens het uitvoeren van een functie, welke regel van de
programma bevat de oproep voor die functie, en wat zijn de
parameters?Wat zijn de waarden van programmavariabelen op een bepaald punt tijdens de uitvoering van het programma?
Wat is het resultaat van een bepaalde uitdrukking in een programma?
GDB starten
Om GDB te starten, in de terminal,
gdb <executable name>
Voor het bovenstaande voorbeeld met een programma met de naam main, wordt de opdracht
gdb main
Breekpunten instellen
U wilt waarschijnlijk dat uw programma op een gegeven moment stopt, zodat u de staat van uw programma kunt bekijken. De regel waarop u het programma tijdelijk wilt stoppen, wordt het breekpunt genoemd.
break <source code line number>
Uw programma uitvoeren
Om je programma uit te voeren is het commando, zoals je al geraden hebt,
run
Een kern openen
gdb -c coreFile pathToExecutable
Werken met een kernbestand
Dit echt slechte programma gemaakt
#include <stdio.h>
#include <ctype.h>
// forward declarations
void bad_function()
{
int *test = 5;
free(test);
}
int main(int argc, char *argv[])
{
bad_function();
return 0;
}
gcc -g ex1.c
./a.out //or whatever gcc creates
Segmentation fault (core dumped)
gdb -c core a.out
Core was generated by `./a.out'.
Programma beëindigd met signaal SIGSEGV, segmentatiefout. # 0 __GI___libc_free (mem = 0x5) op malloc.c: 2929 2929 malloc.c: Een dergelijk bestand of map bestaat niet.
(gdb) where
# 0 __GI___libc_free (mem = 0x5) op malloc.c: 2929 # 1 0x0000000000400549 in bad_function () op ex1.c: 12 # 2 0x0000000000400564 main (argc = 1, argv = 0x7fffb825bd68) op ex1.c: 19
Omdat ik met -g heb gecompileerd, kun je zien dat aanroepen van waar zegt dat de code op regel 12 van bad_function () niet beviel
Daarna kan ik de testvariabele onderzoeken die ik probeerde vrij te maken
(gdb) up
# 1 0x0000000000400549 in bad_function () op ex1.c: 12 12 gratis (test);
(gdb) print test
$ 1 = (int *) 0x5
(gdb) print *test
Geen toegang tot geheugen op adres 0x5
In dit geval is de bug vrij duidelijk. Ik probeerde een aanwijzer te bevrijden die net het adres 5 had gekregen dat niet door malloc was gemaakt, dus gratis heeft geen idee wat ermee te doen.