【问题标题】:What do I do with DW_OP_call_frame_cfa我该如何处理 DW_OP_call_frame_cfa
【发布时间】:2015-10-12 00:17:43
【问题描述】:

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

【问题讨论】:

    标签: c++ linux debugging dwarf


    【解决方案1】:

    DW_OP_call_frame_cfa表示你必须使用调用帧信息来计算CFA;然后将其压入表达式堆栈。

    请参阅 DWARF 4 标准的第 6.4 节(“调用帧信息”)以获取对此的解释。本质上,您现在必须阅读.debug_frame 部分并根据6.4 中描述的规则对其进行解码。这相当于为另一种小字节码语言编写另一个解释器;并可能重用 DWARF 表达式解释器。

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

    【讨论】:

    • 好的,原则上说得通。你能告诉我什么函数得到指令列表吗?我们有 dwarf_loclist_n() 之类的位置表达式,但我似乎找不到 CFA 的等价物。是否使用相同的 DW_OP* 操作常量?
    • 恐怕我不知道 libdwarf API,所以我不能在那里提出任何建议。无论如何,不​​,它不使用 DW_OP_* 操作,除非 CFA 引用 DWARF 表达式(在某些情况下它可以)。
    • @TomTromey “将其推送到表达式堆栈”是什么意思?
    • DWARF 表达式实现了一个简单的堆栈机器。各种操作可能会将值压入堆栈,或从堆栈中弹出值。 DW_OP_call_frame_cfa 就是这样一种将值压入堆栈的操作。
    猜你喜欢
    • 1970-01-01
    • 2021-03-03
    • 2011-11-02
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多