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 |