我正在努力使这段代码有效: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上制作的教程中提取的 不幸的是,低pc和高pc返回几乎每个函数的地址总是相同的:
DW_TAG_subprogram: 'aFunctionName'
low pc : 0x00000001
high pc : 0x7f3a00000001
而如果objdump --dwarf = codedline ./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
[...]
因此它设法链接线路和地址,但没有找到功能的真实地址。 知道为什么吗?
感谢您的帮助,
答案 0 :(得分:1)
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
版本可能会出错。