【发布时间】:2012-03-15 12:01:54
【问题描述】:
我想知道使用属性 DW_AT_location 进行调试。它是 dwarf 为调试指定的属性之一,但无法真正理解它究竟代表什么。以及当我们编译代码时应该何时发出这个属性。
【问题讨论】:
我想知道使用属性 DW_AT_location 进行调试。它是 dwarf 为调试指定的属性之一,但无法真正理解它究竟代表什么。以及当我们编译代码时应该何时发出这个属性。
【问题讨论】:
来自 DWARF 3 规范 (http://dwarfstd.org/doc/Dwarf3.pdf):
2.16 数据位置 描述数据对象的任何调试信息条目,包括变量、参数、公共块和 比如,可能有一个 DW_AT_location 属性,它的值是一个位置 描述(参见第 2.6 节)。
DW_AT_location 属性的值是一个位置表达式。位置表达式相当复杂,我建议您阅读上面引用的 DWARF 规范以了解更多信息。总之,位置表达式可以是带有变量位置的简单地址,也可以是调试器必须在运行时评估以确定变量位置的小程序。以下是 DWARF 规范中的一些示例位置表达式:
理想情况下,您的编译器应该为一个变量生成一个位置列表,描述其在程序中所有点的位置。通过寄存器跟踪变量的位置并非易事,这就是为什么一些编译器在生成调试信息时会禁用优化,例如将变量移动到寄存器中。
【讨论】:
请查看DWARF 3 spec 的第 7 章,数据表示。
例如,如果DW_AT_location的值为0x91 0x68,从第7章的表格中,我们可以知道0x91表示DWARF调试信息格式,即DW_OP_fbreg,0x68是SLEB128的偏移量,我们可以得到它的真实值值:-24。
【讨论】: