GDB 打印内容:const set<Int4> & var_name

gdb to print contents of: const set<Int4> & var_name

本文关键字:Int4 gt var name lt GDB const set 打印      更新时间:2023-10-16

我正在尝试修改的C 代码的包装包(不是我的,这既大且可被解释(调用了使用此参数的几种C 方法:

const set<Int4> & var_name

该程序的命令行参数应具有2147483647和2的设置值。似乎表明它们在那里,但是到目前为止,没有运气在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中做到这一点?

Traceback (most recent call last): ...

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

可能有几个原因:

  • 更新libstdc++时,您没有更新libstdc++-dbg(或实际属于/usr/share/gdb/python/libstdcxx/v6/printers.py的任何软件包(。
  • 您根本不使用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}