Il permet la recherche de bug dans un code qui compile mais qui ne donne pas satisfaction.
Il faut ajouter l'option -g pour ajouter les sondes logiciels et pouvoir utiliser gdb sur votre code
testgdb.c
/*******************************
Code de teste pour gdb *
********************************/
#include <stdlib.h>
#include <stdio.h>
int main(int argc,char **argv)
{
int compteur;
compteur=0;
printf("Bonjour GDB \n");
do
{
printf ("compteur : %d \n",compteur);
compteur=compteur+1;
}
while (compteur<4);
return EXIT_SUCCESS;
}
pour compiler :
gcc testgdb.c -o testgdb -ansi -pedantic -Wall -g
on peut tester le programme sans gdb dans un premier temps
bruno@pollux:~/Works/Codes_C/testgdb$ vi testgdb.c
bruno@pollux:~/Works/Codes_C/testgdb$ gcc testgdb.c -o testgdb -Wall -ansi -pedantic -g
bruno@pollux:~/Works/Codes_C/testgdb$ ls
testgdb testgdb.c
bruno@pollux:~/Works/Codes_C/testgdb$ ./testgdb
Bonjour GDB
compteur : 0
compteur : 1
compteur : 2
compteur : 3
bruno@pollux:~/Works/Codes_C/testgdb$
puis appeler le programme avec gdb
bruno@pollux:~/Works/Codes_C/testgdb$ gdb testgdb
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from testgdb...done.
(gdb) l
1 /*******************************
2 Code de teste pour gdb *
3 ********************************/
4
5 #include <stdlib.h>
6 #include <stdio.h>
7
8 int main(int argc,char **argv)
9 {
10 int compteur;
(gdb)
permet de lister le programme, pour repérer votre code
il faut toujours placer un point d’arrêt sinon le programme va se dérouler simplement.
(gdb) run
Starting program: /home/bruno/Works/Codes_C/testgdb/testgdb
Bonjour GDB
compteur : 0
compteur : 1
compteur : 2
compteur : 3
[Inferior 1 (process 28389) exited normally]
(gdb)
et nous re-constatons que tout se passe bien!
(gdb) break main
Breakpoint 2 at 0x699: file testgdb.c, line 11.
(gdb)
soit un numéro de ligne (ici 11) ou le nom de la fonction.
(gdb) br main
Breakpoint 3 at 0x555555554699: file testgdb.c, line 11.
(gdb) run
Starting program: /home/bruno/Works/Codes_C/testgdb/testgdb
Breakpoint 3, main (argc=1, argv=0x7fffffffdbf8) at testgdb.c:11
11 compteur=0;
(gdb)
le debugger attends notre ordre avant d’exécuter la ligne 11 (point d’arrêt)
on peut regarder le contenu de la variable compteur avec la commande print (ou p)
(gdb) print compteur
$1 = 0
(gdb) p compteur
$2 = 0
(gdb) p $1
$3 = 0
(gdb)
nous sommes "le dieu" du programme donc on peut décider du contenu des variables, si besoin pour chasser le bug !
(gdb) set compteur=4
(gdb) p compteur
$4 = 4
(gdb)
on est arrêté à la ligne 11 (première ligne exécutable du main)
le fait de taper la commande next (ou n) va exécuter la ligne 11 et montrer la suivante à exécuter.
(gdb) next
12 printf("Bonjour GDB \n");
(gdb) p compteur
$5 = 0
(gdb)
donc compteur est bien initialisé à zéro comme sur la ligne 11.
et la ligne 12 est en attente
(gdb) n
Bonjour GDB
15 printf ("compteur : %d \n",compteur);
(gdb)
on voit en rouge le résultat de la ligne 12
(gdb) n
compteur : 0
16 compteur=compteur+1;
(gdb) p compteur
$6 = 0
(gdb) n
18 while (compteur<4);
(gdb) p compteur
$7 = 1
(gdb)
on voit bien que compteur à était augmenté de 1 (compteur = compteur + 1) ligne 16
la ligne 18 contient la condition d’arrêt de la boucle ( faire // tant que )
(gdb) p (compteur<4)
$8 = 1
(gdb)
ici ça donne 1 donc condition vraie, ce qui implique que l'on va encore faire ..
et nous pouvons suivre pas à pas le code ..
gdb possède beaucoup de commandes (help)
http://www.yolinux.com/TUTORIALS/GDB-Commands.html
https://www.fil.univ-lille1.fr/~sedoglav/C/main043.html
https://www.rocq.inria.fr/secret/Anne.Canteaut/COURS_C/gdb.html