L'affichage déréférencé STL itérateurs dans gdb
J'ai un itérateur à un élément de la carte, et je voudrais gdb pour me montrer les valeurs de la "première" et "deuxième" éléments de l'itérateur.
Par exemple:
std::map<int,double> aMap;
...fill map...
std::map<int,double>::const_iterator p = aMap.begin();
Je peux utiliser p.premier et p.deuxième dans le code, mais ne peut pas les voir dans gdb. Pour ce que ça vaut, dans dbx on pourrait faire quelque chose comme "print p.nœud.second_", mais je peux trouver quelque chose de semblable dans l'étude de la cmm.
Je suis totalement disposé à avoir une fonction dans laquelle je passe les types d'objet, mais je n'ai pas pu obtenir que le travail soit.
Des idées?
Merci!
OriginalL'auteur kchoose2 | 2008-11-26
Vous devez vous connecter pour publier un commentaire.
Voici comment je le fais:
+1 pour le "jeu de imprimer joli sur"
Intéressant pour les paires, mais ce que sur les listes (vecteurs, etc.)?
OriginalL'auteur Johannes Schaub - litb
Vous pouvez utiliser p (*)->second
OriginalL'auteur Raj
Vous pouvez essayer Archer, un gdb branche de développement est principalement consacré à l'amélioration du C++ expérience de débogage. Cliquez sur ici pour voir la démo de jolies imprimante pour le C++.
Ce nouveau projet permet également un contrôle de gdb avec un script python. Le développeur principal, Tom Tromey, a écrit tout un quelques blogs excité à propos de ce projet.
OriginalL'auteur Teng Lin
Je me rends compte que c'est une vieille question, mais je crois que j'ai trouvé la "meilleure" réponse pour l'instant. En recherche, je suis tombé sur une .gdbinit fichier déréférence les types stl très bien. Il y a apparemment plusieurs versions de cette flottant autour, mais c'est le plus récent que j'ai pu trouver:
http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt
OriginalL'auteur spuriousdata
p
sera un itérateur pourstd::pair<const int, double>
, donc ce que vous voulez vraiment estp->first
. Je ne pense pas que GDB poignées opérateurs surchargés bien, alors vous voudrez probablementp.
{certains membre qui représente lepair
objet}.first
. Il est La documentation Doxygen pour libstdc++, de sorte que vous pouvez comprendre ce membre que vous souhaitez, dans ce cas, il semble être((_Rb_tree_node<pair<const int, double> >*)(p._M_node))-> _M_value_field.first
. Parce que c'est assez détaillé, je voudrais vérifier pour voir si la surcharge d'opérateur travaille d'abord (et non, je ne pense pas qu'il n'y a rien de plus simple, désolé). Vous pourriez également essayer d'appeler explicitement les opérateurs, mais je ne pense pas que gcc pouvez le faire soit (par exemple,it.operator*().first
).EDIT: attendez, litb post semble montrer que gcc prend en charge la surcharge de l'opérateur *. Bizarre, j'ai toujours trouvé que cela ne fonctionnait pas!
*il échoue ici. Peut-être les problèmes de version avec la bibliothèque, le compilateur, et/ou de gdb (ou peut-être un manque de débogage option).
Pour moi, il fonctionne si j'ai rempli la carte à l'aide d'un[10]=9, mais pas si j'ai rempli la carte à l'aide d'un.insert(std::pair<int,int>(10,9)). Cela semble très étrange pour moi...
OriginalL'auteur coppro