当gdb无法确定堆栈帧大小时,如何使用gdb获取回溯信息?

4

我遇到了一个核心问题,但无法从中获取回溯信息。我有两个问题。

  1. 我能否从list命令输出中找到导致崩溃的行或崩溃发生的位置?
  2. 否则该如何处理?我应将heuristic-fence-post设置为什么值以获得一些有意义的数据。我尝试将其设置为0,但没有成功。

(gdb) bt

0 0x00e67a24 in ?? ()

警告:GDB找不到0xe67a24处函数的起始位置。

GDB is unable to find the start of the function at 0xe67a24

因此无法确定该函数的堆栈帧大小。 这意味着GDB可能无法访问该堆栈帧或其下面的帧。 该问题最可能是由于无效的程序计数器或堆栈指针引起的。 但是,如果您认为GDB应该仅搜索更远处的代码,以查找类似于函数开头的内容,则可以使用“set heuristic-fence-post”命令扩大搜索范围。 (gdb)


你能获取寄存器信息吗? - kumar_m_kiran
@kumar_m_kiran,是的,我可以获取注册信息。 - SeattleOrBayArea
2个回答

9
我通常遇到这个问题时的解决方法是使用以下命令:

x/100a $sp

这将显示带有符号的堆栈,最近的部分可能包含在回溯中。它仍然无法找到当前的实际堆栈帧,但应该能够找到带有符号的最近堆栈帧。
根据目标体系结构,$sp 可能需要替换为其他东西 - 任何充当堆栈指针的寄存器。
我经常看到 gdb 无法找到调用堆栈的最常见情况是在 OpenGL 驱动程序崩溃时,因为它们不使用预期的 ARM ABI 调用约定。

1
我遇到了同样的错误,结果发现这是一个不同问题的症状:我没有向gdb提供文件,因此它无法构建符号表。通过使用gdb filename而不是仅使用gdb来启动它也可以解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接