我试图修改的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中有什么方法可以做到这一点?
答案 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}