c++ - gdb 打印 : const set<Int4> & var_name 的内容

标签 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 中有什么方法可以做到这一点吗?

最佳答案

Traceback (most recent call last): ...

此错误表明安装在 /usr/share/gdb/python/libstdcxx/v6/... 中的 GDB STL pretty-print 匹配您实际使用的 libstdc++ 版本。

可能有几个原因:

  • 当您更新了 libstdc++
  • 您根本没有使用 libstdc++(也许您正在使用 libc++ 并使用 Clang 构建)

适当的修复将取决于根本原因,而您的问题没有包含足够的信息。你必须自己挖掘一下。

作为引用,当 STL pretty-print 和 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}

关于c++ - gdb 打印 : const set<Int4> & var_name 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56194479/

相关文章:

c++ - 继承基于模板的数据结构有什么好处?

c - gdb 给出与 iofwrite.c 相关的错误

debugging - gdb打印不一致

gdb - 为 ESP32 和 QEMU 构建 GDB

c++ - 如何为流提供更好的异常消息?

c++ - Qt 包含哪些头文件?

c++ - 如何使用 gdb 调试使用 yasm 组装的代码?

android - 调试 native Android 代码

c++ - 没有缓冲区大小的 vswprintf() 在小缓冲区而不是 EOF 上崩溃。如何传递缓冲区大小

c++ - 如何创建一个线程传递指定对象的成员函数?