检索变量值的"操作数"DW_OP_fbreg未按预期工作?



设置:我正在调试一个简单的C++程序,使用选项-fno-omit-frame-pointer编译,使用DWARF 5的libwarf。主要工作是使用 libdwarf 编写调试器。

对于特定的局部变量,矮转储显示:

DW_AT_location len 0x0002: 915C: DW_OP_fbreg -36

在下文中,我将把'-36'称为'op1',这是我从libdwarf得到的。


问题:使用 op1 直接导致变量值不正确。 (fb指针是帧基指针的当前值(。

int32_t data = (int32_t) ptrace(PTRACE_PEEKDATA, processPid, fbPointer + op1, 0);

我还尝试将 -36 解码为 sleb128 和 usleb128,对于两者,我都得到了 220。不是一个好的价值。

试验/错误表明,如果我将 16 添加到 op1,它将适用于任意数量的 int 变量作为参数和局部对象。但是,它不适用于浮点/双精度。


问题:到处提到的 -36 是变量与基于帧的指针的偏移量吗?如果是这样,我做错了什么? DW_AT_location中的上述值是什么:"len 0x0002: 915c:"?如果它们在评估 op1 中很重要,我如何通过 libdwart 获取它们?

谢谢。我已经一个多星期了,我被困在这一点上。

似乎DW_OP_fbreg是对 DWARF 寄存器的引用,在这种情况下是 16 字节的偏差。也就是说,我们需要将 16 添加到 RBP(真正的寄存器(中,然后添加 -36。最后,在这种情况下,-36 不知何故是一个普通数字,而不是编码的 sleb128。

最新更新