12 votes

Affichage des itérateurs STL déréférencés dans gdb

J'ai un itérateur vers un élément de carte, et je voudrais que gdb me montre les valeurs du "premier" et du "deuxième" élément de cet itérateur. Par exemple, je voudrais que gdb me montre les valeurs du premier et du deuxième élément de l'itérateur :

std::map<int,double> aMap;
...fill map...
std::map<int,double>::const_iterator p = aMap.begin();

Je peux utiliser p.first et p.second dans le code, mais je ne peux pas les voir dans gdb. Pour ce que ça vaut, dans dbx on pourrait faire quelque chose comme "print p.node.second_", mais je ne trouve rien de similaire dans gbd.

Je suis tout à fait disposé à avoir une fonction dans laquelle je passe les types d'objets, mais je n'ai pas réussi à faire fonctionner cela non plus.

Des idées ? Merci de votre compréhension.

18voto

Voici comment je procède :

This GDB was configured as "i686-pc-linux-gnu"...
(gdb) list
1       #include <iostream>
2       #include <map>
3
4       int main()
5       {
6           std::map<int, int> a;
7           a[10] = 9;
8           std::map<int, int>::iterator it = a.begin();
9           ++it;
10      }
(gdb) b test.cpp:9
Breakpoint 1 at 0x8048942: file test.cpp, line 9.
(gdb) r
Starting program: /home/js/cpp/a.out

Breakpoint 1, main () at test.cpp:9
9           ++it;
(gdb) set print pretty on
(gdb) p it
$1 = {
  _M_node = 0x94fa008
}
(gdb) p *it
$2 = (class std::pair<const int, int> &) @0x94fa018: {
  first = 10,
  second = 9
}
(gdb)

4voto

Raj Points 11

Vous pouvez utiliser p (*it)->second

2voto

Teng Lin Points 54

Vous pouvez essayer Archer C++ est une branche de développement de gdb dédiée à l'amélioration de l'expérience de débogage en C++. Cliquez sur aquí pour voir la démo de pretty printer for C++. Ce nouveau projet permet également de contrôler gdb avec python script. Le développeur principal, Tom Tromey Il a écrit plusieurs blogs sur ce projet enthousiasmant.

2voto

Shrey Joshi Points 371

Je sais que c'est une vieille question, mais je pense que j'ai trouvé la "meilleure" réponse à ce jour. En cherchant, je suis tombé sur un fichier .gdbinit qui déréférence très bien les types stl. Il y a apparemment plusieurs versions de ce fichier qui circulent, mais c'est la plus récente que j'ai pu trouver :

http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt

1voto

coppro Points 10692

p sera un itérateur vers std::pair<const int, double> Donc, ce que vous voulez en fait, c'est p->first . Je ne pense pas que GDB gère bien les opérateurs surchargés. p. {un membre qui représente le pair objet} .first . Il y a Documentation Doxygen pour libstdc++, afin que vous puissiez déterminer le membre que vous voulez, dans ce cas, il semble que ce soit ((_Rb_tree_node<pair<const int, double> >*)(p._M_node))-> _M_value_field.first . Comme c'est assez verbeux, je vérifierais d'abord si la surcharge des opérateurs fonctionne (et non, je ne pense pas qu'il y ait quelque chose de plus simple ; désolé). Vous pourriez aussi essayer d'appeler explicitement les opérateurs, mais je ne pense pas que gcc puisse le faire non plus (par ex. it.operator*().first ).

EDIT : attendez, le post de litb semble montrer que gcc supporte les surcharges d'opérateurs sur *. C'est bizarre, j'ai toujours trouvé que ça ne marchait pas !

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