12

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

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 中找到类似的任何内容。

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

有任何想法吗?谢谢!

4

5 回答 5

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)
于 2008-11-26T22:16:37.170 回答
4

您可以使用 p (*it)->second

于 2010-01-28T20:14:36.223 回答
2

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

于 2009-05-08T01:29:08.060 回答
2

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

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

于 2013-01-18T12:34:45.517 回答
1

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

编辑:等等,litb 的帖子似乎表明 gcc 确实支持 *. 奇怪,我总是发现这不起作用!

于 2008-11-26T22:16:52.430 回答