調試
調試是執行一次成功的測試用例之後所要進行的工作。所謂成功的測試,是指它可以證明程式沒有實作預期的功能,調試包含兩個錯誤。一:确定程式中可疑錯誤的準确性質和位置。二:修改錯誤。
暴力法調試(分三種類型)
- 利用記憶體資訊輸出來調試
- 根據一般的額“在程式中插入列印語句”建議來調試
- 使用自動化的調試根據進行調試
第一種類型是最缺乏效率的暴力調試法
●難以在記憶體區域與源程式的變量之間建立聯系
●即使對于複雜程度較低的程式,記憶體資訊也會産生數量非常龐大的資料,好多資料都與調試無關。
●記憶體資訊隻能顯示程式的靜态快照,僅能顯示出某一時刻程式的狀态,為了發現錯誤還需要研究動态狀态。
●記憶體資訊輸出很少可以精确地在錯誤發生的地方,是以無法顯示錯誤發生的時序狀态,錯誤發生到輸出資訊這段時間執行的活動,可能會掩蓋掉發現錯誤所需要的線索。
第二種類型,可能比記憶體資訊輸出要好一些,因為可能顯示程式的的動态狀态。但是同樣存在很多缺點。
●它不是鼓勵我們去思考程式中的問題,隻要是碰運氣的方法
●它所産生的需求分析數量非常龐大
●可能對小程式有效,但如果應用到大程式成本就相當高。
●它要求我們修改程式這些修改可能會掩蓋掉錯誤、改變關鍵的時序關系,或者會引入新的錯誤。
第三種類型自動化調試工具的工作機制類似于在程式中插入列印語句,但不是修改程式本身。可以使用程式設計語言的調試功能,或使用特殊互動調試工具來分析程式動态狀态。調試工具的一個共同的功能是設定斷點,使程式在執行到某條特定的語句或改變了某個特定變量的值是暫停執行。然後程式員就可以檢查程式的目前狀态了。
暴力法調試的主要問題在于他們忽略了思考的過程
歸納法調試
歸納法是一種特殊的思考過程,可以從細節到全局,也就是線索出發。歸納法調試步驟如下:
- 确定相關資料。調試人員犯的主要錯誤是未能将所有資料考慮進去第一步是列舉出所有知道程式執行的正确和不正确之處。不正确之處就是症狀。未能引起症狀出現的測試用例提供了額外的有價值的線索。
- 組織資料。歸納就是從特殊到一般,第二部就是組織相關資料,以便觀察線索的模式。
- 做出假設。研究線索之間的聯系,利用線索結構裡可能的模式做出一個或多個關于錯誤原因的假設。如果還無法退出錯誤,則需要更多的假設。
- 證明假設。
演繹法調試
演繹過程是從一個普遍的理論和前提出發,使用排除和精煉過程達到一個結論
- 列出所有可能的原因或假設。
- 利用資料排除所有可能的原因
- 提煉剩下的假設
- 證明剩下的假設
回朔法調試
沿着程式的邏輯結構回溯不正确的結果。直到找到程式邏輯出錯的位置。使用這個過程,可以确定程式中從狀态符合預期值的位置點,到第一個狀态不符合預期值的位置點。
測試法調試
考慮兩種類型的測試用例:1.供測試的測試用例,目的是暴露出以前尚未發生的錯誤。2.供調試的測試用例目的是提供有用的資訊,供定位某個被懷疑的錯誤之處。
話句話說,當發現某個被懷疑的錯誤的症狀之後,需要編寫測試用例,盡量确定錯誤的位置。
調試的原則
調試原則其實也是心理學原則。由于調試過程有兩部分組成,即定位錯誤與修改錯誤。
定位錯誤的原則
- 動腦筋
- 如果遇到了僵局,就留到稍後解決
- 如果遇到了困境,就把問題描述給他人聽
- 僅将測試工具作為第二種手段
- 避免使用實驗法——僅将其作為最後的手段