46 votes

Débogage des Pratiques Exemplaires pour C++ STL/Boost avec gdb

Débogage à l'aide de gdb, tout code c++ qui utilise la STL/boost est toujours un cauchemar. Quelqu'un qui a utilisé gdb avec STL sait. Par exemple, voir les exemples de pistes de certaines sessions de débogage de code ici.

Je suis en train de réduire la douleur causée par la collecte de conseils. Pouvez-vous s'il vous plaît commenter sur les conseils que j'ai recueillis ci-dessous (en particulier ceux qui vous avez été en utilisant et toutes les modifications que vous recommanderiez) - j'ai listé les conseils est l'ordre décroissant de leur technicité.

  • Est ce que quelqu'un à l'aide de "Stanford GDB STL utils" et "l'ICU GDB utils"? Est-il une telle utils pour stimuler les structures de données? Le utils ci-dessus ne semblent pas être utilisable de manière récursive, par exemple pour l'impression de vecteur d'un boost::shared_ptr de façon lisible à l'intérieur d'une seule commande.
  • Écrivez votre .gdbinit fichier. Inclure, par exemple, C++ liées beautifiers, listés sur le bas de l'ICU GDB utils.
  • Utilisation vérifié/debug STL/Boost bibliothèque, comme STLport.
  • Utilisation de la journalisation (par exemple comme décrit ici)

Mise à jour: GDB a un nouveau C++ branche.

15voto

timday Points 14860

Peut-être pas le genre de "conseil" que tu cherchais, mais je dois dire que mon expérience après quelques années de passer de C++ ET STL du C++ & boost & TSL, c'est que j'ai maintenant passer beaucoup moins de temps dans GDB que j'ai utilisé. J'ai mis cela à un certain nombre de choses:

  • boost des pointeurs intelligents (en particulier "pointeur partagé", et le pointeur de conteneurs lorsque la performance est nécessaire). Je ne me souviens pas la dernière fois que j'ai eu à écrire explicitement supprimer (delete est le "goto" de C++ à mon humble avis). Il se passe beaucoup de GDB temps à traquer les invalides et la fuite des pointeurs.
  • boost est plein de prouvé le code pour des choses que vous auriez probablement hack ensemble une version inférieure de l'autre. e.g boost::bimap est idéal pour le modèle commun de la LRU, la mise en cache de la logique. Il y va de l'autre tas de GDB temps.
  • L'adoption de unittesting. boost::tests'AUTO macros dire que c'est une absolue doddle à définir des situations de test (plus facile que de CppUnit). Cet attrape beaucoup de choses longtemps avant qu'il soit construit dans tout ce que vous pourriez avoir à attacher un débogueur.
  • À ce propos, des outils comme boost::bind faciliter la conception en vue du test. e.g les algorithmes peuvent être plus générique et moins liés avec les types qu'ils opèrent, ce qui fait de brancher test cales/proxy/objets fantaisie etc plus facile (et le fait que l'exposition à de boost modèle tasticness vous encourager à "oser" modèle des choses que vous n'auriez jamais considéré comme avant, en produisant des analyses similaires avantages).
  • boost::array. "C matrice de performance", avec plage de vérification dans les versions de débogage.
  • boost est plein de code qui vous ne pouvez pas aider mais pour apprendre de

5voto

Mr.Ree Points 5112

3voto

jpalecek Points 31928

Je pense que la méthode la plus simple et la plus option est d'utiliser la journalisation (bien que j'en fait utiliser debug imprime, mais je pense que ce n'est pas un point). Le plus grand avantage est que vous pouvez inspecter tout type de données, de nombreuses fois par l'exécution du programme et ensuite qu'il recherche avec un éditeur de texte pour rechercher des données intéressantes. Notez que c'est très rapide. L'inconvénient, c'est évident, vous devez présélectionner les données que vous souhaitez enregistrer et les lieux où le journal. Cependant, ce n'est pas un grave problème, car il suffit de savoir où dans le code de mauvaises choses se produisent (et si non, il suffit d'ajouter des contrôles d'intégrité, ici et là, et ensuite, vous savez).

Vérifié/bibliothèques de débogage sont bons, mais ils sont mieux comme un outil de test (par exemple. exécuter et voir si je fais quelque chose de mal), et pas aussi bien le débogage d'un problème spécifique. Ils ne peuvent pas détecter une faille dans le code de l'utilisateur.

Sinon, j'utilise de la plaine de GDB. Il n'est pas si mauvais que cela puisse paraître, bien qu'il puisse être si vous êtes effrayés par "print x" impression d'une page-écran de la camelote. Mais, si vous avez des informations de débogage, des choses comme l'impression d'un membre d'un std::vector de travail et si quelque chose échoue, vous pouvez toujours inspecter le raw de la mémoire par l' x commande. Mais si je sais ce que je cherche, j'ai utiliser l'option 1 - l'exploitation forestière.

Notez que le "difficiles à inspecter" les structures ne sont pas seulement STL/Boost, mais aussi d'autres bibliothèques, comme Qt/KDE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X