作爲一名開發人員,您如何使用gdb來追蹤代碼中的錯誤?你使用什麼技巧來讓你的生活更輕鬆?你如何使用gdb來調試你的代碼?
回答
一般來說,你找到的東西,是不應該的,直到你明白爲什麼向後工作。
最明顯是最有用的:設置上的功能或行號斷點並通過線代碼行走。
另一個方便的技巧是對所有的結構/對象顯示功能,即使他們從來沒有在你的程序中使用,因爲你可以從GDB中運行這些功能:
gdb> p show_my_struct(struct)
My custom display of Foo:
...
觀察點可真方便也可能會減慢你的程序。這些打破流時的變量或地址的變更。:
gdb> watch foo
Watchpoint4: foo
gdb>
爲什麼不簡單地使用「p my_struct」而不是「p show_my_struct(my_struct)」? – sigjuice 2009-03-25 07:28:37
因爲您可以解碼標誌字段,運行驗證碼等。它不僅僅是結構值的轉儲,而是可以轉儲含義,包括指向的相關對象。例如,如果obj1有一個obj2s列表,那麼您可以在其中嵌套所有obj2s的顯示。 – 2009-04-08 14:02:57
一些提示值:
- 使用圖形前端(工具KDbg相當不錯,DDD至少比命令行更好gdb,kdevelop有一個不錯的gdb前端,但有一些bgs,nemiver看起來相當不錯,但仍在工作中)
- 確保爲所有重要部分提供調試符號和源代碼(您自己的代碼以及一些系統庫)
- 在RedHat上,您可以安裝-debuginfo軟件包,使符號和源代碼神奇地出現在調試器中 - 非常酷,因爲您可以查看libc函數調用等。
- 在Debian/Ubuntu上,可以安裝 - dbg包來獲取符號;安裝適當的源文件系統軟件包似乎很難,但
- 我傾向於加斷言()和中止()調用中不應該達到,或者說我要學的地方的地方(某種重載斷點)
- 理想情況下,assert()或abort()調用應該封裝在一些只在調試版本中啓用它們的方法或宏中,或者甚至更好,只有在設置了某個env變量時才啓用它們
- 安裝SIGSEGV和SIGABRT的信號處理程序;我親自檢查在安裝處理程序之前是否設置了某個env var;並在處理程序中執行通常位於〜/ .local/bin /中的硬編碼外部命令;該命令可能會啓動kdbg並將其附加到崩潰的應用程序。瞧,調試器會在你的應用程序做壞事的時候彈出。
- 如果您使用單元測試,那麼只要測試用例失敗,就可以類似地附加一個調試器,然後再檢查該應用程序。
使用DDD,視覺前端爲GDB。它可以讓你只需點擊幾下鼠標就可以輕鬆完成任務,並可視化代碼的工作方式,並且在調試器控制檯中還有一個interdative gdb。
您還可以使用Geany。 GDB的
一個特別有用的特點是它能夠檢查多數民衆贊成崩潰程序的最終狀態的能力。
要檢查崩潰轉儲(或核心文件,因爲它更普遍的稱呼),啓動gdb如下:
GDB <程序名> <核心文件>
例如:
gdb的a.out的核心
一旦銀行經營在覈心文件荷蘭國際集團這個命令,GDB會告訴你該程序如何終止,並顯示其中的程序發生錯誤:
Program terminated with signal 11, Segmentation fault.
#0 0x08048364 in foo() at foo.c:4
4 *x = 100;
在上面的例子中,你可以看到該程序終止分段故障而試圖給一個指針賦值。通過在gdb的提示符下鍵入回溯(或BT或其中),您可以查看該程序的完整回溯:
(gdb) backtrace
#0 0x08048364 in foo() at foo.c:4
#1 0x0804837f in main() at foo.c:9
在這一點上,你知道main()
稱爲foo()
和foo()
墜毀,機上4號線同時嘗試將值分配給*x
。很多時候,這提供了足夠的信息來讓您修復錯誤。
我做了很多並行程序開發,所以我發現在python/ruby中使用一個簡單的包裝,可以讓gdb連接到所有節點上的所有進程並與我進行通信非常有幫助我還沒有找到更好的辦法,如果一個人都知道,不是劫持線程,雖然...)
我不知道經歷了怎樣的OP就是這樣:
的GDB文檔是相當不錯,包羅萬象。第一章是對所有基礎知識的一個很好的介紹。
http://www.gnu.org/software/gdb/documentation/
雖然不是用gdb,它們是相關的: 我個人發現,打破複雜的線條下降到確定哪些語句示數有助於幫助。
此外,Valgrind的(http://valgrind.org/)是非常好的/有用的解決緩衝區溢出等等(我還沒有使用gdb的運氣這樣做
基本但非常有用 - 使用text gui與選項-tui
- 1. 你用什麼來測試你的C++代碼?
- 2. 你打電話使用打印語句來調試代碼?
- 3. 你用什麼工具編寫jQuery代碼並調試你的代碼?
- 4. 你如何組織你的代碼?
- 5. 你如何組織你的Javascript代碼?
- 6. 你如何構建你的jQuery代碼?
- 7. 你如何修改你的代碼?
- 8. 你試圖讓你的代碼的功能如何?
- 9. 你如何用cmake設置GDB調試標誌?
- 10. 如何使用gdb調試使用yasm組裝的代碼?
- 11. 使用依賴注入系統你如何單元測試你的代碼
- 12. 你如何讓別人相信你的代碼並使用它?
- 13. 你如何測試非功能代碼?
- 14. 你如何測試CocoaPod代碼?
- 15. 你如何測試Java EE代碼?
- 16. 你如何使用Android調試器?
- 17. 你如何使用測試代碼叉rspec的
- 18. 如何使用GDB調試
- 19. 你如何調試你的Facebook應用程序?
- 20. 如何調試這個代碼爲什麼你是?
- 21. 你可以使用firebug lite來調試IE 8而無需注入代碼嗎?
- 22. Web代碼重用,你如何組織你的腳本片段?
- 23. 你如何使代碼加入?
- 24. 你如何使這段代碼更pythonic?
- 25. 用gdb調試沒有源代碼
- 26. 你如何測試你的Cocoa GUI?
- 27. 你如何編寫你的QTP測試?
- 28. 你如何測試你的Request.QueryString []變量?
- 29. 你如何測試你的emberjs路線?
- 30. 你如何以不同的用戶來提交代碼?
通過使用集成了GDB的IDE,我的生活變得更輕鬆;) – Dan 2008-09-26 15:47:52
這是一個很好的選擇。我被告知我的工作將在一兩年內加入21世紀。不過,瞭解如何手動執行某些功能以便從所有功能中受益,例如使用代碼中當前點的變量來運行自己的功能,總是很有用。 – 2008-09-26 15:52:54