我正在编写对其他程序进行一些相当复杂的静态分析和动态跟踪的软件。该程序使用大量静态 DWARF 信息来协助跟踪,包括.debug_line
DWARF 部分的行/列信息。为了使该程序具有我们需要的准确性,它必须具有细粒度且准确的行号和列号信息才能填充到 DWARF 调试信息中。使用clang
I 可以强制使用-g -Xclang -dwarf-column-info
选项一起填充行和列信息。
但是,在某些情况下,clang 无法生成足够细粒度的列信息。一个特定的例子是 forfor
循环。以下面的示例程序为例,我将其称为source01.c
:
1
2 int main ()
3 {
4 int number1 = 10, number2 = 20;
5 for (int i=0; i < 10; ++i) {
6 number1++;
7 number2++;
8 }
9 return 0;
10 }
我可以像这样编译它:
clang -g -Xclang -dwarf-column-info source01.c
生成可执行文件a.out
。然后我dwarfdump
用来检查行/列信息是如何填充的:
dwarfdump a.out > dwarf_info
查看该.debug_line
部分,我看到了此可执行文件的调试信息中包含的所有行/列对:
.debug_line: line number info for a single cu
Source lines (from CU-DIE at .debug_info offset 0x0000000b):
<pc> [row,col] NS BB ET PE EB IS= DI= uri: "filepath"
NS new statement, BB new basic block, ET end of text sequence
PE prologue end, EB epilogue begin
IA=val ISA number, DI=val discriminator value
0x004004f0 [ 3, 0] NS uri: "/xxx/loop_01/source01.c"
0x004004fb [ 4, 5] NS PE
0x00400509 [ 5,10] NS
0x0040051d [ 6, 9] NS
0x00400528 [ 7, 9] NS
0x00400533 [ 5,27] NS
0x00400548 [ 9, 5] NS
0x0040054a [ 9, 5] NS ET
如您所见,有对应于 的对 (5,10) 和对应于int i=0;
的对 (5,27) ++i
。但是,我希望(并且需要)还有一对 (5,19),它对应于i < 10
,但它不存在。我已经检查了可执行文件的指令objdump
,并确认确实有与比较相对应的指令i < 10
(因此,它并没有被简单地“优化掉”)。
您对为什么 clang 不会填充此信息有任何直觉吗?或者有没有办法强制clang
产生更细粒度的列信息?似乎clang
应该具有这种能力,因为clang
生成的 AST 在其自身与源代码行和列之间具有极其细粒度的映射。
谢谢你。