日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux系統(tǒng)中找出并解決程序錯誤方法

您可以用各種方法來監(jiān)控運行著的用戶空間程序:可以為其運行調(diào)試器并單步調(diào)試該程序 , 添加打印語句 , 或者添加工具來分析程序 。本文描述了幾種可以用來調(diào)試在 Linux 上運行的程序的方法 。我們將回顧四種調(diào)試問題的情況 , 這些問題包括段錯誤 , 內(nèi)存溢出和泄漏 , 還有掛起 。
本文討論了四種調(diào)試 Linux 程序的情況 。在第 1 種情況中 , 我們使用了兩個有內(nèi)存分配問題的樣本程序 , 使用 MEMWATCH 和 Yet Another Malloc Debugger(YAMD)工具來調(diào)試它們 。在第 2 種情況中 , 我們使用了 Linux 中的 strace 實用程序 , 它能夠跟蹤系統(tǒng)調(diào)用和信號 , 從而找出程序發(fā)生錯誤的地方 。在第 3 種情況中 , 我們使用 Linux 內(nèi)核的 Oops 功能來解決程序的段錯誤 , 并向您展示如何設(shè)置內(nèi)核源代碼級調(diào)試器(kernel source level debugger , kgdb) , 以使用 GNU 調(diào)試器(GNU debugger , gdb)來解決相同的問題;kgdb 程序是使用串行連接的 Linux 內(nèi)核遠(yuǎn)程 gdb 。在第 4 種情況中 , 我們使用 Linux 上提供的魔術(shù)鍵控順序(magic key sequence)來顯示引發(fā)掛起問題的組件的信息 。
常見調(diào)試方法
當(dāng)您的程序中包含錯誤時 , 很可能在代碼中某處有一個條件 , 您認(rèn)為它為真(true) , 但實際上是假(false) 。找出錯誤的過程也就是在找出錯誤后推翻以前一直確信為真的某個條件過程 。
以下幾個示例是您可能確信成立的條件的一些類型:
在源代碼中的某處 , 某變量有特定的值 。
在給定的地方 , 某個結(jié)構(gòu)已被正確設(shè)置 。
對于給定的 if-then-else 語句 , if 部分就是被執(zhí)行的路徑 。
當(dāng)子例程被調(diào)用時 , 該例程正確地接收到了它的參數(shù) 。
找出錯誤也就是要確定上述所有情況是否存在 。如果您確信在子例程被調(diào)用時某變量應(yīng)該有特定的值 , 那么就檢查一下情況是否如此 。如果您相信 if 結(jié)構(gòu)會被執(zhí)行 , 那么也檢查一下情況是否如此 。通常 , 您的假設(shè)都會是正確的 , 但最終您會找到與假設(shè)不符的情況 。結(jié)果 , 您就會找出發(fā)生錯誤的地方 。
調(diào)試是您無法逃避的任務(wù) 。進(jìn)行調(diào)試有很多種方法 , 比如將消息打印到屏幕上、使用調(diào)試器 , 或只是考慮程序執(zhí)行的情況并仔細(xì)地揣摩問題所在 。
在修正問題之前 , 您必須找出它的源頭 。舉例來說 , 對于段錯誤 , 您需要了解段錯誤發(fā)生在代碼的哪一行 。一旦您發(fā)現(xiàn)了代碼中出錯的行 , 請確定該方法中變量的值、方法被調(diào)用的方式以及關(guān)于錯誤如何發(fā)生的詳細(xì)情況 。使用調(diào)試器將使找出所有這些信息變得很簡單 。如果沒有調(diào)試器可用 , 您還可以使用其它的工具 。(請注意 , 產(chǎn)品環(huán)境中可能并不提供調(diào)試器 , 而且 Linux 內(nèi)核沒有內(nèi)建的調(diào)試器 。)
實用的內(nèi)存和內(nèi)核工具
您可以使用 Linux 上的調(diào)試工具 , 通過各種方式跟蹤用戶空間和內(nèi)核問題 。請使用下面的工具和技術(shù)來構(gòu)建和調(diào)試您的源代碼:
用戶空間工具:
內(nèi)存工具:MEMWATCH 和 YAMD
strace
GNU 調(diào)試器(gdb)
魔術(shù)鍵控順序
內(nèi)核工具:
內(nèi)核源代碼級調(diào)試器(kgdb)
內(nèi)建內(nèi)核調(diào)試器(kdb)
Oops
本文將討論一類通過人工檢查代碼不容易找到的問題 , 而且此類問題只在很少見的情況下存在 。內(nèi)存錯誤通常在多種情況同時存在時出現(xiàn) , 而且您有時只能在部署程序之后才能發(fā)現(xiàn)內(nèi)存錯誤 。
第 1 種情況:內(nèi)存調(diào)試工具
C 語言作為 Linux 系統(tǒng)上標(biāo)準(zhǔn)的編程語言給予了我們對動態(tài)內(nèi)存分配很大的控制權(quán) 。然而 , 這種自由可能會導(dǎo)致嚴(yán)重的內(nèi)存管理問題 , 而這些問題可能導(dǎo)致程序崩潰或隨時間的推移導(dǎo)致性能降級 。

推薦閱讀