我正在分析应用程序的核心转储,当我转到第1帧时,我打印存储在EAX中的变量的值。 Gdb打印值,如果为true,则程序不会调用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
答案 0 :(得分:5)
是否有可能在第1帧时Gdb显示第0帧的EAX寄存器的值?
不仅可能,而且目前是。
除了$EBP
,$ESP
和$EIP
(有时是$EBX
)以外,在调用堆栈中上移/下移时,GDB不会恢复寄存器。
可以说这是令人困惑的(在帧之间导航时,您看不到未还原的寄存器的实际值)。
GDB一直以来都是这样,并且在汇编级进行调试的人员都知道如何从堆栈中“获取”正确的值。