对于C/C++源文件中的任何元素,我希望能够确定其已编译可执行文件中的相应内存位置。使用调试进行编译,并使用生成的DWARF信息可以大大帮助实现这一目标,但仍达不到我的目标。 GCC似乎仅使用行号生成DWARF .debug_line信息,而将列号保留为0!对我来说,DWARF规范允许指定列号似乎很奇怪,但是GCC似乎没有生成它们。

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

这是一段简单的代码,用于演示DWARF中缺少列号的情况:

int f(int x)
{
    x = 0; x++;
    return x;
}

使用以下命令进行编译:
gcc -g -c test.c

然后使用以下命令查看DWARF信息:
dwarfdump -l test.o

这是输出:
.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

最佳答案

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

10-08 20:00