1. 程式人生 > >軟體除錯方法及除錯原則

軟體除錯方法及除錯原則

除錯(Debug)

 

軟體除錯是在進行了成功的測試之後才開始的工作,它與軟體測試不同,除錯的任務是進一步診斷和改正程式中潛在的錯誤。

 

注:

以問題為中心

以錯誤為導向

 

除錯活動由兩部分組成:

u  確定程式中可疑錯誤的確切性質和位置

u  對程式(設計,編碼)進行修改,排除這個錯誤

 

注:

測試和除錯密不可分

測試是為了發現問題

除錯時為了解決問題

 

除錯工作是一個具有很強技巧性的工作

 

軟體執行失效或出現問題,往往只是潛在錯誤的外部表現,而外部表現與內在原因之間常常沒有明顯的聯絡,如果要找出真正的原因,排除潛在的錯誤,不是一件易事。

可以說,除錯是通過現象,找出原因的一個思維分析的過程。

除錯步驟:

(1)      從錯誤的外部表現形式入手,確定程式中出錯位置

(2)      研究有關部分的程式,找出錯誤的內在原因

(3)      修改設計程式碼,以排除這個錯誤

(4)      重複進行暴露了這個錯誤的原始測試或某些有關測試。

 

注:

由外而內

由現象到本質

由結果到原因

 

從技術角度來看查詢錯誤的難度在於:

u  現象與原因所處的位置可能相距甚遠

u  當其他錯誤得到糾正時,這一錯誤所表現出的現象可能會暫時消失,但併為實際排除

u  現象實際上是由一些非錯誤原因(例如,舍入不精確)引起的

u  現象可能是由於一些不容易發現的人為錯誤引起的

u  錯誤是由於時序問題引起的,與處理過程無關

u  現象是由於難於精確再現的輸入狀態(例如,實時應用中輸入順序不確定)引起

u  現象可能是週期出現的,在軟,硬體結合的嵌入式系統中常常遇到

 

 

幾種主要的除錯方法

 

除錯的關鍵在於推斷程式內部的錯誤位置及原因,可以採用以下方法:

1.強行排錯:

這種除錯方法目前使用較多,效率較低,它不需要過多的思考,比較省腦筋。例如:

u  通過記憶體全部列印來除錯,在這大量的資料中尋找出錯的位置。

u  在程式特定位置設定列印語句,把列印語句插在出錯的源程式的各個關鍵變數改變部位,重要分支部位,子程式呼叫部位,跟蹤程式的執行,監視重要變數的變化

u  自動呼叫工具,利用某些程式語言的除錯功能或專門的互動式除錯工具,分析程式的動態過程,而不必修改程式。

 

應用以上任一種方法之前,都應當對錯誤的徵兆進行全面徹底的分析,得出對出錯位置及錯誤性質的推測,再使用一種適當的除錯方法來檢驗推測的正確性。

 

2.回溯法除錯:

這是在小程式中常用的一種有效的除錯方法,一旦發現了錯誤,人們先分析錯誤的徵兆,確定最先發現“症狀“的位置

然後,人工沿程式的控制流程,向回追蹤源程式程式碼,直到找到錯誤根源或確定錯誤產生的範圍,

例如,程式中發現錯誤處是某個列印語句,通過輸出值可推斷程式在這一點上變數的值,再從這一點出發,回溯程式的執行過程,反覆思考:“如果程式在這一點上的狀態(變數的值)是這樣,那麼程式在上一點的狀態一定是這樣···“直到找到錯誤所在。

 

 

 

3.歸納法除錯:

歸納法是一種從特殊推斷一般的系統化思考方法,歸納法除錯的基本思想是:從一些線索(錯誤徵兆)著手,通過分析它們之間的關係來找出錯誤

 

u  收集有關的資料,列出所有已知的測試用例和程式執行結果,看哪些輸入資料的執行結果是正確的,哪些輸入資料的執行經過是有錯誤的

u  組織資料

由於歸納法是從特殊到一般的推斷過程,所以需要組織整理資料,以發現規律

 

常以3W1H形式組織可用的資料

“What“列出一般現象

“Where“說明發現現象的地點

“When“列出現象發生時所有已知情況

“How“說明現象的範圍和量級

“Yes“描述出現錯誤的3W1H;

“No“作為比較,描述了沒有錯誤的3W1H,通過分析找出矛盾來

 

u  提出假設

分析線索之間的關係,利用線上索結構中觀察到的矛盾現象,設計一個或多個關於出錯原因的假設,如果一個假設也提不出來,歸納過程就需要收集更多的資料,此時,應當再設計與執行一些測試用例,以獲得更多的資料。

 

u  證明假設

把假設與原始線索或資料進行比較,若它能完全解釋一切現象,則假設得到證明,否則,認為假設不合理,或不完全,或是存在多個錯誤,以致只能消除部分錯誤

 

 

4.演繹法除錯:

演繹法是一種從一般原理或前提出發,經過排除和精華的過程來推匯出結論的思考方法,演繹法排錯是測試人員首先根據已有的測試用例,設想及枚舉出所有可能出錯的原因作為假設,然後再用原始測試資料或新的測試,從中逐個排除不可能正確的假設,最後,再用測試資料驗證餘下的假設確是出錯的原因。

 

u  列舉所有可能出錯原因的假設,把所有可能的錯誤原因列成表,通過它們,可以組織,分析現有資料

u  利用已有的測試資料,排除不正確的假設

仔細分析已有的資料,尋找矛盾,力求排除前一步列出所有原因,如果所有原因都被排除了,則需要補充一些資料(測試用例),以建立新的假設。

 

u  改進餘下的假設

利用已知的線索,進一步改進餘下的假設,使之更具體化,以便可以精確地確定出錯位置

 

u  證明餘下的假設

 

 

除錯原則

n  在除錯方面,許多原則本質上是心理學方面的問題,除錯由兩部分組成,除錯原則也分成兩組。

n  確定錯誤的性質和位置的原則

u  用頭腦去分析思考與錯誤徵兆有關的資訊

u  避開死衚衕

u  只把除錯工具當做輔助手段來使用,利用除錯工具,可以幫助思考,但不能代替思考

u  避免用試探法,最多隻能把它當做最後手段

 

n  修改錯誤的原則

 

u  在出現錯誤的地方,很有可能還有別的錯誤

u  修改錯誤的一個常見失誤是隻修改了這個錯誤的徵兆或這個錯誤的表現,而沒有修改錯誤的本身。

u  當心修正一個錯誤的同時有可能會引入新的錯誤

u  修改錯誤的過程將迫使人們暫時回到程式設計階段

u  修改原始碼程式,不要改變目的碼