En utilisant Eclipse et CDT pour déboguer du 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 à quoi cela peut ressembler pour un std :: vector:
bar {...}
std::_Vector_base<TSample<MyTraits>, std::allocator<TSample<MyTraits> > >
_M_impl {...}
std::allocator<TSample<MyTraits> > {...}
_M_start 0x00007ffff7fb5010
_M_finish 0x00007ffff7fd4410
_M_end_of_storage 0x00007ffff7fd5010
Même si ces informations sur les éléments internes de ces types peuvent être utiles, dans presque tous les cas, je m'attendrais à une présentation plus claire ici, c'est-à-dire une liste de valeurs pour le vecteur std ::. Existe-t-il des outils, plugins ou autres modifications autour desquels cela peut être fait?
MODIFIER
Les solutions suivantes ne fonctionnent pas pour Linux. J'utilise ubuntu 14.04, Eclipse, g ++, gdb.
Je ne peux pas trouver un paquet gdb-python et linux n'utilise pas mingw
Vous avez besoin d'une version de GDB capable d'utiliser python pour de jolies structures d'impression. Je sais au moins sur les fenêtres utilisant mingw que cela n'est pas fourni dans l'installation par défaut.
Les jolies imprimantes sont des modules python qui indiquent à gdb comment afficher une structure donnée. Vous pouvez écrire la vôtre, mais il existe déjà des imprimantes pour STL disponibles en téléchargement.
Pour faire fonctionner Pretty Printers sous Windows (les instructions doivent être similaires pour les autres systèmes d'exploitation):
Prérequis
Assurez-vous que vous disposez de Python 2.7 installé et dans le chemin d'accès système.
Assurez-vous que MinGW-get est installé
http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/
Assurez-vous d'avoir un client SVN installé
Installation:
Ouvrez un shell de commande et tapez:
mingw-get install gdb-python
Une fois son cd terminé 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 .gdbinit (créez-le dans un éditeur de texte si nécessaire) et tapez ce qui suit en remplaçant "C:/directory" par le dossier dans lequel vous avez archivé les imprimantes.
Python
import sys
sys.path.insert (0, 'C:/répertoire')
de libstdcxx.v6.printers importent register_libstdcxx_printers
register_libstdcxx_printers (Aucun)
fin
Configuration Eclipse
Voilà, déboguer comme d'habitude, les structures stl devraient être beaucoup plus faciles à lire.
Eh bien, gdb ne prend pas en charge nativement les conteneurs STL. Vous ne pouvez pas dire que c'est incorrect, car cela exposera le fonctionnement interne des objets STL, mais la plupart du temps ce n'est pas ce que nous voulons, non?
Si vous utilisez gdb 7.0, vous pouvez profiter des jolies imprimantes. Ce site Web http://sourceware.org/gdb/wiki/STLSupport a un tutoriel assez simple sur la façon de les configurer. J'ai copié ci-dessous la partie qui vous intéresse:
Récupérez 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
Ajoutez ce qui suit à votre ~/.gdbinit. Le chemin doit correspondre à l'endroit où le module python ci-dessus a été extrait. Donc, s'il est extrait vers:/home/maude/gdb_printers /, le chemin serait 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 prises en charge par les imprimantes doivent être imprimées dans un format plus lisible par l'homme. Pour imprimer les classes dans l'ancien style, utilisez le commutateur/r (raw) dans la commande print (c'est-à-dire 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 mettez le chemin d'accès au fichier .gdbinit dans le champ "Fichier de commande GDB".
J'espère que ça aide!
Dans la vue de débogage dans la liste des variables, développez le vecteur:
"vector_name"
-> std::_Vector_base<"datatype">
-> _M_impl
puis faites un clic droit sur _M_start
et sélectionnez "Afficher en tant que tableau ...", saisissez sa longueur, puis cliquez sur OK. Vous pouvez maintenant développer chaque élément de votre vecteur.
Si vous avez gdb
support 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 .gdbinit
fichier certaines de ces définitions. La vie était plus facile après ça.
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
elles sont déjà incluses.
Je voudrais développer la réponse de Windows 7 car certaines étapes clés sont omises:
0) Si vous n'avez pas python GDB, ouvrez un shell/commande et utilisez MinGW-get.exe pour `` installer '' GDB compatible Python, par ex.
MinGw-get.exe install gdb-python
1a) Obtenez Python 2.7.x 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 CHEMIN
%PYTHONHOME%;...
2a) Ouvrez un texte, entrez les instructions suivantes. Remarquez que la 3e ligne pointe vers où se trouvent les 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: Windows Explorer ne vous permettra pas de nommer un fichier commençant par un point de l'Explorateur. La plupart des modifications de texte (y compris le Bloc-notes) vous le permettent. Les fichiers d'initialisation GDB sont comme des "scripts" de commandes GDB que GBD exécutera lors du chargement.
2c) Le fichier '.gdbinit' doit être dans le répertoire de travail de GDB (très probablement c'est le répertoire racine de vos projets mais votre IDE peut vous le dire).
3) Ouvrez votre boîte de dialogue Préférences Eclipse (ou 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 une nouvelle à partir de zéro).
--OR--
5b) Modifiez chaque configuration de débogage et pointez-la vers le nouveau gdb-python.exe ET pointez-la vers le.
--N'oubliez pas de changer l'emplacement dans le répertoire python dans le code python! Ce répertoire est créé par MinGW, alors n'allez pas cherchant à télécharger les jolies imprimantes, MinGW l'a fait pour vous à l'étape zéro. Allez simplement dans votre directeur d'installation MinGW, le dossier de partage, le dossier GCC (a le numéro de version) et vous trouverez python Cet emplacement est ce qui devrait être dans le script python chargé par GDB.
- De plus, le .gdbinit est un PITA, assurez-vous qu'il est nommé correctement et dans le dossier de travail de GDB qui n'est pas nécessairement 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.
- Enfin, j'ai eu beaucoup de problèmes avec les variables système. Si python vous donne 'ImportError', alors vous n'avez probablement pas défini PYTHONPATH ou PYTHONHOME.
- Le répertoire avec 'gdb-python27' (par exemple C:\MinGW\bin ') devrait également être sur votre chemin et si c'est le cas, cela rend la configuration d'Eclipse un peu plus agréable car vous n'avez pas besoin de mettre des chemins absolus . Mais quand même, le .gbdinit a parfois besoin d'un chemin absoulte. si cela fonctionne, vous verrez la sortie de gbd (traces console-> 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 dans Eclipse) fournit des "formateurs" personnalisés à appliquer lors de l'affichage des valeurs variables dans les vues de débogage. Un rapide coup d'œil à google pour le même dans CDT apporte cette page:
http://wiki.Eclipse.org/CDT/Better_Debugging_%28GSoC_project%29
Je ne sais pas si cela a encore été intégré dans la ligne principale du CDT, peut-être pouvez-vous essayer de cliquer avec le bouton droit sur une variable pendant le débogage (dans le dernier CDT) et voir s'il y a une entrée de formateur personnalisé. S'il n'est pas disponible, je vous recommande d'ajouter une nouvelle entrée de tracker dans le tracker CDT pour demander cette amélioration.