我有一个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中找到类似的内容。
我完全愿意拥有一个传递对象类型的函数,但是我也无法让它工作。
有什么想法吗? 谢谢!
答案 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确实支持*上的运算符重载。很奇怪,我总觉得那不起作用!