Maison >développement back-end >C++ >Comment déboguer un programme C++ qui plante ?

Comment déboguer un programme C++ qui plante ?

WBOY
WBOYoriginal
2024-06-01 19:48:00308parcourir

Les méthodes de débogage des programmes en panne C++ incluent : l'utilisation des options du compilateur pour générer du code déboguable ; l'utilisation du débogueur GDB pour parcourir, inspecter les variables, définir des points d'arrêt et afficher les traces de pile pour garantir que les conditions sont valides ; anomalies pré-accident.

如何调试崩溃的 C++ 程序?

Comment déboguer un programme C++ qui plante ?

Lorsqu'un programme C++ plante, le processus permettant de déterminer la cause du crash et de le réparer est appelé débogage. Voici quelques techniques courantes pour déboguer les programmes qui plantent en C++ :

1. Utilisation des options du compilateur

Compiler votre code à l'aide des options du compilateur (telles que l'indicateur -g dans g++) peut produire un fichier exécutable contenant des informations de débogage. Cela permet d'utiliser un débogueur (tel que GDB) pour se connecter à un programme en cours d'exécution et y accéder.

2. GDB Debugger

GDB est un puissant débogueur de ligne de commande qui peut être utilisé pour déboguer des programmes C++. En utilisant GDB, vous pouvez :

  • Parcourir le code
  • Inspecter les variables et la mémoire
  • Définir des points d'arrêt
  • Afficher les traces de la pile

3. Assertions

Les assertions sont des vérifications dans un programme qui garantissent que la condition est vraie. Si la condition est fausse, le programme s'arrêtera de manière inattendue. Cela permet d'identifier les erreurs ou les entrées invalides dans le programme.

4. Journalisation

La journalisation implique l'écriture d'événements de programme ou d'informations d'erreur dans un fichier. En examinant les fichiers journaux, vous pouvez identifier des conditions ou des erreurs inhabituelles avant qu'un programme ne plante.

Exemple pratique

Considérez le programme C++ suivant qui plante :

#include <iostream>

int main() {
  int* ptr = new int;
  *ptr = 10;
  delete ptr;
  *ptr = 20;  // 访问已释放的内存
  return 0;
}

La compilation et l'exécution de ce programme entraîneront une erreur de segmentation. En utilisant GDB, nous pouvons déboguer le programme comme suit :

$ gdb ./a.out
(gdb) run
Starting program: /path/to/a.out
[New Thread 15676.0x1153570]
[New Thread 15677.0x1154ec0]

Program received signal SIGSEGV, Segmentation fault.
0x0000555555555527 in main () at main.cpp:9
9           *ptr = 20;  // 访问已释放的内存
(gdb) bt
#0  0x0000555555555527 in main () at main.cpp:9
#1  0x00007ffff7dc36860 in __libc_start_main (main=0x5555555554e0 <main>, argc=1, argv=0x7fffffffdde8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffddea) at ../csu/libc-start.c:270

La trace de la pile indique que le crash se produit sur la ligne 9, qui tente d'accéder à la mémoire libérée. En examinant les lignes précédentes du programme, nous pouvons identifier l'erreur de gestion de la mémoire qui a provoqué le crash.

Autres conseils

  • Utilisez un outil de débogage de mémoire tel que Valgrind ou AddressSanitizer pour détecter les erreurs de mémoire.
  • Utilisez un outil de couverture de code (tel que gcov) pour identifier les chemins de code qui n'ont pas été exécutés.
  • Utilisez les points d'arrêt et la journalisation pour affiner progressivement la source des plantages.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn