我正在尝试修改的一个 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/