Déboggage sous GDB
Par Deimos le 05-01-2007
Ce tutorial décrit rapidement toutes les commandes nécessaires à savoir débogger sous GNU/Linux
Sommaire :
I. Introduction
II. Breakpoints
III. Commandes générales
IV. Deboggage avec fichier core
I. Introduction
Ce tutorial a pour but de vous faire connaitre les commandes utiles (le plus couramment) lors du déboggage d'exécutable sous GNU/Linux. Il n'a pas le but d'être extrèmement exhaustif, il ya la documentation officielle de gdb pour ça =)
Tout d'abord, avant de vouloir débugger son exécutable avec gdb, il faut l'avoir compilé avec les symboles de déboggage. Avec gcc, c'est l'option -g :
| shell : | |
|
$ gcc -g -o code code.c |
Ensuite, pour lancer un exécutable avec gdb puis stopper son exécution et quitter gdb :
| gdb : | |
|
(gdb) run Starting program: /home/deimos/exemple (gdb) kill Kill the program being debugged? (y or n) y (gdb) quit |
Note : Si l'exécutable provient de plusieurs fichiers sources, alors il est nécessaire de spécifier le nom du fichier source avant le numéro de ligne ou du nom de la fonction, selon la syntaxe : nom_fichier:num_ligne ou nom_fichier:fonction.
Pour obtenir les informations sur les breakpoints, on utilise la commande info :
| gdb : | |
|
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x080483cd in foo at vuln.c:5 breakpoint already hit 1 time 2 breakpoint keep y 0x0804842e in main at vuln.c:16 3 breakpoint keep y 0x0804843d in main at vuln.c:19 4 breakpoint keep y 0x080483ff in main at vuln.c:12 (gdb) disable 2 (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x080483cd in foo at vuln.c:5 breakpoint already hit 1 time 2 breakpoint keep n 0x0804842e in main at vuln.c:16 3 breakpoint keep y 0x0804843d in main at vuln.c:19 4 breakpoint keep y 0x080483ff in main at vuln.c:12 (gdb) delete 1 (gdb) info breakpoints Num Type Disp Enb Address What 2 breakpoint keep n 0x0804842e in main at vuln.c:16 3 breakpoint keep y 0x0804843d in main at vuln.c:19 4 breakpoint keep y 0x080483ff in main at vuln.c:12 |
Lorsqu'un exécutable crashe, par exemple après avoir reçu un signal SIGSEGV (Segmentation fault/violation), il est possible de le debogger directement sous gdb afin de connaitre la raison du crash. Pour cela, il faut exécuter la commande :
| shell : | |
|
$ gdb -c core |
core est le fichier généré lors du crash. Si toutefois aucun fichier n'est généré, il suffit alors d'exécuter la commande ulimit :
| shell : | |
|
$ ./test Segmentation fault $ ulimit -c 100000 $ ./test Segmentation fault (core dumped) |
Nous pouvons alors lancer gdb avec en paramètre le fichier core, puis exécuter la commande where pour savoir où en est le code, ainsi que toutes les autres commandes afin de visionner la stack, les registres, etc ;)