首页 > 解决方案 > gdb false 可以重新创建帧的寄存器吗?

问题描述

我正在分析我的应用程序的核心转储,当我转到第 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 = -1
(gdb) print &myVar
Address requested for identifier "myVar" which is in register $eax

标签: cx86gdb

解决方案


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

不仅可能,而且目前.

GDB 在调用堆栈中向上/向下时不恢复寄存器,除了$EBPand$ESP$EIP(有时$EBX)。

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

GDB 一直以来都是这样,在汇编级别进行调试的人知道如何从堆栈中“钓”出正确的值。


推荐阅读