Premiers pas avec GDB
Sur cette page
Qu’est-ce que GDB ?
GDB, abréviation de GNU Debugger, est le débogueur le plus populaire pour les systèmes UNIX pour déboguer les programmes C et C++. GNU Debugger, également appelé gdb, est le débogueur le plus populaire pour les systèmes UNIX pour déboguer les programmes C et C++.
GNU Debugger vous aide à obtenir des informations sur les éléments suivants :
-
Si un vidage mémoire s’est produit, alors quelle déclaration ou expression a fait le plantage du programme activé ?
-
Si une erreur se produit lors de l’exécution d’une fonction, quelle ligne de la programme contient l’appel à cette fonction, et quels sont les paramètres?
-
Quelles sont les valeurs des variables du programme à un moment donné pendant exécution du programme ?
-
Quel est le résultat d’une expression particulière dans un programme ?
Démarrage de GDB
Pour démarrer GDB, dans le terminal,
gdb <executable name>
Pour l’exemple ci-dessus avec un programme nommé main, la commande devient
gdb main
Définir des points d’arrêt
Vous souhaiterez probablement que votre programme s’arrête à un moment donné afin de pouvoir revoir l’état de votre programme. La ligne à laquelle vous voulez que le programme s’arrête temporairement s’appelle le point d’arrêt.
break <source code line number>
Exécution de votre programme
Pour exécuter votre programme, la commande est, comme vous l’avez deviné,
run
Ouverture d’un noyau
gdb -c coreFile pathToExecutable
Travailler avec un fichier core
J’ai créé ce très mauvais programme
#include <stdio.h>
#include <ctype.h>
// forward declarations
void bad_function()
{
int *test = 5;
free(test);
}
int main(int argc, char *argv[])
{
bad_function();
return 0;
}
gcc -g ex1.c
./a.out //or whatever gcc creates
Segmentation fault (core dumped)
gdb -c core a.out
Core was generated by `./a.out'.
Programme terminé avec le signal SIGSEGV, Défaut de segmentation. #0 __GI___libc_free (mem=0x5) à malloc.c:2929 2929 malloc.c : aucun fichier ou répertoire de ce type.
(gdb) where
#0 __GI___libc_free (mem=0x5) à malloc.c:2929 #1 0x0000000000400549 dans bad_function () à ex1.c:12 #2 0x0000000000400564 dans main (argc=1, argv=0x7fffb825bd68) à ex1.c:19
Depuis que j’ai compilé avec -g, vous pouvez voir que l’appel de where me dit qu’il n’a pas aimé le code de la ligne 12 de bad_function()
Ensuite, je peux examiner la variable de test que j’ai essayé de libérer
(gdb) up
#1 0x0000000000400549 dans bad_function () à ex1.c:12 12 gratuit (test);
(gdb) print test
$1 = (entier *) 0x5
(gdb) print *test
Impossible d’accéder à la mémoire à l’adresse 0x5
Dans ce cas, le bogue est assez évident. J’ai essayé de libérer un pointeur qui venait d’être attribué à l’adresse 5 qui n’a pas été créée par malloc, donc Free n’a aucune idée de quoi en faire.