在gdb中显示解除引用的STL迭代器

时间:2008-11-26 22:03:20

标签: c++ stl iterator gdb dbx

我有一个map元素的迭代器,我希望gdb向我展示迭代器的“first”和“second”元素的值。 例如:

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

我可以在代码中使用p.first和p.second,但是在gdb中看不到它们。对于它的价值,在dbx中可以执行类似“print p.node.second_”的操作,但我可以在gbd中找到类似的内容。

我完全愿意拥有一个传递对象类型的函数,但是我也无法让它工作。

有什么想法吗? 谢谢!

5 个答案:

答案 0 :(得分:18)

我是这样做的:

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)

答案 1 :(得分:4)

您可以使用p(* it) - &gt; second

答案 2 :(得分:2)

您可以尝试Archer,这是一个主要致力于改善C ++调试体验的gdb开发分支。单击here以查看适用于C ++的漂亮打印机的演示。 这个新项目还允许用python脚本控制gdb。主要开发人员Tom Tromey写了很多关于这个兴奋项目的博客。

答案 3 :(得分:2)

我意识到这是一个老问题,但我认为我已经找到了“最好的”答案。在搜索时,我遇到了一个.gdbinit文件,它很好地解除了对stl类型的引用。显然有很多版本的这种浮动,但这是我能找到的最新版本:

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

答案 4 :(得分:1)

p将成为std::pair<const int, double>的迭代器,因此您真正想要的是p->first。我不认为GDB能够很好地处理重载运算符,因此您可能希望p. {代表pair对象的某个成员} .first。 libstdc ++有Doxygen documentation,所以你可以找出你想要的成员,在这种情况下它看起来是((_Rb_tree_node<pair<const int, double> >*)(p._M_node))-> _M_value_field.first。因为这非常冗长,我会检查操作符重载是否先工作(不,我认为没有更简单的事情;抱歉)。您也可以尝试显式调用运算符,但我不认为gcc也可以这样做(例如it.operator*().first)。

编辑:等等,litb的帖子似乎表明gcc确实支持*上的运算符重载。很奇怪,我总觉得那不起作用!