2017-09-12 148 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可能是越野車。