2012-05-04 61 views
35

我使用LD_PRELOADing一個特定的庫運行程序。喜歡這個。如何在LD_PRELOAD中使用gdb

LD_PRELOAD=./my.so ./my_program 

如何使用gdb運行此程序?

+1

http://stackoverflow.com/questions/4703763/how-to-run-gdb-with- ld-preload - 有什麼幫助嗎? – Mat

回答

52

請執行以下操作。

gdb your_program 

(gdb) set environment LD_PRELOAD ./yourso.so 
(gdb) start 
0

基本上可以做到同樣的方式,只是程序名稱前添加gdb

LD_PRELOAD=./my.so gdb ./my.program 

可以使用檢查環境變量:

(gdb) show environment LD_PRELOAD 

在極少數情況下,你實際上需要在gdb中改變它,例如調試dlopen()時,你CA做到這一點:

(gdb) set environment LD_PRELOAD ./my.so 

哦,等等,它不爲我用gdb 7.6.2工作!圖書館沒有加載,這意味着這裏的答案都不是完全正確的,至少目前的工具。

+0

我在猜測預加載的效果對於GDB本身來說是不需要的(也許它是一個修改'open()'之類的模擬庫,比如'fakeroot'等)。 –

5

發帖,因爲我們遇到的情況set environment沒有工作:

GDB documentation

set exec-wrapper wrapper 
show exec-wrapper 
unset exec-wrapper 

當 'EXEC-包裝' 設置,指定的包裝是用來發射程序調試。 gdb使用exec包裝程序的shell命令啓動程序。引用被添加到程序及其參數中,但不包含在內,因此,如果適合您的shell,應該添加引號。包裝器運行,直到它執行你的程序,然後gdb接管控制。

您可以使用任何程序最終調用execve作爲包裝的參數。幾個標準的Unix工具可以完成這個工作env和nohup。任何以exec「$ @」結尾的Unix shell腳本也可以工作。

例如,您使用env環境變量傳遞到調試的程序,而無需在shell環境設置變量:

  (gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so' 
     (gdb) run 
4

這裏是用來運行所有程序的方式(用參數和環境)的一個命令:

實施例:

gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l 

敏銳的觀察者會注意到env在這裏作爲一個可執行封裝(像Alexey Romanov的回答)。

1

可以使用-iex標誌供給env作爲在命令行上一個exec-包裝:

gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program 
+0

此版本在其他一些答案無效或不易使用的地方工作正常。 – Guillaume