DWARF 行表中的源列号

mas*_*son 5 c debugging gcc dwarf

对于 C/C++ 源文件中的任何元素,我希望能够确定其编译的可执行文件中相应的内存位置。使用调试进行编译,并使用生成的 DWARF 信息对此大有帮助,但离我的目标还差得很远。GCC 似乎只生成行号的 DWARF .debug_line 信息,列号为 0!DWARF 规范允许指定列号对我来说似乎很奇怪,但 GCC 似乎没有生成它们。

有什么我遗漏的 - 也许是一些配置或命令行参数让 GCC 知道我想要我的调试信息中的列?或者也许有一种完全不同的方式来实现我的目标?

下面是一段简单的代码来演示 DWARF 中缺少列号:

int f(int x)
{
    x = 0; x++;
    return x;
}
Run Code Online (Sandbox Code Playgroud)

编译这个:

gcc -g -c test.c
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令查看 DWARF 信息:

dwarfdump -l test.o
Run Code Online (Sandbox Code Playgroud)

这是输出:

.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
0x00000000  [   2, 0] NS uri: "test.c"
0x00000007  [   3, 0] NS
0x00000012  [   4, 0] NS
0x00000015  [   5, 0] NS
0x00000017  [   5, 0] NS ET
Run Code Online (Sandbox Code Playgroud)

Tom*_*mey 5

GCC 不会在 DWARF 中发出列号。这是可以做到的,但没有人提供补丁来做到这一点。如果您感兴趣,GCC 的 DWARF 生成代码(几乎)都在 gcc/dwarf2out.c 中。

  • 只是注意到最近的 GCC 确实发出了一定量的列信息。 (4认同)