4

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

  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

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

4

2 回答 2

9

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

x/100a $sp

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

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

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

于 2013-09-28T18:49:09.277 回答
1

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

于 2018-11-01T12:34:00.237 回答