gdb打印以下内容:const set <int4>和var_name

时间:2019-05-17 22:56:15

标签: c++ gdb

我试图修改的C ++代码包(不是我的,这东西既大又难以理解)使用此参数调用了几种C ++方法:

const set<Int4> & var_name

使用命令行参数调用该程序,该命令行参数应具有2147483647和2的设置值。size()方法 似乎表明它们已经存在了,但是到目前为止,还没有运气在gdb中再次将它们释放出来。

(gdb) p tax_ids.size()
$13 = 2
(gdb) p tax_ids
$14 = std::set with 2 elementsTraceback (most recent call last):
  File "/usr/lib64/../share/gdb/python/libstdcxx/v6/printers.py", line 405, in next
    item = item.cast(self.type).dereference()['_M_value_field']
RuntimeError: There is no member or method named _M_value_field.
(gdb)  p *tax_ids
No symbol "operator*" in current context.

不幸的是,最终提取值的地方是作为一堆嵌套的定义实现的,因此很难确切看到正在发生什么。可以肯定的是,尽管它所做的只是使用var_name.begin()或某种类似的方法来创建迭代器,然后重复解引用迭代器以提取每个迭代器增量的整数值。在gdb中有什么方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

  

Traceback (most recent call last): ...

此错误表明您的系统上/usr/share/gdb/python/libstdcxx/v6/...中安装的GDB STL漂亮打印机与您实际使用的libstdc++的版本不匹配。

可能有几个原因:

  • 更新libstdc++-dbg时,您没有更新/usr/share/gdb/python/libstdcxx/v6/printers.py(或任何包libstdc++实际属于的包)。
  • 您根本没有使用libstdc++(也许您正在使用libc++并使用Clang进行构建)

适当的修复将取决于根本原因,并且您的问题中没有足够的信息。您必须自己挖一点。

作为参考,当STL漂亮打印机和libstdc ++匹配时,输出如下所示:

$ cat t.cc
#include <set>

size_t fn(const std::set<int>& foo)
{
  return foo.size();
}

int main()
{
  const std::set<int> foo = { 3, 7 };
  return fn(foo);
}

$ g++ -g t.cc && gdb -q ./a.out

(gdb) b fn
Breakpoint 1 at 0xa86: file t.cc, line 5.
(gdb) run
Starting program: /tmp/a.out

Breakpoint 1, fn (foo=std::set with 2 elements = {...}) at t.cc:5
5     return foo.size();
(gdb) p foo
$1 = std::set with 2 elements = {[0] = 3, [1] = 7}