C gdb false可以重新创建帧的寄存器吗?

C gdb false可以重新创建帧的寄存器吗?,c,x86,gdb,C,X86,Gdb,我正在分析我的应用程序的核心转储,当我转到第1帧时,我打印存储在EAX中的变量值。Gdb打印值,若该值为真,程序将不会调用紧急反汇编,它会比较来自寄存器的值,所以并没有其他线程可以更改它。我调用了info reg,指令指针的另一部分为第0帧和第1帧提供了相同的结果。 Gdb是否可能在第1帧中显示第0帧的寄存器EAX的值 编辑: 代码如下所示: switch(myVar){ case -1: break; default: panic(); } g

我正在分析我的应用程序的核心转储,当我转到第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
Gdb是否可能在第1帧中显示第0帧的寄存器EAX的值

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

除了$EBP和$ESP、$EIP和有时$EBX之外,GDB在调用堆栈中上下移动时不恢复寄存器

可以说,这让人困惑,因为在帧之间导航时,无法看到未还原寄存器的实际值

GDB一直都是这样的,在程序集级别进行调试的人知道如何从堆栈中获取正确的值

Gdb是否可能在第1帧中显示第0帧的寄存器EAX的值

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

除了$EBP和$ESP、$EIP和有时$EBX之外,GDB在调用堆栈中上下移动时不恢复寄存器

可以说,这让人困惑,因为在帧之间导航时,无法看到未还原寄存器的实际值


GDB一直都是这样,在程序集级别进行调试的人知道如何从堆栈中获取正确的值。

当你说第1帧时,你的意思是你正在查看函数调用第1帧吗?是的,第0帧是第1帧myfunc@ThomasJager:帧1与GDB的帧1命令相同,实际当前RIP位置的直接父级。当您说第1帧时,您的意思是您正在查看函数调用第1帧吗?是的,第0帧是第1帧myfunc@ThomasJager:帧1与GDB的帧1命令相同,实际当前RIP位置的直接父级。当它打印错误的本地RIP值时,肯定会引起混淆variables@jbulatek局部变量不应受此影响。如果可以的话,我建议您提交一份bugzilla报告。奇怪的是,InfoLocal没有返回结果,而myVar是在myFunc中声明的。也许这是优化的结果。@jbulatek:这就是为什么gcc-O0在语句之间保留所有变量的部分原因:。我认为调试信息甚至能够在寄存器中找到命名变量都是新的,IIRC GDB在我之前尝试过的时候总是说优化了。我查找了反汇编myFunc,myVar被分配了另一个函数的返回值,它也是myFunc的返回值,所以没有理由将它存储在内存中。我无法在我的机器上复制它,然后我的产品再次使用一些用不寻常的标记构建的旧编译器。当它打印错误的本地值时,肯定会令人困惑variables@jbulatek局部变量不应受此影响。如果可以的话,我建议您提交一份bugzilla报告。奇怪的是,InfoLocal没有返回结果,而myVar是在myFunc中声明的。也许这是优化的结果。@jbulatek:这就是为什么gcc-O0在语句之间保留所有变量的部分原因:。我认为调试信息甚至能够在寄存器中找到命名变量都是新的,IIRC GDB在我之前尝试过的时候总是说优化了。我查找了反汇编myFunc,myVar被分配了另一个函数的返回值,它也是myFunc的返回值,所以没有理由将它存储在内存中。我无法在我的机器上复制它,然后我的产品再次使用一些用不寻常的标志构建的旧编译器