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

时间:2018-08-24 20:27:20

标签: debugging

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

对于特定的局部变量,dwarfdump显示:

DW_AT_location len 0x0002:915c:DW_OP_fbreg -36

在下文中,我将从libdwarf中获得的“ -36”称为“ op1”。


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

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

我还尝试将-36解码为sleb128和usleb128,但我都得到了220。这不是一个好值。

试验/错误表明,如果我在op1中加16,它将适用于任意数量的int变量作为参数和局部对象。但是,它不适用于float / double。


问题:到处都提到-36是变量相对于基于帧的指针的偏移量吗?如果是这样,我在做什么错? DW_AT_location中的先前值是什么:“ len 0x0002:915c:”?如果它们对评估op1很重要,我如何通过libdwart获得它们?

非常感谢。我已经停留了一个多星期了。

1 个答案:

答案 0 :(得分:0)

似乎DW_OP_fbreg是对DWARF寄存器的引用,在这种情况下,它减少了16个字节。也就是说,我们需要在RBP(实际寄存器)中加上16,然后在其上加上-36。最后,在这种情况下,-36是一个纯数字,而不是编码的sleb128。