C++ 在gdb中显示取消引用的STL迭代器

C++ 在gdb中显示取消引用的STL迭代器,c++,stl,iterator,gdb,dbx,C++,Stl,Iterator,Gdb,Dbx,我有一个映射元素的迭代器,我希望gdb向我显示该迭代器的“第一个”和“第二个”元素的值。 例如: std::map<int,double> aMap; ...fill map... std::map<int,double>::const_iterator p = aMap.begin(); std::map-aMap; …填充地图。。。 std::map::const_迭代器p=aMap.begin(); 我可以在代码中使用p.first和p.second,但在gdb

我有一个映射元素的迭代器,我希望gdb向我显示该迭代器的“第一个”和“第二个”元素的值。 例如:

std::map<int,double> aMap;
...fill map...
std::map<int,double>::const_iterator p = aMap.begin();
std::map-aMap;
…填充地图。。。
std::map::const_迭代器p=aMap.begin();
我可以在代码中使用p.first和p.second,但在gdb中看不到它们。值得一提的是,在dbx中可以执行类似于“printp.node.second_2;”的操作,但我可以在gbd中找到任何类似的操作

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

有什么想法吗? 谢谢

我是这样做的:

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)
此GDB配置为“i686 pc linux gnu”。。。
(gdb)清单
1#包括
2#包括
3.
4 int main()
5       {
6标准::地图a;
7a[10]=9;
8 std::map::iterator it=a.begin();
9++it;
10      }
(gdb)b测试。cpp:9
断点1位于0x8048942:文件test.cpp,第9行。
(gdb)r
启动程序:/home/js/cpp/a.out
test.cpp:9处的断点1,main()
9++it;
(gdb)将打印设置为打开状态
(gdb)p it
$1 = {
_M_节点=0x94fa008
}
(gdb)p*it
$2=(类std::pair&@0x94fa018:{
第一个=10,
秒=9
}
(gdb)

p
将是
std::pair
的迭代器,因此您实际需要的是
p->first
。不过,我认为GDB不能很好地处理重载运算符,因此您可能需要
p.
{一些表示
对象}
的成员。libstdc++有一个函数,因此您可以计算出您想要的成员,在本例中,它看起来是
(((\u-Rb\u-tree\u-node*)(p.\u-M\u-node))->\u-M\u-value\u字段。首先
。因为这非常冗长,我会先检查操作符重载是否有效(不,我认为没有更简单的方法;对不起)。您也可以尝试显式调用操作符,但我认为gcc也不能这样做(例如,
it.operator*()。first

编辑:等等,litb的帖子似乎表明gcc确实支持*上的运算符重载。奇怪的是,我总是发现这不管用

>您可以尝试,GDB开发分支主要致力于改进C++调试体验。点击查看C++的漂亮打印机演示。
这个新项目还允许使用python脚本控制gdb。主要开发者写了很多关于这个激动人心的项目的博客

你可以用p(*it)->第二

我意识到这是一个老问题,但我想我已经找到了最好的答案。在四处搜索时,我发现了一个.gdbinit文件,它可以很好地解除stl类型的引用。显然有很多版本都有,但这是我能找到的最新版本:


*此处失败。可能是库、编译器和/或gdb的版本控制问题(或者可能是缺少调试选项)。对我来说,*如果我使用[10]=9填充映射,它就可以工作,但如果我使用a.insert(std::pair(10,9))填充映射,它就不能工作。这对我来说似乎很奇怪…一旦你打印了这些,你怎么能在它们里面走其他的结构(假设你的地图包含指向其他东西的指针)?对成对来说很有趣,但是列表(向量等)呢?这是我发现的最有帮助的答案,用于实际访问成对的第一或第二部分中复杂时间的内容。