在 Linux 上找出並解決程式錯誤的主要方法(轉)
在 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)
程式碼:
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/,如需轉載,請註明出處,否則將追究法律責任。
請登入後發表評論
登入
全部評論
|
相關文章
- Mac上搭建chromedriver的錯誤解決方法MacChrome
- Linux yum提示Loaded plugins錯誤的解決方法LinuxPlugin
- 在 Linux 上如何得到一個段錯誤的核心轉儲Linux
- PHP & Linux: libsodium.so.23 錯誤解決方法PHPLinux
- ORA-06550錯誤程式碼的解決方法QB
- undefined reference to錯誤的解決方法Undefined
- Linux下錯誤解決方案Linux
- PbootCMS 404 錯誤解決方法boot
- dbfread報錯ValueError錯誤解決方法Error
- linux解決“XXX is not in the sudoers file”錯誤Linux
- adobe安裝提示【錯誤程式碼1】解決方法
- dedecms提示500錯誤解決方法
- HTTP 錯誤 500.19- Internal Server Error 錯誤解決方法HTTPServerError
- standby新增檔案錯誤的解決方法
- nginx出現403錯誤的解決方法Nginx
- MYSQL中 TYPE=MyISAM 錯誤的解決方法MySql
- 解決MyQL資料庫中1045錯誤的方法——Windows系統(轉)資料庫Windows
- Linux中常見的檔案讀寫錯誤問題及解決方法!Linux
- 使用代理爬蟲出302錯誤程式碼解決方法爬蟲
- 在安裝ps2022遇到安裝失敗錯誤程式碼182解決方法
- Nginx報504 gateway timeout錯誤的解決方法NginxGateway
- steam磁碟寫入錯誤怎麼解決 steam磁碟寫入錯誤解決方法大全
- 伺服器出現 HTTP 錯誤程式碼,及解決方法伺服器HTTP
- JAVA web ServletFileUpload檔案上傳遇到大量50+錯誤的解決方法JavaWebServlet
- win10更新失敗提示錯誤程式碼8020056的解決方法Win10
- Steam錯誤程式碼138怎麼辦?無法訪問社群提示138錯誤解決方法
- 印表機提示列印錯誤怎麼解決 印表機狀態錯誤的方法
- 織夢提示dedecms error warning錯誤的解決方法Error
- 解決java5 發行錯誤最好的方法Java
- mysql 發生系統錯誤1067的解決方法MySql
- win10安裝程式installer錯誤怎麼辦_win10安裝程式installer錯誤解決方法Win10
- 解決WinForm程式在高DPI螢幕下介面縮放錯誤ORM
- 程式設計師簡歷中最致命的「八個錯誤 」及解決方法程式設計師
- Ocelot錯誤解決
- 轉存——Quartus II FPGA程式模擬執行時出現錯誤“error occurred during modelsim simulation”的解決方法FPGAError
- 解決伺服器返回錯誤的方法和步驟伺服器
- Python: 安裝 sklearn 包出現錯誤的解決方法Python
- 資料庫連線錯誤的原因及解決方法資料庫
- ORACLE匯入遇到ORACLE錯誤959解決方法Oracle