4

我的应用程序中的一些线程位于优化的函数中,当我调试应用程序时,gdb 无法从这些函数中回溯。但是我查看了汇编程序,并且可以通过执行以下操作手动将堆栈部分展开到前一个函数的框架:

set $old_ra = $ra
set $old_sp = $sp
set $ra = *(unsigned long*)($sp+28)
set $sp = $sp + 48
bt
set $ra = $old_ra
set $sp = $old_sp

如果我正在进行实时调试,这非常有效,并且它成功地显示了完整的回溯。在查看核心转储时,我希望能够离线执行相同的操作。显然,在核心转储中戳寄存器的概念是没有意义的,但是有没有办法告诉 gdb“只使用这个值作为寄存器”,这样我就可以做类似的回溯?

4

1 回答 1

3

不是开箱即用。我发现的唯一方法是物理修改核心文件。ELF 核心文件通常有一个或多个包含进程寄存器的“reg”部分。您只需要确定该部分的确切位置是您要更改的寄存器,然后编辑文件,将新值放在那里并重新运行 GDB。

于 2011-12-01T01:24:44.483 回答