1
5
你已经回答了几乎所有你自己的问题;只缺两样东西。
首先,将文件名/行号与程序计数器之间的关系编码为
其次,变量不是
词法块应该与地址范围相关联,但可以使用
为了说明手头的案例,我编译了以下内容
...并用“readelf-w”来解码侏儒。第14行显示在行号表中:
这意味着我们对地址0x8感兴趣。模具层次结构包括
0xb3处的DIE不包含任何其他词法块,因此它表示地址0x8处的最紧范围。因此,此时,名称“b”必须指0xc4处的模具子级。此变量的类型由
编辑:
在您自己的回答中,您给出了一个mplayer的反例,其中有没有相应地址范围的词法块。这种侏儒不符合标准:侏儒2的§3.4规定,词汇块条目具有DW_AT_low_pc和DW_AT_high_pc属性,并且没有暗示这些属性是可选的。假设您使用的是gcc,则可能出现此错误的原因是“
DWARF debug info for inlined lexical blocks missing range
“。默认的mplayer配置包括-O2优化,它打开内联;您将在父级中看到这一点。”
|
2
1
以下是的输出
正如您在偏移处看到的
该块是for块。还有更多类似的lexical\u块实例。 我的解决方案由两部分组成: 1) 源代码分析: 查找访问目标变量的范围(左大括号和右大括号周围)。实际上,我们只需要存储左大括号的行号。
在作用域树中查找作用域的级别(该树显示与中类似的父/子关系
此时,我们有了与变量访问相对应的范围的起始行,以及范围树中的范围级别(例如,原始问题中描述的代码中的第12行和第2级)。 2) DebugInfo分析: 现在,我们可以分析适当的CU并查找该目标变量的声明。重要的一点是,只有行号小于访问点行号的声明才有效。考虑到这一点,我们可以搜索全球范围,并继续进行更深层次的排序。 范围大于访问范围的声明无效。与目标变量作用域相同的声明只有在其行号介于目标作用域的起始行和变量访问的行号之间时才有效。 |
Community wiki · C中有哪些耗时的操作? 1 年前 |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |