標籤:http 使用 strong 資料 width io
軟體測試中,排錯(即調試)與成功的測試形影相隨。測試成功的標誌是發現了錯誤。根據錯誤跡象確定錯誤的原因和準確位置,並加以改正的主要依靠排錯技術。
1、排錯過程
如所示,排錯過程開始於一個測試案例的執行,若測試結果與期望結果有出入,即出現了錯誤徵兆,排錯過程首先要找出錯誤原因,然後對錯誤進行修正。因此排錯過程有兩種可能,一是找到了錯誤原因並糾正了錯誤,另一種可能是錯誤原因不明,排錯人員只得做某種推測,然後再設計測試案例證實這種推測,若一次推測失敗,再做第二次推測,直到發現並糾正了錯誤。
排錯是一個相當艱苦的過程,究其原因除了開發人員心理方面的障礙外,還因為隱藏在程式中的錯誤具有下列特殊的性質:
(1)錯誤的外部徵兆遠離引起錯誤的內部原因,對於高度耦合的程式結構此類現象更為嚴重;
(2)糾正一個錯誤造成了另一錯誤現象(暫時)的消失;
(3)某些錯誤徵兆只是假象;
(4)因操作人員一時疏忽造成的某些錯誤徵兆不易追蹤;
(5)錯誤是由於風時而不是程式引起的;
(6)輸入條件難以精確地再構造(例如,某些即時應用的輸入次序不確定);
(7)錯誤徵兆時有時無,此現象對嵌入式系統尤其普遍;
(8)錯誤是由於把任務分布在若干台不同處理機上運行而造成的。[nextpage]
在軟體排錯過程中,可能遇到大大小小、形形色色的問題,隨著問題的增多,排錯人員的壓力也隨之增大,過分地緊張致使開發人員在排除一個問題的同時又引入更多的新問題。
儘管排錯不是一門好學的技術(有時人們更願意稱之為藝術),但還是有若干行之有效方法和策略,下面介紹幾種排錯方法。
2、排錯方法
無論採用哪種排錯方法,目標只有一個,即發現並排除引起錯誤的原因,這要求排錯人員能把直觀想象與系統評估很好的結合起來。
常用的排錯策略分為三類:
① 原始類(brute force)
② 回溯類(backtracking)
③ 排除類(cause eliminations)
原始類排錯方法是最常用也是最低效的方法,只有在萬般無奈的情況下才使用它,主要思想是“通過電腦找錯”。例如輸出儲存空間、寄存器的內容,在程式安排若干輸出語句等,憑藉大量的現場資訊,從中找到出錯的線索,雖然最終也能成功,但難免要耗費大量的時間和精力。
回溯法能成功地用於程式的排錯。方法是從出現錯誤徵兆處開始,人工地沿控制流程程往回追蹤,直至發現出錯的根源,不幸的是程式變大後,可能的回溯路線顯著增加,以致人工進行完全回溯到望而不可及。
排除法基于歸納和演繹原理,採用“分治”的概念,首先懼與錯誤出現有關有所有資料,假想一個錯誤原因,用這些資料證明或反駁它;或者一次列出所有可能的原因,通過測試一一排除。只要某次測試結果說明某種假設已呈現倪端,則立即精化資料,乘勝追擊。
上述每一類方法均可輔以排錯工具。目前,調試編譯器、動態調試器(“追蹤器”)、測試案例自動產生器、儲存空間映象及交叉訪問示圖等到一系列工具已廣為使用。然而,無論什麼工具也替代不了一個開發人員在對完整的設計文檔和清晰的原始碼進行認真審閱和推敲之後所起的作用。此外,不應荒廢排錯過程中最有價值的一個資源,那就是開發小組中其他成員的評價和忠告,正所謂“當事者迷,旁觀者清”。
前面多次提到,修改一處老問題可能引入幾處新問題,有時程式越改越亂,但若能做到每次錯誤修正前都捫心自問三個問題,情況將大為改觀:
① 導致這個錯誤的原因在程式其他部分還可能存在嗎?
② 本次修改可能對程式中相關的邏輯和資料造成什麼影響?引起什麼問題?
③ 上次遇到的類似問題是如何排除的?