GDBAan de slag met GDB


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

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  
 

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?

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.