2012-02-14 64 views
2

我正在使用valgrind來調試通過dlopen使用可加載庫的二進制文件。 在debian stable上,stacktrace不包含可加載庫中調用的符號。在valgrind stacktrace中缺少符號

| | ->11.55% (114,688B) 0x769492C: ??? 
| | | ->11.55% (114,688B) 0x7697289: ??? 
| | | ->11.55% (114,688B) 0x769806F: ??? 
| | |  ->11.55% (114,688B) 0x419812: myfunc (main.c:1010) 

Valgrind對debian unstable工作正常,符號得到妥善解決。所以我開始尋找什麼是不同的。 我有這些包在兩個系統上(的valgrind從不穩定的更新爲3.7):

ii valgrind      1:3.7.0-1+b1 
ii libtool      2.2.6b-2 
ii gcc       4:4.4.5-1 
ii binutils      2.20.1-16 

的lib未剝離,包含debuginfo軟:

ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x33ffd210859178c15bb3923c5491e1a1b6065015, not stripped 

更仔細地觀察我注意到的大小圖書館是不同的,在Debian不穩定的lib稍大。將它們與readelf進行比較,調試信息的大小更大。

[26] .debug_aranges PROGBITS  0000000000000000 00a74c 000090 00  0 0 1 
    [27] .debug_pubnames PROGBITS  0000000000000000 00a7dc 000385 00  0 0 1 
    [28] .debug_info  PROGBITS  0000000000000000 00ab61 00512f 00  0 0 1 
    [29] .debug_abbrev  PROGBITS  0000000000000000 00fc90 0006e2 00  0 0 1 
    [30] .debug_line  PROGBITS  0000000000000000 010372 002314 00  0 0 1 
    [31] .debug_str  PROGBITS  0000000000000000 012686 0019d3 01 MS 0 0 1 
    [32] .debug_loc  PROGBITS  0000000000000000 014059 000f24 00  0 0 1 
    [33] .debug_macinfo PROGBITS  0000000000000000 014f7d 179082 00  0 0 1 
    [34] .debug_ranges  PROGBITS  0000000000000000 18dfff 000060 00  0 0 1 

這讓我覺得debian stable上構建的二進制文件中的調試信息部分缺少一些東西。現在我的問題是:爲什麼和如何是二進制不同?構建中使用的工具(gcc,libtool,binutils)是相同的,包括編譯器/鏈接器標誌和命令(我在make的輸出中使用diff進行檢查)。

更新: 的DEBUG_INFO部分大小差異來自源文件的完整路徑存儲有作爲與積家是不同的事實。在unstable/stable上也有不同的openssl版本,它們在debug_info部分添加了一些不同的符號。因此,debug_info大小有所不同。

運行在調試模式(-d -v -v)的valgrind表明,在兩種情況下,可加載的lib讀取符號:

--19837-- Reading syms from /usr/lib/myplugin.so (0x6c62000) 
+0

Make的輸出有什麼不同?是否有可能穩定的二進制文件被部分刪除?我不確定在這種情況下'file'會顯示什麼,但'strip'有很多選項,包括(我相信)只能去除調試信息的功能。 – 2012-02-14 21:20:43

+0

make的輸出沒有區別,除了基本路徑(不同的主目錄)。帶不被稱爲。 debug_ *部分在兩個版本中都有,只是大小有所不同。 – b0ti 2012-02-14 21:56:06

回答

8

如果使用dlopen可裝載庫,有機會,它在程序終止之前被卸載。因此Valgrind無法解析其符號。儘量避免在此庫上調用dlclose。有關更多信息,請參閱http://valgrind.org/docs/manual/faq.html#faq.unhelpful

+0

該死的,現在我記得我在一年多前遇到過這個問題。我甚至有一個配置選項爲此禁用清理,它調用dlclose,這是沒有設置有問題的機器上。另一方面,它被啓用。感謝您的提醒! – b0ti 2012-02-15 17:00:30

+5

如果你不能改變你正在調試的二進制文件,並且仍然希望你的.so文件的符號能被valgrind使用LD_PRELOAD =/path/to/lib.so – serine 2013-02-07 14:55:44