当 gdb 无法确定堆栈帧的大小时,如何使用它进行回溯



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

  1. 我可以找出导致崩溃的行或崩溃发生的位置吗列出命令输出?
  2. 否则如何处理。我应该设置什么启发式栅栏柱才能得到一些有意义的数据。我尝试将其设置为 0,但没有运气。

(GDB) 英国电信

0 0x00e67a24 在 ??()

警告:GDB 在0xe67a24找不到函数的开头。

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

因此无法确定该函数的堆栈帧的大小。这意味着 GDB 可能无法访问该堆栈帧,或者它下面的框架。 此问题很可能是由无效的程序计数器或堆栈指针。 但是,如果您认为GDB应该简单地搜索更远的地方从0xe67a24用于看起来像开头的代码功能,您可以使用"设置"增加搜索范围启发式栅栏哨所"命令。(分行)

当我看到此问题时,通常有效的解决方法是命令:

X/100A $sp

这将转储带有符号的堆栈,并且很可能在回溯的最近部分会在那里。它仍然找不到实际的当前堆栈帧,但应该找到带有符号的最新堆栈帧。

根据目标体系结构,$sp可能需要是其他东西 - 无论寄存器是堆栈指针。

我看到 gdb 找不到调用堆栈的最常见情况是 OpenGL 驱动程序崩溃,这些驱动程序不使用预期的 ARM ABI 调用约定。

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

最新更新