Commandes GDB pratiques pour le débogage

Introduction à GDB

GDB (GNU Debugger) est un débogueur puissent issu du projet GNU, principalement utilisé pour analyser des programmes écrits en C, C++, Go, ou Rust. Il permet d'examiner l'exécution d'un programme, d'identifier des erreurs logiques, et de diagnostiquer des plantages tels que les violations de segmentation.

Lancer une session GDB

Voici différentes manières d'initialiser le débogueur :

Commande Description
gdb ./mon_programme Charge l'exécutable dans GDB
gdb ./programme core Enalyse un fichier core dump
gdb -p 1234 Attache GDB au processus ayant le PID 1234
gdb --args ./prog arg1 Démarre avec des arguments

À l'intérieur de GDB, utilisez run pour démarrer l'exécution et quit pour sortir.

Commandes essentielles

Raccourci Commande Action
l list Affiche le code source
b break Place un point d'arrêt
r run Lance ou relance le programme
n next Exécute la ligne suivante (sans entrer dans les fonctions)
s step Exécute la ligne suivante (entre dans les fonctions)
c continue Reprend l'exécution jusqu'au prochain point d'arrêt
p print Affiche la valeur d'une expression
bt backtrace Affiche la pile d'appels

Maîtriser les points d'arrêt

Placement

break principal          # À l'entrée de la fonction 'principal'
break 42                 # À la ligne 42 du fichier source courant
break module.c:75        # À la ligne 75 de module.c

Gestion

info breakpoints         # Liste tous les points d'arrêt
delete 1                 # Supprime le point d'arrêt numéro 1
disable 3                # Désactive temporairement le point d'arrêt 3
enable 3                 # Réactive le point d'arrêt 3

Points d'arrêt conditionnels

break calcul if resultat == 0
# L'exécution s'arrêtera dans 'calcul' seulement si 'resultat' vaut 0.

Exécution pas à pas

Commande Fonctionnalité
until 50 Continue l'exécution jusqu'à la ligne 50
finish Exécute jusqu'au retour de la fonction courante
return Force un retour immédiat de la fonction

Inspection des données et de la mémoire

Variables

print compteur
print compteur + 5
print *pointeur
print structure.champ
info locals              # Affiche toutes les variables locales du cadre actuel

Surveillance

watch compteur           # Interrompt le programme si 'compteur' change
info watchpoints         # Liste les points de surveillance actifs

Examen brut de la mémoire

x/8xb &tableau           # Affiche 8 octets en hexadécimal depuis l'adresse de 'tableau'
x/12dw vecteur           # Affiche 12 mots (entiers) décimaux depuis 'vecteur'
x/s tampon               # Affiche une chaîne de caractères pointée par 'tampon'

Analyser un programme crashé avec un core dump

Un fichier core dump sauvegarde l'état mémoire d'un programme au moment d'un plantage, facilitant le diagnostic.

Activer la génération des core dumps

ulimit -c unlimited

Analyser le fichier core

gdb ./mon_prog core

Investiguer

bt             # Affiche la pile complète au moment du crash
frame 2        # Examine le cadre d'appel numéro 2
info locals    # Affiche les variables locales dans ce cadre

Exemple pratique : débogage d'un débordement de tableau

Considérons ce code comportant une ereur classique :

#include <stdio.h>

int main() {
    int tab[4] = {10, 20, 30, 40};
    int idx;
    for (idx = 0; idx <= 4; idx++) {  /* Erreur: condition hors limites */
        printf("Valeur: %d\n", tab[idx]);
    }
    return 0;
}

Étapes de débogage :

gcc -g fichier.c -o analyse
gdb ./analyse
(gdb) run
# Le programme plante avec SIGSEGV
(gdb) bt
# Montre que le crash est dans main()
(gdb) frame 0
(gdb) list
(gdb) print idx
# Affiche idx = 4, ce qui correspond à un accès en dehors du tableau tab[0..3].

Interfaces graphiques recommandées

Outil Description
VS Code avec l'extension C/C++ Solution populaire, intuitive et multiplateforme
CLion ou Eclipse CDT IDE puissants avec débogueur intégré
gdbgui Interface web accessible via pip install gdbgui

Étiquettes: gdb C débogage core dump compilation

Publié le 29 juin à 01h20