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

时间:2013-09-27 17:49:08

标签: gdb

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

  1. 我可以找出导致崩溃的行或发生崩溃的地方 list命令输出?
  2. 如何处理它。我该怎样设置启发式栅栏帖子来获取一些 有意义的数据我尝试将其设置为0但没有运气。
  3. (gdb)bt

    0 0x00e67a24 ?? ()

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

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

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

2 个答案:

答案 0 :(得分:7)

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

  

x / 100a $ sp

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

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

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

答案 1 :(得分:0)

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