Premiers pas avec GDB

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.