版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、軟件測試技術(shù)與質(zhì)量保證1第2章 程序調(diào)試技術(shù) 程序調(diào)試是在進(jìn)行了成功的測試之后才開始的工作。它與軟件測試不同,軟件測試的目的是盡可能多地發(fā)現(xiàn)軟件中的錯誤,但進(jìn)一步診斷和改正程序中潛在的錯誤,則是調(diào)試的任務(wù)。2調(diào)試活動由兩部分組成: 確定程序中可疑錯誤的確切性質(zhì)和位置。 對程序(設(shè)計,編碼)進(jìn)行修改,排除這個錯誤。3 通常,調(diào)試工作是一個具有很強(qiáng)技巧的工作。軟件運(yùn)行失效或出現(xiàn)問題,往往只是潛在錯誤的外部表現(xiàn),而外部表現(xiàn)與內(nèi)在原因之間常常沒有明顯的聯(lián)系。如果要找出真正的原因,排除潛在的錯誤,不是一件易事。因此可以說,調(diào)試是通過現(xiàn)象找出原因的一個思維分析的過程。42.1 調(diào)試步驟調(diào)試的執(zhí)行步驟如下:
2、從錯誤的外部表現(xiàn)形式入手,確定程序中出錯位置; 研究有關(guān)部分的程序,找出錯誤的內(nèi)在原因; 修改設(shè)計和代碼,以排除這個錯誤;5 重復(fù)進(jìn)行暴露了這個錯誤的原始測試或某些有關(guān)測試,以確認(rèn):該錯誤是否被排除;是否引進(jìn)了新的錯誤。 如果所作的修改無效,則撤銷這次改動,重復(fù)上述過程,至到找到一個有效的解決方法為止。6 調(diào)試是一個相當(dāng)艱苦的過程,究其原因除了開發(fā)人員心理方面的障礙外,還因為隱藏在程序中的錯誤具有下列特殊的性質(zhì): 錯誤的外部征兆遠(yuǎn)離引起錯誤的內(nèi)部原因,對于高度耦合的程序結(jié)構(gòu)此類現(xiàn)象更為嚴(yán)重; 糾正一個錯誤造成了另一錯誤現(xiàn)象(暫時)的消失; 某些錯誤征兆只是假象; 因操作人員一時疏忽造成的某些錯
3、誤征兆不易追蹤;7 錯誤是由于時序問題而不是程序引起的; 輸入條件難以精確地再構(gòu)造(例如,某些實時應(yīng)用的輸入次序不確定); 錯誤征兆時有時無,此現(xiàn)象對嵌入式系統(tǒng)尤其普遍; 錯誤是由于把任務(wù)分布在若干臺不同處理機(jī)上運(yùn)行而造成的。8 2.2 調(diào)試原則因為調(diào)試有兩部分組成,所以調(diào)試原則也分成兩組。1、確定錯誤的性質(zhì)和位置的原則 用頭腦去分析思考與錯誤征兆有關(guān)的信息。最有效的調(diào)試方法是用頭腦分析與錯誤征兆有關(guān)的信息。一個能干的程序調(diào)試員應(yīng)能做到不使用計算機(jī)就能夠確定大部分錯誤。9 避開死胡同。 如果程序調(diào)試員走進(jìn)了死胡同,或者陷入了絕境,最好暫時把問題拋開,留到第二天再去考慮,或者向其他人講解這個問題
4、。事實上常有這種情形:向一個好的聽眾簡單的描述這個問題時,不需要任何聽講者的提示,你自己會突然發(fā)現(xiàn)問題的所在。10 只把調(diào)試工具當(dāng)作輔助手段來使用。利用調(diào)試工具,可以幫助思考,但不能代替思考。因為調(diào)試工具給你的是一種無規(guī)律的調(diào)試方法。實驗證明,即使是對一個不熟悉的程序進(jìn)行調(diào)試時,不用工具的人往往比使用工具的人更容易成功。11 避免用試探法,最多只能把它當(dāng)作最后手段。初學(xué)調(diào)試的人最常犯的一個錯誤是想試試修改程序來解決問題。這還是一種碰運(yùn)氣的盲目行為,它的成功機(jī)會很小,而且還常把新的錯誤帶到問題中來。122修改錯誤的原則 在出現(xiàn)錯誤的地方,很可能還有別的錯誤。 經(jīng)驗證明,錯誤有群集現(xiàn)象,當(dāng)在某一程
5、序段發(fā)現(xiàn)有錯誤時,在該程序段中還存在別的錯誤的概率也很高。因此,在修改一個錯誤時,還要查一下它的近鄰,看是否還有別的錯誤。13修改錯誤的一個常見失誤是只修改了這個錯誤的征兆或這個錯誤的表現(xiàn),而沒有修改錯誤的本身。 如果提出的修改不能解釋與這個錯誤有關(guān)的全部線索,那就表明了只修改了錯誤的一部分。14當(dāng)心修改一個錯誤的同時又可能會引入新的錯誤。 人們不僅需要注意不正確的修改,而且還要注意看起來是正確的修改可能會帶來的副作用,即引進(jìn)新的錯誤。因此在修改了錯誤之后,必須進(jìn)行回歸測試,以確定是否引進(jìn)了新的錯誤。15 修改錯誤的過程將迫使人們暫時回到程序設(shè)計階段。 修改錯誤也是程序設(shè)計的一種形式。一般說來
6、,在程序設(shè)計階段所使用的任何方法都可以應(yīng)用到錯誤修正的過程中來。162.3 調(diào)試方法 調(diào)試的關(guān)鍵在于推斷程序內(nèi)部的錯誤位置及原因。為此,可以采用以下幾種主要的方法:171普查法 依靠系統(tǒng)的調(diào)試跟蹤工具,或?qū)⑿畔⒋蛴』蝻@示出來,進(jìn)行普遍的查找錯誤的原因,并進(jìn)行排錯的過程方法。雖然最終能導(dǎo)致排錯成功,但工作量太大,時間太浪費(fèi),缺乏分析和高效率,一般在毫無辦法,迫不得已的時候才用。182回溯法 這是在小程序中常用的一種有效的排錯方法。一旦發(fā)現(xiàn)錯誤,人們先分析錯誤征兆,確定最先發(fā)現(xiàn)“癥狀”的位置。然后,人工沿程序的控制流程,向回追蹤源程序代碼,直到找到錯誤根源或確定錯誤產(chǎn)生的范圍。即在其狀態(tài)是預(yù)期的點
7、與第一個狀態(tài)不是預(yù)期的點之間的程序位置。19 回溯法對于小程序很有效,往往能把錯誤范圍縮小到程序中的一小段代碼,仔細(xì)分析這段代碼不難確定出錯的準(zhǔn)確位置。但對于大程序,由于回溯的路徑數(shù)目較多,回溯會變得很困難。203歸納法 歸納法是由測試取得錯誤數(shù)據(jù)的個別數(shù)據(jù),分析組織出一般可能的錯誤線索,研究出錯規(guī)律的線索關(guān)系,由此設(shè)置錯誤原因,證明設(shè)置錯誤原因,能證明就排除錯誤,不能證明說明分析的不準(zhǔn),說明出錯規(guī)律的線索關(guān)系不正確,再重新選擇相應(yīng)測試數(shù)據(jù),如此周而復(fù)始的進(jìn)行。21可見歸納法是一種由特殊到一般的錯誤推斷排除法。簡而言之其過程是收集有關(guān)數(shù)據(jù),組織數(shù)據(jù),尋找假設(shè),證明假設(shè),排除假設(shè)錯誤的過程。22
8、4演繹法 演繹法是一種從一般原理或前提出發(fā),經(jīng)過排除和精化過程推導(dǎo)出結(jié)論的思考方法。演繹法排錯是測試人員首先根據(jù)已有的測試用例,設(shè)想及枚舉出所有可能出錯的原因作為假設(shè);然后再用原始測試數(shù)據(jù)或新的測試,從中逐個排除不可能正確的假設(shè);最后,再用測試數(shù)據(jù)驗證余下的假設(shè)確是出錯的原因。23 上述每一類方法均可輔以調(diào)試工具。目前,調(diào)試編譯器、動態(tài)調(diào)試器(“追蹤器”)、測試用例自動生成器、存儲器映象及交叉訪問示圖等到一系列工具已廣為使用。然而,無論什么工具也替代不了一個開發(fā)人員在對完整的設(shè)計文檔和清晰的源代碼進(jìn)行認(rèn)真審閱和推敲之后所起的作用。此外,不應(yīng)荒廢調(diào)試過程中最有價值的一個資源,那就是開發(fā)小組中其他
9、成員的評價和忠告,正所謂“當(dāng)事者迷,旁觀者清”。24前面多次提到,修改一處老問題可能引入幾處新問題,有時程序越改越亂,但若能做到每次糾錯前都捫心自問三個問題,情況將大為改觀: 導(dǎo)致這個錯誤的原因在程序其他部分還可能存在嗎? 本次修改可能對程序中相關(guān)的邏輯和數(shù)據(jù)造成什么影響?引起什么問題? 上次遇到的類似問題是如何排除的?252.4 C程序?qū)嵱谜{(diào)試技巧1如果運(yùn)行的程序掛起了,應(yīng)該怎么辦? 當(dāng)你運(yùn)行一個程序時會有多種原因使它掛起,這些原因可以分為以下4種基本類型: 程序中有死循環(huán); 程序運(yùn)行的時間比所期望的長; 程序在等待某些輸入信息,并且知道輸入正確后才會繼續(xù)運(yùn)行; 程序設(shè)計的目的就是為了延遲一
10、些時間,或者暫停執(zhí)行。26 死循環(huán) 當(dāng)你的程序出現(xiàn)了死循環(huán)時,機(jī)器將無數(shù)次地執(zhí)行同一段代碼,這種操作當(dāng)然是程序員所不希望的。出現(xiàn)死循環(huán)的原因是程序員使程序進(jìn)行循環(huán)的判斷條件永遠(yuǎn)為真,或者使程序退出循環(huán)的判斷條件永遠(yuǎn)為假。27 運(yùn)行時間比期望的時間長 在有些情況下,你會發(fā)現(xiàn)程序并沒有被完全鎖死,只不過它的運(yùn)行時間比你所期望的時間長,這種情況是令人討厭的。如果你所使用的計算機(jī)運(yùn)算速度很快,能在極短的時間內(nèi)完成很復(fù)雜的運(yùn)算,那么這種情況就更令人討厭了。28 等待正確的輸入 有時程序停止運(yùn)行是因為它在等待正確的輸入信息。最簡單的情況就是程序在等待用戶輸入信息,而程序卻沒有輸出響應(yīng)的提示信息,因而用戶不
11、知道要輸入信息,程序看上去就好象鎖住了。更令人討厭的是由緩沖造成的這種結(jié)果。292、用什么辦法才能找出程序中的錯誤?在調(diào)試程序的過程中,程序員應(yīng)該記住以下幾種技巧: 先調(diào)試程序中較小的組成部分,然后調(diào)試較大的組成部分 如果你的程序編寫得很好,那么它將包含一些較小的組成部分,最好先證實程序的這些部分是正確的。盡管程序中的錯誤并不一定發(fā)生在這些部分中,但是先調(diào)試它們有助于你理解程序的總體結(jié)構(gòu),并且證實程序的那些部分不存在錯誤。30 徹底調(diào)試好程序的一個組成部分后,再調(diào)試下一個組成部分 這一點非常重要。如果證實了程序的一個組成部分是正確的,不僅能縮小可能存在錯誤的范圍,而且程序的其它組成部分就能安全
12、地使用這部分程序了。這里應(yīng)用了一種很好的經(jīng)驗性原則,簡單地說就是調(diào)試一段代碼的難度與這段代碼長度的平方成正比,因此,調(diào)試一段20行的代碼比調(diào)試一段10行的代碼難4倍。31 連續(xù)地觀察程序流和數(shù)據(jù)的變化 這一點也很重要!如果你小心仔細(xì)地設(shè)計和編寫程序,那么通過監(jiān)視程序的輸出你就能準(zhǔn)確地知道正在執(zhí)行的是哪部分代碼以及各個變量的內(nèi)容都是什么。當(dāng)然,如果程序表現(xiàn)不正常,你就無法做到這一點。為了做到這一點,通常只能借助于調(diào)試程序或者在程序中加入大量的print語句來觀察控制流和重要變量的內(nèi)容。 32 始終打開編譯程序警告選項,并試圖消除所有警告 在開發(fā)程序的過程中,你自始至終都要做到這一點,否則,你就會
13、面臨一項十分繁重的工作,盡管許多程序員認(rèn)為消除編譯程序警告是一項繁瑣的工作,但它是很有價值的。編譯程序給出警告的大部分代碼至少都是有問題的,因此用一些時間把它們變成正確的代碼是值得的,而且,通過消除這些警告,你往往會找到程序中真正發(fā)生錯誤的地方。33 準(zhǔn)確地縮小存在錯誤的范圍 如果你能一下子確定存在錯誤的那部分程序并在其中找到錯誤,那就會節(jié)省許多調(diào)試時間。但事實上,我們并不能總是一下子就命中要害,因此,通常的做法是逐步縮小可能存在錯誤的程序范圍,并通過這種過程找出真正存在錯誤的那部分程序。當(dāng)你找到這部分程序后,就可以把所有的調(diào)試工作集中到這部分程序上了。342.5 Vc+6.0常見編譯錯誤說明
14、error C2143: syntax error : missing ; before identifier scanf語法錯誤:在 scanf 之前缺少“;”出錯實例: int n scanf(“%d”, &n);35error C2065: A : undeclared identifier 標(biāo)識符A未聲明出錯實例:int a; scanf(“%d”, &A);error C2065: sqrt : undeclared identifier標(biāo)識符sqrt未定義(原因:未包含)36error C2296: % : illegal, left operand has type floate
15、rror C2297: % : illegal, right operand has type float 非法, %運(yùn)算符的左右操作數(shù)不是整型 出錯實例:float a = 10, b = 2; printf(“%dn”, a % b);error C2440: = : cannot convert from char 2 to char 不能將字符串轉(zhuǎn)換成字符 出錯實例:char ch2; ch = “a”;37error C2181: illegal else without matching if else子句沒有匹配的iferror C2196: case value 1 alrea
16、dy used case 1: 已經(jīng)被使用(原因:有相同的case 常量)error C2078: too many initializers 初始化值太多 出錯實例:int a5 = 1, 2, 3, 4, 5, 6;38error C2105: + needs l-value +運(yùn)算只能作用于左值(常量不能作左值) 出錯實例:int a=1,2,3,4,5; int *pa = +a;/ 數(shù)組名是地址常量,不能作左值error C2117: Hello : array bounds overflow 數(shù)組邊界溢出 出錯實例:char str5 = Hello;39error C4716:
17、Function : must return a value 函數(shù)Function()必須返回一個值 出錯實例:int Function(int n) / 函數(shù)定義,返回值類型:int 類型 return; / 不返回值,語法錯誤,應(yīng)為:return 表達(dá)式; 40error C2562: Function : void function returning a value 無返回值的函數(shù)Function()返回了一個值 出錯實例:void Function(int n) / 函數(shù)定義,無返回值 return (n % 10); / 有返回值,語法錯誤,應(yīng)為:return;41error C2447: missing function header (old-style formal list?) 缺少函數(shù)頭出錯實例:void Function(int n); / 都是“;”惹的禍 return; 42error C208
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 20047.1-2025光伏組件安全鑒定第1部分:結(jié)構(gòu)要求
- 智能控制 課件 -第四章-專家控制系統(tǒng)
- 2025中學(xué)教師招聘考試題
- 內(nèi)分泌科病區(qū)安全防護(hù)
- 內(nèi)分泌甲狀腺科普
- 新年心愿活動策劃方案(3篇)
- 綜合體項目管理制度(3篇)
- 獸藥管理培訓(xùn)
- 銷售合同管理制度流程模板(3篇)
- 《GAT 760.2-2008公安信息化標(biāo)準(zhǔn)管理分類與代碼 第2部分:標(biāo)準(zhǔn)級別代碼》專題研究報告深度
- 數(shù)字孿生方案
- 金融領(lǐng)域人工智能算法應(yīng)用倫理與安全評規(guī)范
- 2026長治日報社工作人員招聘勞務(wù)派遣人員5人備考題庫及答案1套
- 機(jī)動車駕校安全培訓(xùn)課件
- 河道清淤作業(yè)安全組織施工方案
- 2025年役前訓(xùn)練考試題庫及答案
- 2024VADOD臨床實踐指南:耳鳴的管理課件
- 2026年七臺河職業(yè)學(xué)院單招職業(yè)技能測試題庫附答案
- 2021海灣消防 GST-LD-8318 緊急啟停按鈕使用說明書
- 煙花爆竹零售經(jīng)營安全責(zé)任制度
- 方小丹建筑地基基礎(chǔ)設(shè)計的若干問題課件
評論
0/150
提交評論