next up previous
Next: Operatii de intrare/iesire (I/O) Up: Programarea in Unix/Linux Previous: Make

GDB (GNU Debugger)

GDB este debugger-ul implicit pe distributiile Linux. Rolul unui debugger este de a permite programatorului sa vizualizeze ceea ce se intampla in cadrul unui program in timp ce se executa sau ce anume s-a intamplat inainte ca un program sa se termine cu eroare.

Dificultatea utilizarii GDB consta in faptul ca acesta este un depanator in linie de comanda si este mult mai putin intuitiv de folosit ca un depanator cu interfata grafica. Se recomanda utilizarea optiunii -g in momentul compilarii si legarii programelor pentru a furniza informatii suplimentare depanatorului.

Pentru depanarea unui program se va rula comanda:

$ gdb ./myexec 
Dupa aceasta se intra intr-un interpretor de comenzi GDB, unde se asteapta comenzi de la utilizator. Printre cele mai utile sunt:

     quit            -   parasirea depanatorului
     run [arg list]  -   rularea programului depanat cu lista de argumente
     bt              -   (backtrace) afisarea continutului stivei programului
     print expr      -   afisarea valorii unei expresii
     break [file:]function - breakpoint in cadrul unei functii
     c               -   continuarea rularii programului dupa un breakpoint
     next            -   executia urmatoarei linii din program (pentru
                         executie pas cu pas)
     help [command]  -   afisarea de informatii generale despre utilizarea
                         GDB sau despre utilizarea unei comenzi

Vom prezenta un exemplu de utilizare a depanatorului pentru un program care genereaza segmentation fault. Programul folosit este prezentat mai jos

#include <stdio.h>
#include <string.h>

int main (void)
{
        char *s;

        /* copiere intr-un sir care nu este alocat -> seg fault */
        strcpy (s, "Hello, World!\n");

        printf (s);

        return 0;
}

Compilarea si depanarea acestui program decurge ca mai jos:

razvan@ragnarok:~/cfiles/solab/lab1$ vi gdb_test.c
razvan@ragnarok:~/cfiles/solab/lab1$ gcc -Wall -pedantic -ansi -o gdb_test gdb_test.c
razvan@ragnarok:~/cfiles/solab/lab1$ ./gdb_test
Segmentation fault
razvan@ragnarok:~/cfiles/solab/lab1$ gdb ./gdb_test
GNU gdb 6.3-debian
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-linux"...Using host libthread_db library 
"/lib/tls/libthread_db.so.1".
(gdb) break main
Breakpoint 1 at 0x80483ca
(gdb) run
Starting program: /home/razvan/cfiles/solab/lab1/gdb_test
Breakpoint 1, 0x080483ca in main ()
(gdb) step
Single stepping until exit from function main,
which has no line number information.
Program received signal SIGSEGV, Segmentation fault.
0xb7f1ed16 in strcpy () from /lib/tls/libc.so.6
(gdb) bt
#0  0xb7f1ed16 in strcpy () from /lib/tls/libc.so.6
#1  0x080483e7 in main ()
(gdb) kill
Kill the program being debugged? (y or n) y
(gdb) quit
razvan@ragnarok:~/cfiles/solab/lab1$



Razvan Adrian Deaconescu 2005-10-01