gdb false 可以重新创建框架的寄存器吗?
Can gdb false recreate frame's registers?
我正在分析我的应用程序的核心转储,当我转到第 1 帧时,我打印了存储在 EAX 中的变量值。 Gdb 打印值,如果它是真的程序不会调用恐慌(反汇编显示,它比较寄存器中的值,所以没有其他线程可以更改它)。我调用了 info reg
并且部分指令指针为帧 #0 和 #1 提供了相同的结果。
Gdb 是否有可能在帧 #1 中显示帧 #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
(gdb) print &myVar
Address requested for identifier "myVar" which is in register $eax
Is it possible, that Gdb shows value of register EAX for frame #0 when in frame #1?
不仅可能,而且目前是。
GDB 在调用堆栈中递增/递减时不会恢复寄存器,除了 $EBP
和 $ESP
和 $EIP
(有时 $EBX
)。
可以说这是令人困惑的(当您在帧之间导航时,您看不到未恢复寄存器的实际值)。
GDB 一直以来都是如此,在汇编级别进行调试的人知道如何从堆栈中“获取”正确的值。
我正在分析我的应用程序的核心转储,当我转到第 1 帧时,我打印了存储在 EAX 中的变量值。 Gdb 打印值,如果它是真的程序不会调用恐慌(反汇编显示,它比较寄存器中的值,所以没有其他线程可以更改它)。我调用了 info reg
并且部分指令指针为帧 #0 和 #1 提供了相同的结果。
Gdb 是否有可能在帧 #1 中显示帧 #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
(gdb) print &myVar
Address requested for identifier "myVar" which is in register $eax
Is it possible, that Gdb shows value of register EAX for frame #0 when in frame #1?
不仅可能,而且目前是。
GDB 在调用堆栈中递增/递减时不会恢复寄存器,除了 $EBP
和 $ESP
和 $EIP
(有时 $EBX
)。
可以说这是令人困惑的(当您在帧之间导航时,您看不到未恢复寄存器的实际值)。
GDB 一直以来都是如此,在汇编级别进行调试的人知道如何从堆栈中“获取”正确的值。