2015-12-22 44 views
1

我正在嘗試track downissue,其中Valgrind無法解析通過某些庫的函數的符號。我得到的輸出是這樣的:爲什麼GDB只有在碰到`main`時才能解析這個符號?爲什麼valgrind不能解決它?

==83597== 920 bytes in 1 blocks are possibly lost in loss record 750 of 864 
==83597== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==83597== by 0x548EF93: myproject_malloc (mysourcefile.c:48) 
==83597== by 0x4F13FD5: ??? (in /path/to/project/library-version.so) 
==83597== by 0x54542FF: ??? (in /path/to/project/library-version.so) 
==83597== by 0x4F536CA: ??? (in /path/to/project/library-version.so) 
==83597== by 0x54542FF: ??? (in /path/to/project/library-version.so) 

功能之一內library-version.sodo_init()library-version.so通過LD_PRELOAD加載。我發現當我在gdb下運行我的程序時,如果我在啓動程序時嘗試在do_init處設置斷點,它會抱怨找不到該符號,但如果我在main處放置斷點並等到它達到那個時間,然後它就起作用了。

例如:

(gdb) break do_init 
Function "do_init" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) n 
(gdb) break main 
Breakpoint 1 at 0x400b50: file runner.c, line 13. 
(gdb) run 
... a bunch of output from the stuff in LD_PRELOAD ... 
Breakpoint 1, main (argc=1, argv=0x7fffffffe028) at myprogram.c:13 
13  return do_some_stuff(); 
(gdb) break do_init 
Breakpoint 2 at 0x7ffff7658de0: file my/library/initializer.c, line 25. 

因此,這導致我兩個問題:

  1. 它似乎do_init是越來越由動態鏈接拉入。我怎樣才能找出發生的初始化過程的哪個步驟?這個項目中使用了許多庫,它們用__attribute__((constructor))定義函數,並且它們通過鏈接器腳本粘在一起。

  2. 爲什麼Valgrind看不到動態鏈接器加載的符號像GDB那樣?我99%確定沒有任何東西是dlclose'd,我認爲任何在LD_PRELOAD之下的東西都會對Valgrind保持可見,無論如何。

+0

@iharob其中?共享庫或二進制文件? –

+0

你是如何構建'library-version.so'的?它有調試符號嗎? –

+0

所有這些,是否有一個Makefile? –

回答

0

原來因爲一大堆正巧存在同時奇怪的配置選項,即包含在.text部的library-version.so程序節頭用rwx權限,而不是RX權限標記。 Valgrind認爲.text部分不能在amd64機器上擁有rwx權限,因此它會在嘗試加載調試符號時忽略它們。

我相信這是Valgrind中的一個錯誤,因爲.text部分的rwx權限根據相關標準完全有效;原來報告已經filed here,我已經擴大了。

相關問題