Recherche…


Remarques

GDB (Debugger GNU Project) est un débogueur de base de ligne de commande qui permet d’analyser les programmes en cours et les programmes intégrés. Selon le manuel d'utilisation, GDB supporte les langages C, C ++, D, Go, Objective-C, Fortran, Java, OpenCL C, Pascal, Rust, Assemblage, Modula-2 et Ada.

GDB possède le même ensemble de fonctionnalités que la plupart des débogueurs, mais il est différent de la plupart de ceux que j'ai utilisés, qui sont tous basés sur des commandes de saisie au lieu de cliquer sur des éléments de l'interface graphique. Certaines de ces fonctionnalités incluent:

  • Définition de points d'arrêt
  • Impression de la valeur des variables.
  • Définir la valeur des variables pour tester les choses.
  • Visualisation de la pile

Qu'est ce que GDB?

GDB, abréviation de GNU Debugger, est le débogueur le plus utilisé par 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 de débogage des programmes C et C ++.

GNU Debugger vous aide à obtenir des informations sur les éléments suivants:

  • Si un vidage de mémoire s'est produit, alors sur quelle déclaration ou quelle expression le programme s'est-il arrêté?

  • Si une erreur survient lors de l'exécution d'une fonction, quelle ligne du
    programme contient l'appel à cette fonction, et quels sont les
    paramètres?

  • Quelles sont les valeurs des variables du programme à un moment donné pendant l'exécution du programme?

  • Quel est le résultat d'une expression particulière dans un programme?

Démarrer 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éfinition de points d'arrêt

Vous voudrez probablement que votre programme s'arrête à un moment donné afin que vous puissiez revoir l'état de votre programme. La ligne sur laquelle vous voulez que le programme s'arrête temporairement s'appelle le point d'arrêt.

break <source code line number>

Lancer votre programme

Pour exécuter votre programme, la commande est, comme vous l'avez deviné,

run

Ouvrir un noyau

gdb -c coreFile pathToExecutable  

Travailler avec un fichier de base

A 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, erreur 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 where indique 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 free (test);

(gdb) print test

$ 1 = (int *) 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 juste d’être assigné à l’adresse 5 qui n’a pas été créée par malloc, donc gratuit n’a aucune idée de ce qu’il faut en faire.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow