Meilleure exploration des variables lors du débogage du code C ++ avec Eclipse / CDT

En utilisant Eclipse et CDT pour déboguer le code C ++, les fenêtres variables sont lourdes et peu informatives pour les types définis dans la bibliothèque de modèles standard ou dans boost (par exemple, shared_ptr).

Juste un exemple comment cela peut ressembler à un std :: vector:

bar {...} std::_Vector_base<TSample, std::allocator<TSample > > _M_impl {...} std::allocator<TSample > {...} _M_start 0x00007ffff7fb5010 _M_finish 0x00007ffff7fd4410 _M_end_of_storage 0x00007ffff7fd5010 

Même si ces informations sur les types internes de ces types peuvent être utiles, dans presque tous les cas, je m’attendrais à une présentation plus claire ici, à savoir une liste de valeurs pour le std :: vector. Existe-t-il des outils, des plugins ou d’autres modifications permettant de faire cela?

MODIFIER

Les solutions suivantes ne fonctionnent pas pour Linux. J’utilise Ubuntu 14.04, eclipse, g ++, gdb.

Je ne trouve pas de paquet gdb-python et linux n’utilise pas mingw

Vous avez besoin d’une version de GDB capable d’utiliser python pour créer de jolies structures d’impression. Je sais au moins sur Windows en utilisant mingw que cela n’est pas fourni dans l’installation par défaut.

Pretty Printers sont des modules Python qui indiquent à gdb comment afficher une structure donnée. Vous pouvez écrire le vôtre, mais il existe déjà des imprimantes pour STL à télécharger.

Pour que les jolies imprimantes fonctionnent sous Windows (les instructions doivent être similaires pour les autres systèmes d’exploitation):

Conditions préalables

Installation:

  • Ouvrez une commande Shell et tapez:

     mingw-get install gdb-python 
  • Lorsque sa finit cd dans un répertoire local et installez les imprimantes en tapant:

     svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python 
  • Ouvrez le fichier .gdbinit (créez-le si nécessaire dans un éditeur de texte) et tapez ce qui suit en remplaçant “C: / directory” par le dossier dans lequel vous avez vérifié les imprimantes.

    Python
    import sys
    sys.path.insert (0, ‘C: / répertoire’)
    à partir de libstdcxx.v6.printers import register_libstdcxx_printers
    register_libstdcxx_printers (Aucun)
    fin

Configuration Eclipse

  • Aller à Windows> Préférences> C / C ++> Debug> GDB
  • Où le débogueur GDB indique-t-il que le chemin d’access au GDB activé par python se trouvera probablement dans le dossier mingw / bin avec un nom comme gdb-python27.exe?
  • Là où il est dit Fichier de commandes GDB, placez le chemin vers le fichier d’initialisation .gdb que vous avez créé précédemment.

Ça y est, déboguer comme d’habitude, les structures stl doivent être beaucoup plus faciles à lire.

Eh bien, gdb ne supporte pas nativement les conteneurs STL. Vous ne pouvez pas dire que c’est incorrect, car cela exposera le fonctionnement interne des objects STL, mais la plupart du temps ce n’est pas ce que nous voulons, n’est-ce pas?

Si vous utilisez gdb 7.0, vous pouvez tirer parti des jolies imprimantes. Ce site Web http://sourceware.org/gdb/wiki/STLSupport propose un didacticiel assez simple sur la façon de les définir. J’ai copié ci-dessous la partie qui vous intéresse:

  1. Découvrez les dernières imprimantes Python libstdc ++ à un emplacement sur votre machine. Dans un répertoire local, faites:

      svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python 
  2. Ajoutez ce qui suit à votre ~ / .gdbinit. Le chemin doit correspondre à l’endroit où le module python ci-dessus a été extrait. Donc, si vous vous connectez à: / home / maude / gdb_printers /, le chemin sera comme écrit dans l’exemple:

      python import sys sys.path.insert(0, '/home/maude/gdb_printers/python') from libstdcxx.v6.printers import register_libstdcxx_printers register_libstdcxx_printers (None) end 

Le chemin doit être le seul élément à ajuster dans l’exemple ci-dessus. Une fois chargées, les classes STL sockets en charge par les imprimantes doivent être imprimées dans un format plus lisible. Pour imprimer les classes dans l’ancien style, utilisez le commutateur / r (raw) dans la commande print (print / r foo). Cela imprimera les classes comme si les jolies imprimantes Python n’étaient pas chargées.

Puisque vous utilisez eclipse cdt, n’oubliez pas de pointer votre configuration de débogage vers votre fichier .gdbinit. Lors de la création d’une nouvelle configuration de débogage, accédez à l’onglet Débogueur et placez le chemin d’access au fichier .gdbinit dans le champ “Fichier de commandes GDB”.

J’espère que ça aide!

Dans la vue de débogage de la liste des variables, développez le vecteur:

"vector_name" -> std::_Vector_base< "datatype"> -> _M_impl

puis _M_start clic droit sur _M_start et sélectionnez “Afficher en tant que tableau …”, tapez sa longueur, puis cliquez sur OK. Vous pouvez maintenant développer chaque élément de votre vecteur.

Si vous avez le support de gdb pour CDT (voir, par exemple, GDB dans Eclipse ), vous pouvez essayer ceci: Dé-référencer les conteneurs STL

Il y a longtemps, je suis également tombé sur votre même problème. C’était pénible de vérifier les conteneurs STL. Ensuite, j’ai trouvé ce lien et ajouté à mon fichier .gdbinit certaines de ces définitions. La vie était plus facile après cela.

REMARQUE: ma version gdb est 7.1 et l’ajout de ces définitions fonctionne correctement. Je ne sais pas si dans les nouvelles versions de gdb ils sont déjà inclus.

Je voudrais développer la réponse de Windows 7 car certaines étapes clés sont omises:

Ceci est pour les utilisateurs MinGW avec Eclipse CDT

0) Si vous ne possédez pas python GDB, ouvrez un shell / commande et utilisez MinGW-get.exe pour “installer” GDB compatible Python, par exemple

  MinGw-get.exe install gdb-python 

1a) Obtenez Python 2.7.x à partir de http://python.org/download/ et installez

1b) Assurez-vous que PYTHONPATH et PYTHONHOME sont définis dans votre environnement:

  PYTHONPATH should be C:\Python27\Lib (or similar) PYTHONHOME should be C:\Python27 

1c) Ajoutez PYTHONHOME à votre PATH

  %PYTHONHOME%;... 

2a) Ouvrez un texte, entrez les instructions suivantes. Notez que la 3ème ligne pointe vers l’emplacement des scripts Python. Voir les notes ci-dessous à ce sujet!

 python import sys sys.path.insert(0, 'C:/MinGW/share/gcc-4.6.1/python') from libstdcxx.v6.printers import register_libstdcxx_printers register_libstdcxx_printers (None) end 

2b) Enregistrer sous “.gdbinit” REMARQUE: L’explorateur Windows ne vous laissera pas nommer un fichier qui commence par un sharepoint l’explorateur. La plupart des modifications de texte (y compris le Bloc-notes) vous le permettront. Les fichiers d’initialisation GDB sont comme des «scripts» de commandes GDB que GBD exécutera lors du chargement.

2c) Le fichier ‘.gdbinit’ doit se trouver dans le répertoire de travail de GDB (il s’agit très probablement du répertoire racine de vos projets mais votre IDE peut vous le dire.

3) Ouvrez votre boîte de dialog Préférences Eclipse (ou un autre IDE). Accédez au sous-menu C ++ Debugger.

4) Configurez Eclipse pour utiliser C:\MinGW\bin\gdb-python27.exe comme débogueur et votre .gdbinit comme fichier de configuration.

5a) Recréez toutes vos configurations de lancement de débogage (supprimez l’ancienne et créez-en une nouvelle).

 --OR-- 

5b) Editez chaque configuration de débogage et pointez-le vers le nouveau fichier gdb-python.exe ET pointez-le vers le fichier.

Si vous rencontrez des problèmes:

–N’oubliez pas de changer l’emplacement dans le répertoire python dans le code python ci-dessus! Ce répertoire est créé par MinGW, alors ne cherchez pas à télécharger les jolies imprimantes, MinGW l’a fait pour vous à l’étape zéro. Il suffit d’aller sur votre directeur d’installation MinGW, le dossier de partage, le dossier GCC (a le numéro de version) et vous trouverez le dossier python. Cet emplacement est ce qui devrait être dans le script python chargé par GDB.

– De même, le .gdbinit est un PITA, assurez-vous qu’il est correctement nommé et dans le dossier de travail de GDB qui n’est pas nécessairement celui où se trouve gdb-python.exe! Regardez votre sortie GDB lors du chargement de GDB pour voir si a) ‘python-enabled’ apparaît pendant le chargement et que les instructions dans le .gdbinit apparaissent.

– Finalement, j’ai eu beaucoup de problèmes avec les variables système. Si python vous donne “ImportError”, vous n’avez probablement pas défini PYTHONPATH ou PYTHONHOME.

–Le répertoire avec ‘gdb-python27’ (par exemple C: \ MinGW \ bin ‘) devrait également se trouver sur votre chemin et, si tel est le cas, il est plus facile de configurer eclipse car vous n’avez pas besoin de mettre des chemins absolus . Mais encore, parfois le .gbdinit a besoin d’un chemin d’absoulte. Si cela fonctionne, vous verrez la sortie de gbd (console-> traces de gdb) comme ceci au démarrage du débogueur:

 835,059 4^done 835,059 (gdb) 835,059 5-enable-pretty-printing 835,069 5^done .... 835,129 12^done 835,129 (gdb) 835,129 13source C:\MinGW\bin\.gdbinit 835,139 &"source C:\\MinGW\\bin\\.gdbinit\n" 835,142 13^done 835,142 (gdb) 

Je sais que JDT (environnement Java en éclipse) fournit des “formateurs” personnalisés à appliquer lors de l’affichage des valeurs de variables dans les vues de débogage. Un rapide coup d’oeil à Google pour la même chose dans CDT apporte cette page:

http://wiki.eclipse.org/CDT/Better_Debugging_%28GSoC_project%29

Je ne sais pas si cela a été encore intégré dans la ligne principale CDT, peut-être que vous pouvez essayer de faire un clic droit sur une variable lors du débogage (dans le dernier CDT) et voir s’il existe une entrée formater personnalisée. Si non disponible, je vous recommande d’append une nouvelle entrée de suivi dans le tracker CDT pour demander cette amélioration.