D’abord pour pouvoir être “debugeable”, un programme doit être compilé avec le mode “debug information”.
Et pour compiler avec le mode debug, avec gcc il faut faire :
gcc -g <program>.c -o <program>
–g : indique le mode debug
–o: indique le fichier de sortie du programme
GDB pour débuger un programme
Syntaxe : gdb <nom_program>
Il est aussi possible de lancer gdb sans argument, puis une fois à l’intérieur tapez la commande file <program> pour charger le programme.
[pastacode lang=”bash” message=”” highlight=”” provider=”manual”]
#gdb
file
[/pastacode]
GDB pour analyser un fichier core
Un fichier core est une image mémoire d’un procéssus qui s’est crashé. Il contient les informations permettant de debbuger qui ont été collectées lors du crash: contenu des registres, status des process status et données.
Le fichier core est généré par un appel à la fonction abort().
GDB charge le fichier core et permet d’examiner le programme avant son crash.
Syntaxe : gdb <programme> fichier_core
Exemple : gdb /bin/perl core.12345
Quelques commandes GDB
- run : lancer le programme
- bt : ou backtrace, permet de savoir où s’est arrêté le programme. Le résultat est afficher sous forme de frame.
[pastacode lang=”bash” message=”” highlight=”” provider=”manual”]
#(gdb) bt
#0 0x80483ea in wib (no1=8, no2=8) at eg1.c:7
#1 0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21
[/pastacode]
- frame <num_frame> : affiche le contenu d’un frame. Le numero d’un frame est retourné par la commande “bt”
- break : ajouter un breakpoint sur une ligne particulier ou sur une fonction. Une fois lancé, gbb s’arrête à ce breakpoint.
[pastacode lang=”bash” message=”” highlight=”” provider=”manual”]
#(gdb) break 21
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048428 in main at eg1.c:21
stop only if value == div
breakpoint already hit 1 time
[/pastacode]
- info break : affiche les informations sur les breakpoint.
[pastacode lang=”bash” message=”” highlight=”” provider=”manual”]
#(gdb)info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048428 in main at eg1.c:21
stop only if value == div
breakpoint already hit 1 time
[/pastacode]
- info functions : affiche toutes les fonctions du programme
[pastacode lang=”bash” message=”” highlight=”” provider=”manual”]
#(gdb) info functions
All defined functions:
Non-debugging symbols:
0x10000150 __start
0x10000228 __threads_init
0x10000340 call_pth_init
0x10000390 __pth_init
0x100003b8 __mod_init
0x100003e0 main
0x100005a0 xs_init
0x10000620 signal
0x10000648 pthread_atfork
[/pastacode]
- info frame : voir l’état du programme
[pastacode lang=”bash” message=”” highlight=”” provider=”manual”]
#info frame
Stack level 0, frame at 0x2ff22740:
pc = 0xd01290f8 in extend_brk; saved pc 0x5d
Arglist at 0x2ff22740, args:
Locals at 0x2ff22740, Previous frame's sp in r1
Saved registers:
r25 at 0xffffffe4, r26 at 0xffffffe8, r27 at 0xffffffec, r28 at 0xfffffff0, r29 at 0xfffffff4,
r30 at 0xfffffff8, r31 at 0xfffffffc, lr at 0x8
[/pastacode]
- info sharedlibrary : lister les adresses des librairies partagés
[pastacode lang=”bash” message=”” highlight=”” provider=”manual”]
#(gdb) info sharedlibrary
Text Range Data Range Syms Shared Object Library
0xd1a78180-0xd1a7de90 0xf05dc8e8-0xf05dcfcc Yes /usr/opt/perl5/lib/5.8.8/aix-thread-multi/auto/File/Glob/Glob.so
0xd1a6c180-0xd1a73969 0xf05d7ee0-0xf05d91d4 Yes /usr/opt/perl5/lib/5.8.8/aix-thread-multi/auto/Socket/Socket.so
0xd0548280-0xd055cf51 0xf06bdf40-0xf06c83f0 Yes /usr/lib/libiconv.a(shr4.o)
0xd053a280-0xd0547801 0xf06c9e20-0xf06cb13c Yes /usr/lib/libi18n.a(shr.o)
0xd0532124-0xd0534d75 0xd0536128-0xd053845c Yes /usr/lib/nls/loc/en_US
0xd05c1ae0-0xd05c2080 0xf0292d70-0xf0292e60 Yes /usr/lib/threads/libc.a(pse.o)
[/pastacode]
Plus d’informations ici