使用 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_pc
和 DW_AT_high_pc
属性,如果不是这样,将打印未初始化的值。
您应该在第 42 行初始化 lowpc = highpc = -1;
,以免打印未初始化的值。
除此之外,如果无法访问您的 lulesh_normal
二进制文件,就不可能为您提供帮助。
您应该执行 readelf -wi lulesh_normal
,然后在调试器中逐步执行 list_func_in_die
,并将程序在那里读取的内容与 readelf
的输出进行比较——它们应该匹配一个到一个。如果他们不这样做,您的 libdwarf
版本可能有问题。
我正在努力使这段代码工作: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_pc
和 DW_AT_high_pc
属性,如果不是这样,将打印未初始化的值。
您应该在第 42 行初始化 lowpc = highpc = -1;
,以免打印未初始化的值。
除此之外,如果无法访问您的 lulesh_normal
二进制文件,就不可能为您提供帮助。
您应该执行 readelf -wi lulesh_normal
,然后在调试器中逐步执行 list_func_in_die
,并将程序在那里读取的内容与 readelf
的输出进行比较——它们应该匹配一个到一个。如果他们不这样做,您的 libdwarf
版本可能有问题。