我正在分析应用程序的核心转储,当我转到帧 #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 从 ~永远 开始就是这样,在程序集级别调试的人知道如何从堆栈中"钓鱼"正确的值。