C++ 我如何处理DW_OP_call_frame_cfa

C++ 我如何处理DW_OP_call_frame_cfa,c++,linux,debugging,dwarf,C++,Linux,Debugging,Dwarf,我试图使用libdwarf计算正在运行的程序中局部变量的位置。我曾经能够通过执行DW_OP_fbreg来实现这一点,它最终将映射到一个寄存器,该寄存器将作为该函数的帧基。在较新的dwarf标准中,帧基是DW_OP_call_frame_cfa。我似乎找不到任何信息来告诉我如何执行DW_OP_call_frame_cfa并返回帧基位置。有很多关于CFA表以及谁恢复了哪些寄存器的引用,但我不知道如何获取这些信息以及如何应用这些信息。有人能填补空白吗?DW\u OP\u call\u frame\u

我试图使用libdwarf计算正在运行的程序中局部变量的位置。我曾经能够通过执行DW_OP_fbreg来实现这一点,它最终将映射到一个寄存器,该寄存器将作为该函数的帧基。在较新的dwarf标准中,帧基是DW_OP_call_frame_cfa。我似乎找不到任何信息来告诉我如何执行DW_OP_call_frame_cfa并返回帧基位置。有很多关于CFA表以及谁恢复了哪些寄存器的引用,但我不知道如何获取这些信息以及如何应用这些信息。有人能填补空白吗?

DW\u OP\u call\u frame\u cfa
意味着您必须使用调用帧信息来计算cfa;然后将其推到表达式堆栈上

有关此说明,请参见DWARF 4标准第6.4节(“呼叫帧信息”)。基本上,您现在必须阅读
.debug\u frame
部分,并根据6.4中描述的规则对其进行解码。这相当于为另一种小字节码语言编写另一个解释器;还有可能重用DWARF表达式解释器


该操作码基本上是DWARF中的空间优化。编译器已经发出了调用帧信息,这个操作码允许他们重用它来计算变量位置。

好的,这在原则上是有意义的。你能告诉我什么函数得到指令列表吗?我们有dwarf_loclist_n()和类似的位置表达式,但我似乎找不到CFA的等价物。它使用相同的DW_OP*操作常量吗?恐怕我不知道libdwarf API,所以我不能在那里提出任何建议。无论如何,不,它不使用DW_OP_*操作,除非CFA引用一个DWARF表达式(在某些情况下它可以)。@TomTromey“将其推到表达式堆栈上”是什么意思?DWARF表达式实现一个简单的堆栈机。各种操作可以在堆栈上推送值,也可以从此堆栈中弹出值
DW_OP_call_frame_cfa
就是这样一种将值推送到堆栈上的操作。