Retour à l'accueil

Débogage GDB C++ : trouver le segfault en minutes

Guide GDB pour les développeurs C++ axé sur la recherche de segfault, la définition de breakpoints, l'affichage des variables et le mode TUI. Basé sur de vrais exemples de crash et la navigation de code sans recompilations.

GDB en C++ : du segfault au débogage rapide
Advertisement 728x90

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 :

Google AdInline article slot
#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 de main
  • break program.cpp:42 — sur une ligne précise
  • break UserData::setName — au moment d'entrer dans une méthode
  • info 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.

Google AdInline article slot

Naviguez dans le code :

| Commande | Raccourci | Action |

|---------|----------|--------|

Google AdInline article slot

| 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 variable
  • print *pointer — déréférencer un pointeur
  • print vec.size() — appeler une méthode
  • display variable_name — afficher automatiquement après chaque étape
  • info locals — montrer les variables locales
  • info 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 source
  • layout asm — vue en langage machine
  • layout split — source + assembly
  • layout regs — fenêtre des registres
  • Ctrl + X, 2 — deux fenêtres
  • Ctrl + X, o — basculer entre les fenêtres
  • Ctrl + 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écuter
  • b — définir un point d'arrêt
  • bt — retour arrière (stack trace)
  • n — suivant
  • s — pas à pas
  • fin — terminer
  • c — continuer
  • p — imprimer
  • i locals — variables locales
  • q — 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 -O0 sont obligatoires ; sans eux, le débogage est inutile.
  • next vs step est crucial en C++ avec STL — évitez de plonger profondément dans le code des bibliothèques.
  • display et info locals/args offrent une visibilité totale sur l'état sans polluer le code avec des printf.

— Editorial Team

Advertisement 728x90

Lire ensuite