如何在无法确定堆栈帧大小的情况下使用gdb进行回溯?

Gau*_*nha 3 gdb

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

  1. 我可以从list命令输出中找出导致崩溃的行或发生崩溃的位置吗?
  2. 如何处理它否则.我应该将heuristic-fence-post设置为什么来获取一些有意义的数据.我尝试将其设置为0但没有运气.

(gdb)bt

0 0x00e67a24 ?? ()

警告:GDB无法在0xe67a24找到函数的开头.

GDB is unable to find the start of the function at 0xe67a24
Run Code Online (Sandbox Code Playgroud)

因此无法确定该函数的堆栈帧的大小.这意味着GDB可能无法访问该堆栈帧或其下方的帧.此问题很可能是由无效的程序计数器或堆栈指针引起的.但是,如果您认为GDB应该只是从0xe67a24向后搜索看起来像函数开头的代码,则可以使用`set heuristic-fence-post'命令增加搜索范围.(GDB)

Pau*_*ien 7

当我看到这个问题时,通常可以使用的解决方法是命令:

x/100a $ sp

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

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

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