2008-09-26 81 views
12

作爲一名開發人員,您如何使用gdb來追蹤代碼中的錯誤?你使用什麼技巧來讓你的生活更輕鬆?你如何使用gdb來調試你的代碼?

+0

通過使用集成了GDB的IDE,我的生活變得更輕鬆;) – Dan 2008-09-26 15:47:52

+0

這是一個很好的選擇。我被告知我的工作將在一兩年內加入21世紀。不過,瞭解如何手動執行某些功能以便從所有功能中受益,例如使用代碼中當前點的變量來運行自己的功能,總是很有用。 – 2008-09-26 15:52:54

回答

2

一般來說,你找到的東西,是不應該的,直到你明白爲什麼向後工作。

最明顯是最有用的:設置上的功能或行號斷點並通過線代碼行走。

另一個方便的技巧是對所有的結構/對象顯示功能,即使他們從來沒有在你的程序中使用,因爲你可以從GDB中運行這些功能:

gdb> p show_my_struct(struct) 

My custom display of Foo: 
    ... 

觀察點可真方便也可能會減慢你的程序。這些打破流時的變量或地址的變更。:

gdb> watch foo 
Watchpoint4: foo 
gdb> 
+0

爲什麼不簡單地使用「p my_struct」而不是「p show_my_struct(my_struct)」? – sigjuice 2009-03-25 07:28:37

+0

因爲您可以解碼標誌字段,運行驗證碼等。它不僅僅是結構值的轉儲,而是可以轉儲含義,包括指向的相關對象。例如,如果obj1有一個obj2s列表,那麼您可以在其中嵌套所有obj2s的顯示。 – 2009-04-08 14:02:57

3

一些提示值:

  • 使用圖形前端(工具KDbg相當不錯,DDD至少比命令行更好gdb,kdevelop有一個不錯的gdb前端,但有一些bgs,nemiver看起來相當不錯,但仍在工作中)
  • 確保爲所有重要部分提供調試符號和源代碼(您自己的代碼以及一些系統庫)
    • 在RedHat上,您可以安裝-debuginfo軟件包,使符號和源代碼神奇地出現在調試器中 - 非常酷,因爲您可以查看libc函數調用等。
    • 在Debian/Ubuntu上,可以安裝 - dbg包來獲取符號;安裝適當的源文件系統軟件包似乎很難,但
  • 我傾向於加斷言()和中止()調用中不應該達到,或者說我要學的地方的地方(某種重載斷點)
  • 理想情況下,assert()或abort()調用應該封裝在一些只在調試版本中啓用它們的方法或宏中,或者甚至更好,只有在設置了某個env變量時才啓用它們
  • 安裝SIGSEGV和SIGABRT的信號處理程序;我親自檢查在安裝處理程序之前是否設置了某個env var;並在處理程序中執行通常位於〜/ .local/bin /中的硬編碼外部命令;該命令可能會啓動kdbg並將其附加到崩潰的應用程序。瞧,調試器會在你的應用程序做壞事的時候彈出。
  • 如果您使用單元測試,那麼只要測試用例失敗,就可以類似地附加一個調試器,然後再檢查該應用程序。
0

使用DDD,視覺前端爲GDB。它可以讓你只需點擊幾下鼠標就可以輕鬆完成任務,並可視化代碼的工作方式,並且在調試器控制檯中還有一個interdative gdb。

2

一個特別有用的特點是它能夠檢查多數民衆贊成崩潰程序的最終狀態的能力。

要檢查崩潰轉儲(或核心文件,因爲它更普遍的稱呼),啓動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。很多時候,這提供了足夠的信息來讓您修復錯誤。

1

我做了很多並行程序開發,所以我發現在python/ruby​​中使用一個簡單的包裝,可以讓gdb連接到所有節點上的所有進程並與我進行通信非常有幫助我還沒有找到更好的辦法,如果一個人都知道,不是劫持線程,雖然...)

我不知道經歷了怎樣的OP就是這樣:

的GDB文檔是相當不錯,包羅萬象。第一章是對所有基礎知識的一個很好的介紹。

http://www.gnu.org/software/gdb/documentation/

雖然不是用gdb,它們是相關的: 我個人發現,打破複雜的線條下降到確定哪些語句示數有助於幫助。

此外,Valgrind的(http://valgrind.org/)是非常好的/有用的解決緩衝區溢出等等(我還沒有使用gdb的運氣這樣做

1

基本但非常有用 - 使用text gui與選項-tui