c语言 - gdb 可以错误地重新创建帧的寄存器吗?



我正在分析应用程序的核心转储,当我转到帧 #1 时,我打印存储在 EAX 中的变量的值。Gdb 打印值,如果是真的,程序不会调用 panic(反汇编显示,它比较寄存器的值,因此没有其他线程可以更改它(。我调用了info reg,除了指令指针之外,我为帧 #0 和 #1 提供了相同的结果。 是否有可能在帧 #1 中时 Gdb 显示帧 #0 的寄存器 EAX 值?

编辑: 代码如下所示:

switch(myVar){
case -1:
break;
default:
panic();
}

GDB 显示:

(gdb) bt
#0 panic()
#1 0x0891a3e9 in myFunc() at myFunc.c:10
(gdb) up
#1 0x0891a3e9 in myFunc() at myFunc.c:10
10    panic();
(gdb) print myVar
$1 = -1
(gdb) print &myVar
Address requested for identifier "myVar" which is in register $eax

是否有可能在帧 #1 中时 Gdb 显示帧 #0 的寄存器 EAX 值?

不仅可能,而且目前可能的。

GDB 在调用堆栈中升压/降压时不会恢复寄存器,除了$EBP$ESP$EIP(有时是$EBX(。

可以说这是令人困惑的(当您在帧之间导航时,您无法看到未恢复寄存器的实际值(。

GDB 从 ~永远 开始就是这样,在程序集级别调试的人知道如何从堆栈中"钓鱼"正确的值。

最新更新