2012-02-09 69 views
2

我想在動態共享庫libexecHook.so中調試一些函數。這個庫預裝了LD_PRELOAD,用於攔截並重寫一些對execve()和朋友的調用。出於調試目的,我已經用符號構建了gmake。從我讀過的其他問題,這應該工作:如何在用gdb加載LD_PRELOAD的動態庫中調試函數?

gdb ~/tmp/make-dfsg-3.81/make 
set exec-wrapper env LD_PRELOAD=/home/marko/execHook.C027/lib/libexecHook.so.0.0.0 
start 
break execve 
break execvp 
cont 

我確實看到正確設置的斷點,

4  breakpoint  keep y 0x00007ffff7bd92e0 in execvp at execHook.c:128 

但gdb從來沒有打破我預先加載的exec ..()函數。在執行期間看着調試輸出,我看到我的庫函數正在被調用。

+0

您是否曾嘗試在啓動gdb之前設置LD_PRELOAD? – 2012-02-10 15:25:19

+0

我以前沒有嘗試過,但沒有什麼區別。 – Marko 2012-02-10 17:39:31

回答

2

gdb在我預先加載的包裝函數中沒有中斷的原因是它們是從沒有連接到gdb的子進程執行的。在Linux上,我可以

set follow-fork-mode child 

使GDB附加到獲取一個vfork()創建的子。

0

在設置斷點之前試着說start。這將開始運行該程序,這將導致庫依賴性得到滿足,希望使用您的LD_PRELOAD路徑。然後在啓動後設置斷點,然後繼續。

+0

完全一樣的東西:我看到了斷點:'exec_pc:128'處的execvp中有4個斷點保存y 0x00007ffff7bd92e0,並且程序的調試輸出顯示它正在使用函數,但斷點從不觸發。 – Marko 2012-02-10 11:02:33