在 Linux 上找出並解決程式錯誤的主要方法(轉)

BSDLite發表於2007-08-11
在 Linux 上找出並解決程式錯誤的主要方法(轉)[@more@]Steve Best()
JFS 核心小組成員,IBM

您可以用各種方法來監控執行著的使用者空間程式:可以為其執行偵錯程式並單步除錯該程式,新增列印語句,或者新增工具來分析程式。本文描述了幾種可以用來除錯在 Linux 上執行的程式的方法。我們將回顧四種除錯問題的情況,這些問題包括段錯誤,記憶體溢位和洩漏,還有掛起。
本文討論了四種除錯 Linux 程式的情況。在第 1 種情況中,我們使用了兩個有記憶體分配問題的樣本程式,使用 MEMWATCH 和 Yet Another Malloc Debugger(YAMD)工具來除錯它們。在第 2 種情況中,我們使用了 Linux 中的 strace 實用程式,它能夠跟蹤系統呼叫和訊號,從而找出程式發生錯誤的地方。在第 3 種情況中,我們使用 Linux 核心的 Oops 功能來解決程式的段錯誤,並向您展示如何設定核心原始碼級偵錯程式(kernel source level debugger,kgdb),以使用 GNU 偵錯程式(GNU debugger,gdb)來解決相同的問題;kgdb 程式是使用序列連線的 Linux 核心遠端 gdb。在第 4 種情況中,我們使用 Linux 上提供的魔術鍵控順序(magic key sequence)來顯示引發掛起問題的元件的資訊。

常見除錯方法
當您的程式中包含錯誤時,很可能在程式碼中某處有一個條件,您認為它為真(true),但實際上是假(false)。找出錯誤的過程也就是在找出錯誤後推翻以前一直確信為真的某個條件過程。

以下幾個示例是您可能確信成立的條件的一些型別:

在原始碼中的某處,某變數有特定的值。
在給定的地方,某個結構已被正確設定。
對於給定的 if-then-else 語句,if 部分就是被執行的路徑。
當子例程被呼叫時,該例程正確地接收到了它的引數。

找出錯誤也就是要確定上述所有情況是否存在。如果您確信在子例程被呼叫時某變數應該有特定的值,那麼就檢查一下情況是否如此。如果您相信 if 結構會被執行,那麼也檢查一下情況是否如此。通常,您的假設都會是正確的,但最終您會找到與假設不符的情況。結果,您就會找出發生錯誤的地方。

除錯是您無法逃避的任務。進行除錯有很多種方法,比如將訊息列印到螢幕上、使用偵錯程式,或只是考慮程式執行的情況並仔細地揣摩問題所在。

在修正問題之前,您必須找出它的源頭。舉例來說,對於段錯誤,您需要了解段錯誤發生在程式碼的哪一行。一旦您發現了程式碼中出錯的行,請確定該方法中變數的值、方法被呼叫的方式以及關於錯誤如何發生的詳細情況。使用偵錯程式將使找出所有這些資訊變得很簡單。如果沒有偵錯程式可用,您還可以使用其它的工具。(請注意,產品環境中可能並不提供偵錯程式,而且 Linux 核心沒有內建的偵錯程式。)

實用的記憶體和核心工具
您可以使用 Linux 上的除錯工具,透過各種方式跟蹤使用者空間和核心問題。請使用下面的工具和技術來構建和除錯您的原始碼:
使用者空間工具:

記憶體工具:MEMWATCH 和 YAMD
strace
GNU 偵錯程式(gdb)
魔術鍵控順序

核心工具:

核心原始碼級偵錯程式(kgdb)
內建核心偵錯程式(kdb)
Oops


本文將討論一類透過人工檢查程式碼不容易找到的問題,而且此類問題只在很少見的情況下存在。記憶體錯誤通常在多種情況同時存在時出現,而且您有時只能在部署程式之後才能發現記憶體錯誤。

第 1 種情況:記憶體除錯工具
C 語言作為 Linux 系統上標準的程式語言給予了我們對動態記憶體分配很大的控制權。然而,這種自由可能會導致嚴重的記憶體管理問題,而這些問題可能導致程式崩潰或隨時間的推移導致效能降級。

記憶體洩漏(即 malloc() 記憶體在對應的 free() 呼叫執行後永不被釋放)和緩衝區溢位(例如對以前分配到某陣列的記憶體進行寫操作)是一些常見的問題,它們可能很難檢測到。這一部分將討論幾個除錯工具,它們極大地簡化了檢測和找出記憶體問題的過程。

MEMWATCH
MEMWATCH 由 Johan Lindh 編寫,是一個開放原始碼 C 語言記憶體錯誤檢測工具,您可以自己下載它(請參閱本文後面部分的參考資料)。只要在程式碼中新增一個標頭檔案並在 gcc 語句中定義了 MEMWATCH 之後,您就可以跟蹤程式中的記憶體洩漏和錯誤了。MEMWATCH 支援 ANSI C,它提供結果日誌紀錄,能檢測雙重釋放(double-free)、錯誤釋放(erroneous free)、沒有釋放的記憶體(unfreed memory)、溢位和下溢等等。

清單 1. 記憶體樣本(test1.c)
程式碼:
QUOTE:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-946440/,如需轉載,請註明出處,否則將追究法律責任。

在 Linux 上找出並解決程式錯誤的主要方法(轉)
請登入後發表評論 登入
全部評論

相關文章