排錯(cuò)(即調(diào)試)與成功的測(cè)試形影相隨。測(cè)試成功的標(biāo)志是發(fā)現(xiàn)了錯(cuò)誤。根據(jù)錯(cuò)誤跡象確定錯(cuò)誤的原因和準(zhǔn)確位置,并加以改正的主要依靠排錯(cuò)技術(shù)。
1.排錯(cuò)過(guò)程
如下圖所示,排錯(cuò)過(guò)程開(kāi)始于一個(gè)測(cè)試用例的執(zhí)行,若測(cè)試結(jié)果與期望結(jié)果有出入,即出現(xiàn)了錯(cuò)誤征兆,排錯(cuò)過(guò)程首先要找出錯(cuò)誤原因,然后對(duì)錯(cuò)誤進(jìn)行修正。因此排錯(cuò)過(guò)程有兩種可能,一是找到了錯(cuò)誤原因并糾正了錯(cuò)誤,另一種可能是錯(cuò)誤原因不明,排錯(cuò)人員只得做某種推測(cè),然后再設(shè)計(jì)測(cè)試用例證實(shí)這種推測(cè),若一次推測(cè)失敗,再做第二次推測(cè),直到發(fā)現(xiàn)并糾正了錯(cuò)誤。
排錯(cuò)是一個(gè)相當(dāng)艱苦的過(guò)程,究其原因除了開(kāi)發(fā)人員心理方面的障礙外,還因?yàn)殡[藏在程序中的錯(cuò)誤具有下列特殊的性質(zhì):
(1)錯(cuò)誤的外部征兆遠(yuǎn)離引起錯(cuò)誤的內(nèi)部原因,對(duì)于高度耦合的程序結(jié)構(gòu)此類現(xiàn)象更為嚴(yán)重;
(2)糾正一個(gè)錯(cuò)誤造成了另一錯(cuò)誤現(xiàn)象(暫時(shí))的消失;
(3)某些錯(cuò)誤征兆只是假象;
(4)因操作人員一時(shí)疏忽造成的某些錯(cuò)誤征兆不易追蹤;
(5)錯(cuò)誤是由于風(fēng)時(shí)而不是程序引起的;
(6)輸入條件難以精確地再構(gòu)造(例如,某些實(shí)時(shí)應(yīng)用的輸入次序不確定);
(7)錯(cuò)誤征兆時(shí)有時(shí)無(wú),此現(xiàn)象對(duì)嵌入式系統(tǒng)尤其普遍;
(8)錯(cuò)誤是由于把任務(wù)分布在若干臺(tái)不同處理機(jī)上運(yùn)行而造成的。
在軟件排錯(cuò)過(guò)程中,可能遇到大大小小、形形色色的問(wèn)題,隨著問(wèn)題的增多,排錯(cuò)人員的壓力也隨之增大,過(guò)分地緊張致使開(kāi)發(fā)人員在排除一個(gè)問(wèn)題的同時(shí)又引入更多的新問(wèn)題。
盡管排錯(cuò)不是一門好學(xué)的技術(shù)(有時(shí)人們更愿意稱之為藝術(shù)),但還是有若干行之有效的方法和策略,下面介紹幾種排錯(cuò)方法。
2.排錯(cuò)方法
無(wú)論采用哪種排錯(cuò)方法,目標(biāo)只有一個(gè),即發(fā)現(xiàn)并排除引起錯(cuò)誤的原因,這要求排錯(cuò)人員能把直觀想象與系統(tǒng)評(píng)估很好的結(jié)合起來(lái)。
常用的排錯(cuò)策略分為三類:
① 原始類(brute force)
② 回溯類(backtracking)
③ 排除類(cause eliminations)
原始類排錯(cuò)方法是最常用也是最低效的方法,只有在萬(wàn)般無(wú)奈的情況下才使用它,主要思想是“通過(guò)計(jì)算機(jī)找錯(cuò)”。例如輸出存儲(chǔ)器、寄存器的內(nèi)容,在程序安排若干輸出語(yǔ)句等,憑借大量的現(xiàn)場(chǎng)信息,從中找到出錯(cuò)的線索,雖然最終也能成功,但難免要耗費(fèi)大量的時(shí)間和精力。
回溯法能成功地用于程序的排錯(cuò)。方法是從出現(xiàn)錯(cuò)誤征兆處開(kāi)始,人工地沿控制流程往回追蹤,直至發(fā)現(xiàn)出錯(cuò)的根源,不幸的是程序變大后,可能的回溯路線顯著增加,以致人工進(jìn)行完全回溯到望而不可及。
排除法基于歸納和演繹原理,采用“分治”的概念,首先懼與錯(cuò)誤出現(xiàn)有關(guān)有所有數(shù)據(jù),假想一個(gè)錯(cuò)誤原因,用這些數(shù)據(jù)證明或反駁它;或者一次列出所有可能的原因,通過(guò)測(cè)試一一排除。只要某次測(cè)試結(jié)果說(shuō)明某種假設(shè)已呈現(xiàn)倪端,則立即精化數(shù)據(jù),乘勝追擊。
上述每一類方法均可輔以排錯(cuò)工具。目前,調(diào)試編譯器、動(dòng)態(tài)調(diào)試器(“追蹤器”)、測(cè)試用例自動(dòng)生成器、存儲(chǔ)器映象及交叉訪問(wèn)示圖等到一系列工具已廣為使用。然而,無(wú)論什么工具也替代不了一個(gè)開(kāi)發(fā)人員在對(duì)完整的設(shè)計(jì)文檔和清晰的源代碼進(jìn)行認(rèn)真審閱和推敲之后所起的作用。此外,不應(yīng)荒廢排錯(cuò)過(guò)程中最有價(jià)值的一個(gè)資源,那就是開(kāi)發(fā)小組中其他成員的評(píng)價(jià)和忠告,正所謂“當(dāng)事者迷,旁觀者清”。
前面多次提到,修改一處老問(wèn)題可能引入幾處新問(wèn)題,有時(shí)程序越改越亂,但若能做到每次糾錯(cuò)前都捫心自問(wèn)三個(gè)問(wèn)題,情況將大為改觀:
、 導(dǎo)致這個(gè)錯(cuò)誤的原因在程序其他部分還可能存在嗎?
② 本次修改可能對(duì)程序中相關(guān)的邏輯和數(shù)據(jù)造成什么影響?引起什么問(wèn)題?
③ 上次遇到的類似問(wèn)題是如何排除的?
計(jì)算機(jī)技術(shù)與軟件專業(yè)技術(shù)資格(水平)考試官網(wǎng)匯總
2011年計(jì)算機(jī)軟件專業(yè)技術(shù)考試考場(chǎng)規(guī)則(筆試)
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |