回答
請執行以下操作。
gdb your_program
(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
基本上可以做到同樣的方式,只是程序名稱前添加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工作!圖書館沒有加載,這意味着這裏的答案都不是完全正確的,至少目前的工具。
我在猜測預加載的效果對於GDB本身來說是不需要的(也許它是一個修改'open()'之類的模擬庫,比如'fakeroot'等)。 –
發帖,因爲我們遇到的情況set environment
沒有工作:
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
這裏是用來運行所有程序的方式(用參數和環境)的一個命令:
實施例:
gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l
敏銳的觀察者會注意到env
在這裏作爲一個可執行封裝(像Alexey Romanov的回答)。
可以使用-iex
標誌供給env
作爲在命令行上一個exec-包裝:
gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
此版本在其他一些答案無效或不易使用的地方工作正常。 – Guillaume
- 1. 如何在用gdb加載LD_PRELOAD的動態庫中調試函數?
- 2. 如何在Android的mediaserver上使用LD_PRELOAD?
- 3. 重寫使用LD_PRELOAD
- 4. 如何使用gdb
- 5. 如何使用GDB
- 6. 在Linux中使用LD_PRELOAD鉤strcmp?
- 7. 如何用dlopen()替換LD_PRELOAD的用法?
- 8. 如何正確使用gdb?
- 9. Gdb,如何使用打印?
- 10. 如何使用GDB調試
- 11. 在內核級函數上使用LD_PRELOAD
- 12. 如何在gdb
- 13. 在Emacs中使用gdb 23
- 14. 如何在LD_PRELOAD之後卸載庫?
- 15. 如何在gdb中調用程序集?
- 16. 如何攔截使用LD_PRELOAD的dlsym調用?
- 17. 如何在Linux(redhat)中使用xterm中的valgrind和gdb?
- 18. 爲什麼不鼓勵LD_PRELOAD的使用?
- 19. 無法使用x86 g ++編譯x64 LD_PRELOAD
- 20. 在Linux中使用LD_PRELOAD混合64位/ 32位環境
- 21. 如何在xcode中使用-quiet運行gdb
- 22. 如何在Eclipse CDT中使用GDB控制檯?
- 23. 如何使用gdb在g ++代碼中查找浮點異常
- 24. 如何在Eclipse中使用GDB進行C/C++調試?
- 25. 如何在gdb中使用其他標誌運行程序?
- 26. 如何使用共享庫函數在gdb中設置斷點
- 27. 如何使用gdb在.exe文件中查找分段錯誤
- 28. 如何在gdb中使用輸入文件
- 29. 如何在windows中運行cuda-gdb?我可以使用cygwin嗎?
- 30. 如何在gdb中使用python訪問寄存器
http://stackoverflow.com/questions/4703763/how-to-run-gdb-with- ld-preload - 有什麼幫助嗎? – Mat