This is an old revision of the document!
GDB, sau (G)NU (D)e(B)ugger, este un utilitar ce poate fi folosit pentru a vedea ce se întâmplă înăuntrul unui program în timp ce acesta rulează sau pentru a putea vedea starea în care se află programul la momentul în care a crash-uit.
GDB este folosit în principal pentru a depana programe scrise în C sau C++. Acesta poate fi folosit în două moduri pentru a depana un program:
- rulându-l folosind comanda gdb - folosind fişierul core generat în urma unei erori grave (de obicei segmentation fault)
În acest laborator vom analiza doar prima modalitate de depanare.
Pentru exemplificare considerăm următorul program:
int add(int a, int b) { int c; c = a + b; return c; } int main(int argc, char **argv) { char *bug = 0; bug[2] = add(2, 4); return 0; }
După compilare, observăm că la executarea programului se produce un segmentation fault.
$ gcc bug.c -o bug $ ./bug Segmentation fault (core dumped)
gdb
este unealta potrivită pentru astfel de situații. Ca să aflăm la ce linie a avut loc acest segmentation fault, mai întâi trebuie să revenim la pasul de compilare și să activăm simbolurile de depanare folsind opțiunea -g
a compilatorului gcc
:
$ gcc -g bug.c -o bug
În continuare, rulăm programul folosind gdb
:
$ gdb bug [...] (gdb) run Program received signal SIGSEGV, Segmentation fault. 0x000000000040054f in main (argc=1, argv=0x7fffffffe038) at bug.c:13 13 bug[2] = add(2, 4); (gdb)
Simbolurile de depanare nu sunt în mod implicit adăugate deoarece prin adăugarea acestora, executabilul rezultat va avea o dimensiune mai mare. Folosiți opțiunea -g
doar în faza de dezvoltare.
$ gcc exemplu.c -o exemplu $ gcc -g exemplu.c -o exemplu_debug $ ls -l -rwxrwxr-x. 1 student student 6.0K Dec 7 23:55 exemplu -rwxrwxr-x. 1 student student 6.8K Dec 7 23:55 exemplu_debug
TODO