设置:我正在调试一个使用选项-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获得它们?
非常感谢。我已经停留了一个多星期了。
答案 0 :(得分:0)
似乎DW_OP_fbreg是对DWARF寄存器的引用,在这种情况下,它减少了16个字节。也就是说,我们需要在RBP(实际寄存器)中加上16,然后在其上加上-36。最后,在这种情况下,-36是一个纯数字,而不是编码的sleb128。