GDB : Débogage pas à pas en C++ sans crainte de segmentation fault
GDB vous permet d'identifier précisément l'endroit où votre programme plante en seulement 15 à 30 secondes. Au lieu de multiplier les printf et de recompiler sans cesse, utilisez le débogueur pour inspecter la pile d'appels et les valeurs des variables en temps réel. Compilez avec -g -O0 pour inclure les informations de débogage :
g++ -g -O0 -o myprogram myprogram.cpp
Vérifiez que les infos de débogage sont présentes avec file myprogram. Lancez le débogage via gdb ./myprogram, puis exécutez run. En cas de segmentation fault, GDB s'arrête et affiche l'emplacement exact grâce à backtrace (bt).
Un plantage dans std::string::operator= avec un pointeur this nul apparaît instantanément dans la trace de pile :
#0 0x... in std::string::operator= (this=0x0, ...)
#1 0x... in UserData::setName (...)
#2 0x... in main ()
Activez une sortie lisible : set print pretty on et set print demangle on.
Points d'arrêt et navigation dans le code
Définissez des points d'arrêt pour contrôler l'exécution :
break main— au début demainbreak program.cpp:42— sur une ligne précisebreak UserData::setName— au moment d'entrer dans une méthodeinfo break— lister tous les points d'arrêt
Pour les fonctions C++ surchargées, précisez la signature : break print(int) ou break print(std::string). Option avancée : rbreak ^.*::print$ pour correspondre à toutes les méthodes print via une expression régulière.
Naviguez dans le code :
| Commande | Raccourci | Action |
|---------|----------|--------|
| next | n | Exécuter la ligne sans entrer dans les fonctions |
| step | s | Exécuter la ligne et entrer dans les fonctions |
| finish | fin | Exécuter jusqu'à la fin de la fonction |
| continue | c | Reprendre jusqu'au prochain point d'arrêt |
En C++, évitez step dans les appels STL comme push_back — utilisez next pour rester à l'extérieur du code interne des bibliothèques.
Inspection des variables et objets
Utilisez ces commandes pour examiner les données :
print variable_name— afficher la valeur d'une variableprint *pointer— déréférencer un pointeurprint vec.size()— appeler une méthodedisplay variable_name— afficher automatiquement après chaque étapeinfo locals— montrer les variables localesinfo args— afficher les arguments de fonction
GDB affiche correctement les types C++ :
print myVector
$1 = std::vector de longueur 5, capacité 8 = {1, 2, 3, 4, 5}
print myString
$2 = "Hello, World!"
Si vous voyez <optimized out>, recompilez avec -O0. Sans -g, les noms de variables ne seront pas visibles.
Mode TUI pour un débogage visuel
Activez tui enable — l'écran se divise : en haut, le code source avec la ligne courante mise en évidence ; en bas, la zone de commande. Utilisez :
layout src— vue du code sourcelayout asm— vue en langage machinelayout split— source + assemblylayout regs— fenêtre des registresCtrl + X, 2— deux fenêtresCtrl + X, o— basculer entre les fenêtresCtrl + X, a— quitter le mode TUI
Le mode TUI simplifie la navigation en affichant le contexte sans dépendre des numéros de ligne.
Problèmes fréquents et solutions
| Problème | Solution |
|--------|----------|
| <optimized out> | Recompilez avec -O0 |
| Pas de noms de variables | Utilisez le flag -g |
| Variables locales manquantes | Exécutez info locals à l'intérieur de la fonction |
| Vecteur affiche des déchets | Utilisez print vec._M_impl._M_start dans les versions anciennes de libstdc++ |
Commandes essentielles pour développeurs intermédiaires
Maîtrisez ces 10 commandes pour 90 % des tâches de débogage :
r— exécuterb— définir un point d'arrêtbt— retour arrière (stack trace)n— suivants— pas à pasfin— terminerc— continuerp— imprimeri locals— variables localesq— quitter
Points clés
- Pile d'appels (
bt) résout 70 % des segmentation faults en quelques secondes, révélant tout le parcours remontant àmain. - Mode TUI visualise le code, réduisant la charge cognitive sur les projets complexes.
-g -O0sont obligatoires ; sans eux, le débogage est inutile.nextvsstepest crucial en C++ avec STL — évitez de plonger profondément dans le code des bibliothèques.displayetinfo locals/argsoffrent une visibilité totale sur l'état sans polluer le code avec desprintf.
— Editorial Team
Aucun commentaire pour le moment.