2017-09-12 48 views
0

我试图让这段代码的工作显示的每个程序功能高低PC:https://github.com/eliben/code-for-blog/blob/master/2011/dwarf_get_func_addr.c 它是由礼Bendersky做一个教程提取上http://eli.thegreenplace.net/2011/02/07/how-debuggers-work-part-3-debugging-information 不幸的是,PC的低和高的PC回报始终是相同的解决了几乎所有的功能:使用DWARF库

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 
[...] 

因此,它设法链接线路和地址,但不能找到功能的真实地址。 任何想法为什么?

感谢你的帮助,

回答

1

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可能是越野车。