我有一个类似的问题,比如这个问题 GDB 损坏的堆栈帧 - 如何调试?,如下所示:
(gdb) bt
#0 0x76bd6978 in fputs () from /lib/libc.so.6
#1 0x0000b080 in getfunction1 ()
#2 0x0000b080 in getfunction1 ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
克里斯·多德(Chris Dodd(写了一个答案,将堆栈的顶部指向程序计数器(PC(。在 32 位机器中,它应该是
(gdb) set $pc = *(void **)$esp
(gdb) set $esp = $esp + 4
但是,运行第一行后,我得到了invalid cast
:
(gdb) set $pc = *(void **)$esp
Invalid cast.
(gdb) set $esp = $esp + 4
Argument to arithmetic operation not a number or boolean.
为什么我会收到此消息?我怎样才能找到解决方法来确定崩溃发生的位置?我在一台带有Linux的armv7机器上工作。
ESP 在 ARM 中不存在。它是MSP(主堆栈指针(或PSP(堆栈指针(。
ARM 寄存器
由于 ESP 不存在,这就是您获得无效转换的原因。如果使用另一个有效的 ARM 寄存器执行相同的命令,则不会出错