我正在嘗試track down和issue,其中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.so
是do_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.
因此,這導致我兩個問題:
它似乎
do_init
是越來越由動態鏈接拉入。我怎樣才能找出發生的初始化過程的哪個步驟?這個項目中使用了許多庫,它們用__attribute__((constructor))
定義函數,並且它們通過鏈接器腳本粘在一起。爲什麼Valgrind看不到動態鏈接器加載的符號像GDB那樣?我99%確定沒有任何東西是
dlclose
'd,我認爲任何在LD_PRELOAD
之下的東西都會對Valgrind保持可見,無論如何。
@iharob其中?共享庫或二進制文件? –
你是如何構建'library-version.so'的?它有調試符號嗎? –
所有這些,是否有一個Makefile? –