gdb false 可以重新创建框架的寄存器吗?

标签 c x86 gdb

我正在分析我的应用程序的核心转储,当我转到第 1 帧时,我打印了存储在 EAX 中的变量值。 Gdb 打印值,如果它是真的程序不会调用 panic (反汇编显示,它比较寄存器中的值,所以没有其他线程可以更改它)。我调用了 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

最佳答案

Is it possible, that Gdb shows value of register EAX for frame #0 when in frame #1?

不仅可能,而且目前

GDB 在调用堆栈中递增/递减时不会恢复寄存器,除了 $EBP$ESP$EIP(和有时 $EBX)。

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

GDB 从 ~forever 开始就一直如此,在汇编级别进行调试的人知道如何从堆栈中“钓鱼”正确的值。

关于gdb false 可以重新创建框架的寄存器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62697912/

相关文章:

c - Opengl 翻译/旋转来自同一缓冲区的单个对象

c - 对于这个例子,函数 my_func 是否暴露给链接器?

performance - 可以使用哪些方法在现代x86上有效地扩展指令长度?

assembly - 访问损坏的共享库

c++ - 如何在GDB中解释backtrace的模板函数签名?

c - 为什么字符串字符在 'battle' 函数执行时没有改变?

汇编函数地址表和函数下或数据段中的数据

c++ - 从二进制文件中获取源文件(和位置)列表

c++ - 如何调试在gdb中触发内部错误的C++程序?

c - 分配给字符串数组