【问题标题】:Displaying dereferenced STL iterators in gdb在 gdb 中显示取消引用的 STL 迭代器
【发布时间】:2010-09-24 06:04:10
【问题描述】:

我有一个映射元素的迭代器,我希望 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 中找到类似的内容。

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

有什么想法吗? 谢谢!

【问题讨论】:

    标签: c++ stl iterator gdb dbx


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是我找到的最有用的答案,可用于实际访问该对的第一部分或第二部分中复杂时间的内容。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        编辑:等等,litb 的帖子似乎表明 gcc 确实支持 *.很奇怪,我总觉得这行不通!

        【讨论】:

        • *这里失败了。可能是库、编译器和/或 gdb 的版本控制问题(或者可能是缺少调试选项)。
        • 对我来说,如果我使用 a[10]=9 填充地图,*它可以工作,但如果我使用 a.insert(std::pair(10,9))。这对我来说似乎很奇怪......
        【解决方案5】:

        这是我的做法:

        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)
        

        【讨论】:

        • 一旦你打印了这些,你怎么能在其中行走其他结构(假设你的地图包含指向其他东西的指针)?
        • 有趣的是对,但是列表(向量等)呢?
        猜你喜欢
        • 1970-01-01
        • 2011-05-02
        • 1970-01-01
        • 2012-07-20
        • 2020-08-25
        • 2015-01-13
        • 1970-01-01
        • 2015-09-26
        • 2012-07-11
        相关资源
        最近更新 更多