使用 DWARF 库显示每个程序函数的高低 PC

Showing high and low PC of every program functions using DWARF library

我正在努力使这段代码工作:https://github.com/eliben/code-for-blog/blob/master/2011/dwarf_get_func_addr.c 它摘自 Eli Bendersky 在 http://eli.thegreenplace.net/2011/02/07/how-debuggers-work-part-3-debugging-information 上制作的教程 不幸的是,low pc 和 high pc return 几乎每个函数的地址总是相同的:

DW_TAG_subprogram: 'aFunctionName'

low pc  : 0x00000001
high pc : 0x7f3a00000001

而如果 objdump --dwarf=decodedline ./lulesh_normal >> dump_dwarf.txt 给我:

File name                            Line number    Starting address
lulesh.cc                                   1297            0x402e00

lulesh.cc                                   1297            0x402e11
lulesh.cc                                   1299            0x402ee4
lulesh.cc                                   1300            0x402ef0
lulesh.cc                                   1301            0x402ef6
lulesh.cc                                   1299            0x402f00
[...]

所以它设法 link 行和地址但没有找到函数的真实地址。 知道为什么吗?

感谢您的帮助,

dwarf_get_func_addr.c 中的代码至少有一个错误:它假设每个函数都有 DW_AT_low_pcDW_AT_high_pc 属性,如果不是这样,将打印未初始化的值。

您应该在第 42 行初始化 lowpc = highpc = -1;,以免打印未初始化的值。

除此之外,如果无法访问您的 lulesh_normal 二进制文件,就不可能为您提供帮助。

您应该执行 readelf -wi lulesh_normal,然后在调试器中逐步执行 list_func_in_die,并将程序在那里读取的内容与 readelf 的输出进行比较——它们应该匹配一个到一个。如果他们不这样做,您的 libdwarf 版本可能有问题。