【问题标题】:Debugging with gdb showing segfault in question marks function "?? ()"使用 gdb 进行调试,在问号函数“?? ()”中显示段错误
【发布时间】:2014-05-07 11:29:58
【问题描述】:

我一直在尝试使用 gdb 调试段错误,但它显示“?? ()”步骤中出现错误,我无法弄清楚其含义。任何人都可以提示这是什么意思?

相关的回溯贴在下面。

(gdb) run
> (list-partition gt3 (quote (1 2 3 4 5)))

Program received signal SIGSEGV, Segmentation fault. 0xb7d900ac in ?? () from /lib/i386-linux-gnu/libc.so.6 

(gdb) bt 10
#0  0xb7d900ac in ?? () from /lib/i386-linux-gnu/libc.so.6
#1  0xb7d92dec in malloc () from /lib/i386-linux-gnu/libc.so.6
#2  0xb7f8d627 in operator new(unsigned int) ()    from /usr/lib/i386-linux-gnu/libstdc++.so.6
#3  0xb7f727d4 in std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#4  0xb7f74a48 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) ()    from /usr/lib/i386-linux-gnu/libstdc++.so.6
#5  0xb7f74bb6 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) ()    from /usr/lib/i386-linux-gnu/libstdc++.so.6
#6  0x080527fa in SymbolCell::get_symbol (this=0x80641e0) at SymbolCell.cpp:63
#7  0x080524c2 in SymbolCell::get_value (this=0x80641e0) at SymbolCell.cpp:88
#8  0x08053c20 in ConsCell::get_value (this=0x8064190) at ConsCell.cpp:195
#9  0x0804f287 in eval_pure (c=0x8064190) at eval_util.cpp:683 (More stack frames follow...)

还有一点值得注意的是,程序实际上运行了几秒钟才产生这个bug,这在程序的行为上下文中是相当不正常的。

感谢任何建议!提前致谢!

【问题讨论】:

  • 你的等级太低了。往上走几帧,你会看到问题从SymbolCell::get_symbol 开始。专注于此,因为 malloc 和您的操作系统不是罪魁祸首!
  • 看看这里:stackoverflow.com/questions/1441017/… 可能您的堆已损坏。对于 ??,它只是意味着没有链接到调试信息来查找地址 0xb7d900ac 处的函数名称
  • @LightnessRacesinOrbit 谢谢!肯定是我的程序有问题,而不是我知道的库。

标签: c++ gdb segmentation-fault


【解决方案1】:

??() 表示 gdb 找不到符号信息。对于您的问题,这不是必需的,因为堆栈已经在库代码中很深,并且 string/new/malloc 已经过很好的测试。从SymbolCell::get_symbol 中的第 6 帧开始查找问题。

edit:我刚刚注意到您实际上正在运行 lisp 代码,因此您可能遇到了 lisp 环境的一些问题,或者更有可能是内存不足。

【讨论】:

  • 感谢您的回答。它实际上是我编写的一个 mini-Scheme 解释器。您能否详细说明导致内存不足的环境可能存在的问题?这可能是导致该错误的一个原因,因为 SymbolCell::get_symbol 只返回通常运行良好的 std::string(char* symbol_m)(数据成员)。
  • 我在想可能是某种无限循环,这通常会耗尽你的堆栈,但在 malloc 中崩溃暗示可能出现内存不足的情况。我在想你可以联系那些 lisp 的人,但由于它是你的解释器,你可能需要做一些挖掘工作。无论如何,正如 Lightness 和我所建议的那样,问题可能不在 c/c++ 库中。
  • 内存分配失败很少,但不是永远,段错误。
  • @LightnessRacesinOrbit:当大量小分配完成耗尽malloc使用的一些资源时,也不是吗?我建议基于调试堆栈,因为大多数崩溃是在释放时看到的。话虽如此,这也可能是先前的损坏导致意外发生崩溃的结果。
  • @stefaanv 那是我的猜测
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2014-05-08
  • 1970-01-01
  • 2013-12-28
相关资源
最近更新 更多