版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章程序調(diào)試及測(cè)試10.1程序開發(fā)流程10.2如何讓程序運(yùn)行 10.3VisualC++6.0集成環(huán)境的使用10.4程序錯(cuò)誤10.5軟件測(cè)試與軟件調(diào)試的概念10.6在IDE中調(diào)試程序10.7程序測(cè)試10.8本章小結(jié)
【主要內(nèi)容】
?程序調(diào)試環(huán)境VC6.0介紹;
?程序調(diào)試方法;
?程序測(cè)試方法。
【學(xué)習(xí)目標(biāo)】
?了解典型的軟件開發(fā)流程,能夠按照軟件開發(fā)流程編寫實(shí)際的應(yīng)用程序;
?了解編譯、鏈接的目的與意義;
?初步掌握程序調(diào)試的基本方法;
?了解程序測(cè)試方法。
無論一個(gè)程序的設(shè)計(jì)結(jié)構(gòu)是如何合理,也無論文檔如何完備,如果不能產(chǎn)生正確的結(jié)果,則其一文不值。
——《C++程序調(diào)試》[美]ChrisH.PappasWilliamH.Murray
任何一個(gè)天才都不敢說,他編的程序是完全正確的。幾乎每一個(gè)稍微復(fù)雜一點(diǎn)的程序都必須經(jīng)過反復(fù)的調(diào)試、修改,最終才能完成。
調(diào)試:在應(yīng)用程序中發(fā)現(xiàn)并排除錯(cuò)誤的過程。
調(diào)試是一個(gè)程序員應(yīng)該掌握的最基本的技能,其重要性甚至超過學(xué)習(xí)一門語(yǔ)言。不會(huì)調(diào)試,意味著程序員即使會(huì)一門編程語(yǔ)言,也不能編制出任何好的軟件。幾乎沒有首次編寫就不出錯(cuò)的代碼。對(duì)一定規(guī)模的程序,由讀源代碼來尋找bug基本不可行,用調(diào)試工具找bug是最有效率的方法。
調(diào)試有助于程序員了解程序的實(shí)際執(zhí)行過程及檢查設(shè)計(jì)與預(yù)想的一致性,提高程序開發(fā)效率;熟悉調(diào)試過程,可以讓程序員編寫出適合調(diào)試的代碼,提高對(duì)代碼的感知力和控制力。
調(diào)試工具是學(xué)習(xí)計(jì)算機(jī)系統(tǒng)和其他軟硬件知識(shí)的好幫手。通過軟件調(diào)試可以快速地了解一個(gè)軟件和系統(tǒng)的模塊、架構(gòu)和工作流程。調(diào)試方法一旦掌握,長(zhǎng)期受用。
“bug”與“debug”
英文bug一詞的原意是“臭蟲”或“蟲子”。但是現(xiàn)在,在電腦系統(tǒng)或程序中,對(duì)于一些隱藏著的未被發(fā)現(xiàn)的缺陷或問題,人們也叫它“bug”,這是怎么回事呢?
“bug”的命名者是格蕾絲·赫柏(GraceMurrayHopper),她是一位為美國(guó)海軍工作的電腦專家,也是最早將人類語(yǔ)言融入到電腦程序的人之一。1945年,計(jì)算機(jī)還是由機(jī)械式繼電器和真空管驅(qū)動(dòng)的,機(jī)器有房間那么大,體現(xiàn)當(dāng)時(shí)技術(shù)水平的HarvardMarkⅡ,是由哈佛大學(xué)制造的一個(gè)龐然大物。一天,當(dāng)赫柏通過設(shè)置MarkⅡ
中的17000個(gè)繼電器進(jìn)行編程后,她的工作卻毀于一只飛進(jìn)計(jì)算機(jī)內(nèi)部一組繼電器的觸點(diǎn)而造成短路的飛蛾。在報(bào)告中,赫柏用膠條貼上飛蛾,并用“bug”來表示“一個(gè)在電腦程序里的錯(cuò)誤”,從此“bug”這個(gè)說法一直沿用到今天。與bug相對(duì)應(yīng),人們將發(fā)現(xiàn)bug并加以糾正的過程叫做“debug”(中文稱做“調(diào)試”),意即“捉蟲子”或“殺蟲子”、排除(程序中的)錯(cuò)誤。
編程與調(diào)試都是程序開發(fā)中的重要環(huán)節(jié),那么程序開發(fā)的整個(gè)流程是怎樣的呢?圖10.1給出了開發(fā)軟件的一般流程,圖中橢圓框?yàn)榧庸ぃ匦慰驗(yàn)榧庸さ慕Y(jié)果。10.1程序開發(fā)流程
圖10.1程序開發(fā)流程用計(jì)算機(jī)解決問題,我們首先要對(duì)待解決的問題進(jìn)行分析,把其中的信息以及信息間的聯(lián)系提煉出來,然后確定數(shù)據(jù)及數(shù)據(jù)間的邏輯關(guān)系并確定它們的存儲(chǔ)方式,用編程語(yǔ)言中的數(shù)據(jù)類型描述出來,這樣就確定了數(shù)據(jù)結(jié)構(gòu),其后的算法設(shè)計(jì)是建立在數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)之上的。
程序員依據(jù)算法進(jìn)行程序設(shè)計(jì),完成之后,把源程序交給編譯器進(jìn)行編譯,如果有語(yǔ)法錯(cuò)誤,編譯器會(huì)給出錯(cuò)誤或告警,這時(shí)程序員根據(jù)提示找出程序中的錯(cuò)誤進(jìn)行修改,直到程序編譯通過,形成可執(zhí)行程序。之后再運(yùn)行可執(zhí)行程序,并根據(jù)測(cè)試用例進(jìn)行測(cè)試,查看結(jié)果是否正確。若結(jié)果沒有問題,則程序開發(fā)工作完成;若結(jié)果有問題,則進(jìn)行調(diào)試,找出程序中的錯(cuò)誤原因,確定是在問題分析、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)、算法設(shè)計(jì)、代碼設(shè)計(jì)的哪一步出的問題,做相應(yīng)的修改后重新編譯成執(zhí)行程序,重新測(cè)試,直至得到正確的結(jié)果。
測(cè)試用例:為驗(yàn)證程序是否達(dá)到設(shè)計(jì)要求而編制的一組測(cè)試數(shù)據(jù)、預(yù)期結(jié)果等內(nèi)容。
源程序:用高級(jí)語(yǔ)言或匯編語(yǔ)言編寫的程序代碼。
用C語(yǔ)言編寫好的源程序是不能在機(jī)器上直接運(yùn)行的,實(shí)際上任何高級(jí)語(yǔ)言源程序都要“翻譯”成機(jī)器語(yǔ)言才能在機(jī)器上運(yùn)行,“翻譯”的過程見圖10.2。10.2如何讓程序運(yùn)行
圖10.2C語(yǔ)言的翻譯執(zhí)行過程源程序經(jīng)過“編譯程序”的翻譯,形成計(jì)算機(jī)可以識(shí)別的二進(jìn)制代碼。
編譯的主要步驟是,讀取源程序,首先進(jìn)行預(yù)處理,即將其中的宏定義替換,將頭文件全部包含進(jìn)來,然后對(duì)其進(jìn)行詞法和語(yǔ)法的分析,沒有錯(cuò)誤則轉(zhuǎn)換為機(jī)器語(yǔ)言,生成目標(biāo)程序。
盡管目標(biāo)代碼已經(jīng)是機(jī)器指令,但還需要通過“鏈接程序”將各個(gè)目標(biāo)程序與庫(kù)函數(shù)連接,才能形成完整的可執(zhí)行程序。
程序上機(jī)運(yùn)行調(diào)試步驟如圖10.3所示。
圖10.3程序上機(jī)運(yùn)行調(diào)試步驟
(1)編輯(Edit):錄入源程序代碼。生成C源程序文件,后綴為.c(在VC6.0環(huán)境下為.cpp)。
(2)編譯(Compile):執(zhí)行編譯命令。如果有語(yǔ)法錯(cuò)誤,根據(jù)編譯器給出的錯(cuò)誤或告警信息,對(duì)程序中的錯(cuò)誤進(jìn)行修改,直到程序編譯通過。生成目標(biāo)文件,后綴為.obj。
(3)鏈接(Link):執(zhí)行鏈接命令。生成可執(zhí)行文件,后綴為.exe(在Windows下)。
(4)運(yùn)行(Run):執(zhí)行運(yùn)行命令。程序運(yùn)行,產(chǎn)生結(jié)果。
(5)查看程序結(jié)果:在相應(yīng)的輸出位置如指定的窗口或文件中查看程序的輸出結(jié)果。
(6)調(diào)試(Debug):如程序結(jié)果有錯(cuò)誤,要通過各種調(diào)試方法,找出程序錯(cuò)誤的原因并進(jìn)行修改,直至程序結(jié)果正確。
MicrosoftVisualC++(簡(jiǎn)稱VisualC++、MSVC、VC++或VC)是微軟公司的C++開發(fā)工具,具有集成開發(fā)環(huán)境(IntegratedDevelopmentEnvironment,IDE),是用于程序開發(fā)的應(yīng)用程序環(huán)境,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面工具。10.3VisualC++6.0集成環(huán)境的使用
VisualC++6.0集成開發(fā)環(huán)境
VisualC++系列產(chǎn)品是微軟公司推出的一款優(yōu)秀的C++集成開發(fā)環(huán)境,其產(chǎn)品定位為Windows95/98、NT、2000系列Win32系統(tǒng)程序開發(fā),由于其良好的界面和可操作性,被廣泛應(yīng)用。由于2000年以后,微軟全面轉(zhuǎn)向.NET平臺(tái),VisualC++6.0成為支持標(biāo)準(zhǔn)C/C++規(guī)范的最后版本。
利用VC++6.0提供的一種控制臺(tái)操作方式,可以建立C語(yǔ)言應(yīng)用程序,Win32控制臺(tái)程序(Win32ConsoleApplication)是一類Windows程序,它不使用復(fù)雜的圖形用戶界面,程序與用戶間的交互是通過一個(gè)標(biāo)準(zhǔn)的正文窗口進(jìn)行的。
下面對(duì)如何使用VisualC++6.0編寫簡(jiǎn)單的C語(yǔ)言應(yīng)用程序作一個(gè)初步的介紹。
1.啟動(dòng)VisualC++6.0環(huán)境
安裝完VisualC++6.0后,可以選擇如下兩種方式啟動(dòng):
(1)單擊開始→程序→MicrosoftVisualStudio6.0→MicrosoftVisualC++6.0;
(2)單擊開始→運(yùn)行→輸入“msdev”。
啟動(dòng)后的界面如圖10.4所示。菜單欄對(duì)應(yīng)的中文含義見表10.1。
表10.1主菜單
圖10.4啟動(dòng)界面
2.建立項(xiàng)目
編寫一個(gè)應(yīng)用程序首先要?jiǎng)?chuàng)建一個(gè)項(xiàng)目(Project),在創(chuàng)建項(xiàng)目的同時(shí)將創(chuàng)建項(xiàng)目工作區(qū)(Workspace)。項(xiàng)目工作區(qū)記錄了一個(gè)項(xiàng)目的集成開發(fā)環(huán)境的設(shè)置。
項(xiàng)目:在VisualC++IDE中,把實(shí)現(xiàn)程序設(shè)計(jì)功能的一組相互關(guān)聯(lián)的C++源文件、資源文件以及支撐這些文件的類的集合稱為一個(gè)項(xiàng)目。VisualC++IDE以項(xiàng)目作為程序開發(fā)的基本單位,項(xiàng)目用于管理組成應(yīng)用程序的所有元素,并由它生成應(yīng)用程序。
(1)選擇菜單命令File→New或使用熱鍵Ctrl+N啟動(dòng)新建向?qū)В缑嫒鐖D10.5所示。步驟為:①在Projects屬性中選擇Win32ConsoleApplication(Win32控制臺(tái)應(yīng)用程序);②在Projectname中輸入項(xiàng)目名稱,如demo;③在Location中選擇項(xiàng)目存儲(chǔ)路徑,如D:\TEST\demo,項(xiàng)目所有文件將保存在此路徑下;④單擊“確定”按鈕,進(jìn)入下一界面,如圖10.6所示。
圖10.5新建向?qū)?/p>
圖10.6Win32ConsoleApplication界面特別提醒:若項(xiàng)目項(xiàng)未指定“Win32ConsoleApplication”,可能會(huì)出現(xiàn)鏈接錯(cuò)誤。
說明:Win32ConsoleApplication是基于DOS開發(fā)平臺(tái)開發(fā)應(yīng)用程序,不能使用與圖形有關(guān)的函數(shù),控制臺(tái)程序入口函數(shù)是main。如果編寫傳統(tǒng)的C程序,必須建立Win32Console程序。
(2)在圖10.6所示界面中選擇Anemptyproject,然后點(diǎn)擊“Finish”按鈕,系統(tǒng)顯示如圖10.7所示的界面。如果想退回上一步,可以選擇“Back”按鈕。
圖10.7NewProjectInformation界面
(3)在圖10.7中選擇“OK”按鈕,系統(tǒng)完成項(xiàng)目的創(chuàng)建,顯示如圖10.8所示的界面。
3.在項(xiàng)目中新建源程序文件
選擇菜單命令File→New,啟動(dòng)新建向?qū)В缑嫒鐖D10.9所示。
首先在圖10.9的Files屬性中選擇C++SourceFile項(xiàng),然后在Filename中輸入文件名(如MyTest),最后單擊“OK”按鈕,出現(xiàn)如圖10.10所示的界面。
關(guān)于文件名,要注意兩點(diǎn):不要輸入文件后綴;文件名最好要有特定含義,便于管理。
圖10.8完成項(xiàng)目創(chuàng)建
圖10.9新建源程序向?qū)?/p>
圖10.10新建文件
4.編輯源程序
在圖10.11所示的文件編輯區(qū)中可直接編輯源程序文件。
編輯好后要保存源程序,選擇圖10.11File菜單中的Save命令即可保存當(dāng)前文件。圖10.11文件編輯
5.編譯源程序
可通過菜單命令Build→Compile或熱鍵Ctrl+F7對(duì)當(dāng)前打開的源程序進(jìn)行編譯。
(1)若是首次編譯,則系統(tǒng)會(huì)彈出一個(gè)對(duì)話框,提示要建立一個(gè)項(xiàng)目工作區(qū)(projectworkspace),如圖10.12所示。
圖10.12建立項(xiàng)目工作區(qū)對(duì)話框
(2)系統(tǒng)將在如圖10.13所示的編譯信息輸出區(qū)顯示代碼的編譯結(jié)果。
(3)編譯完成后,當(dāng)程序有錯(cuò)誤時(shí),可直接雙擊輸出區(qū)中的“error”處,系統(tǒng)將自動(dòng)跳至編輯區(qū)源程序中相應(yīng)錯(cuò)誤的行,并在左側(cè)用箭頭指示,如圖10.14所示。
(4)修改源程序中的錯(cuò)誤,再進(jìn)行編譯,直至編譯成功,如圖10.15所示。編譯成功,將生成目標(biāo)文件:文件名.obj。圖10.13編譯信息輸出區(qū)
圖10.14編譯錯(cuò)誤提示
圖10.15編譯成功提示注意:編譯結(jié)果可能有一些問題。如果編譯完全成功,會(huì)顯示“0error(s),0warning(s)”。有時(shí),即使有一些警告,也可能編譯成功,這種情形下表示該代碼可以運(yùn)行,但有可能存在潛在的問題,編譯器不推薦這么寫。
6.鏈接程序
編譯成功后,執(zhí)行鏈接命令Build→Build或使用熱鍵F7,系統(tǒng)在輸出區(qū)顯示鏈接結(jié)果,如圖10.16所示。
鏈接成功,生成可執(zhí)行目標(biāo)代碼文件:項(xiàng)目名.exe。注意此處可執(zhí)行文件名是“項(xiàng)目名”。
7.運(yùn)行程序
可通過菜單命令Build(組建)→Excute(執(zhí)行)或熱鍵Ctrl+F5運(yùn)行程序。運(yùn)行成功,在控制臺(tái)窗口輸出執(zhí)行結(jié)果,如圖10.17所示。
圖10.16鏈接結(jié)果
圖10.17程序運(yùn)行結(jié)果注意:如果出現(xiàn)結(jié)果錯(cuò)誤或結(jié)果不令人滿意,則應(yīng)找出問題,并修改源程序文件,然后重新編譯、鏈接和執(zhí)行。
對(duì)于圖10.17所示的結(jié)果,如果希望“Pressanykeytocontinue”另起一行顯示,則需要修改程序,在printf中添加\n,再重新編譯、鏈接,再執(zhí)行后的結(jié)果如圖10.18所示。圖10.18修改程序后的運(yùn)行結(jié)果
圖10.19所示為程序錯(cuò)誤的分類。
程序中的錯(cuò)誤大體可分為兩類:編譯期錯(cuò)誤和運(yùn)行期錯(cuò)誤。10.4程序錯(cuò)誤
圖10.19程序錯(cuò)誤分類
1.編譯期錯(cuò)誤
編譯期錯(cuò)誤又可分為以下兩種:
(1)語(yǔ)法錯(cuò)誤:由于違反了語(yǔ)言有關(guān)語(yǔ)句形式或使用規(guī)則而產(chǎn)生的錯(cuò)誤。例如,關(guān)鍵字拼錯(cuò)、變量名定義錯(cuò)、沒有正確地使用標(biāo)點(diǎn)符號(hào)、分支結(jié)構(gòu)或循環(huán)結(jié)構(gòu)語(yǔ)句的結(jié)構(gòu)不完整或不匹配、函數(shù)調(diào)用缺少參數(shù)或傳遞了不匹配的參數(shù)等。
(2)鏈接錯(cuò)誤:鏈接程序在裝配目標(biāo)程序時(shí)發(fā)現(xiàn)的錯(cuò)誤。例如,庫(kù)函數(shù)名書寫錯(cuò)誤、缺少包含文件或包含文件的路徑錯(cuò)誤等。
2.運(yùn)行期錯(cuò)誤
運(yùn)行期錯(cuò)誤又可分為以下兩種:
(1)邏輯錯(cuò)誤:程序的運(yùn)行結(jié)果和程序員的設(shè)想有出入的錯(cuò)誤,是程序設(shè)計(jì)上的錯(cuò)誤。這類錯(cuò)誤并不在程序的編譯期間或運(yùn)行期間出現(xiàn),較難發(fā)現(xiàn)和排除。程序員的語(yǔ)言功底和編程經(jīng)驗(yàn)在排除這類錯(cuò)誤時(shí)很重要。例如,設(shè)置的選擇條件不合適、循環(huán)次數(shù)不當(dāng)?shù)取?/p>
(2)運(yùn)行異常:應(yīng)用程序運(yùn)行期間,試圖執(zhí)行不可能執(zhí)行的操作而產(chǎn)生的錯(cuò)誤。例如,執(zhí)行除法操作時(shí)除數(shù)為0、無效的輸入格式、打開的文件未找到、磁盤空間不足等。
3.編譯警告
如果程序包含的內(nèi)容直接違反C語(yǔ)言的語(yǔ)法規(guī)則,編譯器會(huì)提示一條錯(cuò)誤消息。但是,編譯器有時(shí)只給出一條警告消息,表明代碼從技術(shù)上來說沒有違反語(yǔ)法規(guī)則,但因它出乎尋常,所以可能是一個(gè)錯(cuò)誤。在程序開發(fā)階段,應(yīng)該將每個(gè)警告都視為錯(cuò)誤。
一方面,軟件缺陷難以避免,另一方面其危害又很大,這使得消除軟件缺陷成為軟件工程中的一項(xiàng)重要的任務(wù)。
發(fā)現(xiàn)軟件的缺陷,是軟件測(cè)試的任務(wù);找到軟件缺陷的原因,是軟件調(diào)試的工作。
10.5軟件測(cè)試與軟件調(diào)試的概念
軟件測(cè)試(SoftwareTesting):使用人工或自動(dòng)手段來運(yùn)行或測(cè)定某個(gè)系統(tǒng)的過程,檢驗(yàn)它是否滿足規(guī)定的需求或是弄清預(yù)期結(jié)果與實(shí)際結(jié)果之間的差別。
軟件調(diào)試(SoftwareDebugging):探索軟件缺陷的根源并尋求其解決方案的過程。
軟件測(cè)試的目的是發(fā)現(xiàn)軟件中的各種缺陷,目標(biāo)是以較少的用例、時(shí)間和人力找出軟件中的各種錯(cuò)誤和缺陷,以確保軟件的質(zhì)量。
消除軟件缺陷的前提是要找到導(dǎo)致缺陷的根本原因。在軟件調(diào)試的各步驟中,定位根源常常是最困難也是最關(guān)鍵的步驟,它是調(diào)試過程的核心和靈魂。
軟件調(diào)試是軟件開發(fā)和維護(hù)中非常頻繁的一項(xiàng)任務(wù)。
在復(fù)雜的計(jì)算機(jī)系統(tǒng)中尋找軟件缺陷不是一個(gè)簡(jiǎn)單的任務(wù)。
應(yīng)用程序調(diào)試很多時(shí)候耗費(fèi)了比設(shè)計(jì)編碼還要多的時(shí)間。
——《軟件調(diào)試》張銀奎
Debuggingistwiceashardaswritingthecodeinthefirstplace.Therefore,ifyouwritethecodeascleverlyaspossible,youare,bydefinition,notsmartenoughtodebugit.
(軟件調(diào)試要比編寫代碼困難一倍,如果你發(fā)揮了最大才智編寫代碼,那么你的智商便不足以調(diào)試這個(gè)代碼。)
——BrianW.Kernighan
軟件調(diào)試(SoftwareDebug)
debug直接的意思是就是去除bug,但實(shí)際還包含了尋找和定位bug,如何找到bug大都比發(fā)現(xiàn)后去除它要難得多。
自20世紀(jì)50年代開始,人們用debug來泛指排除錯(cuò)誤的過程,包括重現(xiàn)軟件故障、定位故障根源,并最終解決軟件問題的過程。軟件調(diào)試的另一種更通俗的解釋是——使用調(diào)試工具求解各種軟件問題的過程,例如跟蹤軟件的執(zhí)行過程,探索軟件本身或與其配套的其他軟件或者硬件系統(tǒng)的工作原理等。
1.調(diào)試的基本過程
調(diào)試流程見圖10.20。
(1)重現(xiàn)故障:通常是在用于調(diào)試的系統(tǒng)上重復(fù)導(dǎo)致故障的步驟,使要解決的問題出現(xiàn)在被調(diào)試的系統(tǒng)中。
(2)定位根源:綜合利用各種調(diào)試工具,使用各種調(diào)試手段尋找導(dǎo)致軟件故障的根源。
(3)探索和實(shí)現(xiàn)解決方案:根據(jù)尋找到的故障根源、資源情況等設(shè)計(jì)和實(shí)現(xiàn)解決方案。
(4)驗(yàn)證方案:在目標(biāo)環(huán)境中測(cè)試方案的有效性。
圖10.20調(diào)試流程
2.調(diào)試的基本手段
具體地說,調(diào)試就是跟蹤和記錄CPU執(zhí)行軟件的過程,把動(dòng)態(tài)的瞬間凝固下來供檢查和分析?;镜恼{(diào)試方法如表10.2所示。
表10.2調(diào)試方法所謂單步執(zhí)行,就是讓程序一步一步地執(zhí)行,這里的一步可以是一條匯編指令、源代碼的一條語(yǔ)句、程序的一個(gè)分支、一個(gè)任務(wù)(線程)等。單步執(zhí)行是深入診斷軟件動(dòng)態(tài)特征的一種有效方法。但從頭到尾跟蹤執(zhí)行一段程序乃至一個(gè)模塊,一般都顯得效率太低。常用的方法是先使用斷點(diǎn)功能將程序中斷到感興趣的位置,然后再單步執(zhí)行關(guān)鍵的代碼。
程序的調(diào)試版與發(fā)布版
我們之所以可以使用調(diào)試器對(duì)項(xiàng)目進(jìn)行調(diào)試,是因?yàn)樵诰幾g單元之中包含有調(diào)試過程所需要的調(diào)試信息。因此,應(yīng)當(dāng)在使用調(diào)試器之前,通過編譯器將需要的調(diào)試信息嵌入到編譯單元之中。
Debug通常稱為調(diào)試版本,它包含調(diào)試信息,可以單步執(zhí)行、跟蹤等,便于程序員調(diào)試程序。它不對(duì)代碼作任何優(yōu)化,生成的可執(zhí)行文件比較大,代碼運(yùn)行速度較慢。
Release稱為發(fā)布版本,它往往是進(jìn)行了各種優(yōu)化,使得程序在代碼大小和運(yùn)行速度上都是最優(yōu)的,以便用戶很好地使用,但在其編譯條件下無法執(zhí)行調(diào)試功能。
Debug和Release的真正秘密,在于IDE中的一組編譯選項(xiàng),見圖10.21。調(diào)試版本使用一組編譯選項(xiàng)來幫助進(jìn)行調(diào)試;在程序編寫、調(diào)試完畢準(zhǔn)備發(fā)布之前,再通過編譯選項(xiàng)將調(diào)試信息剔出,由此來產(chǎn)生有高效代碼的發(fā)布版本。
圖10.21Debug和Release選項(xiàng)
在軟件世界里,螺絲刀、萬(wàn)用表等傳統(tǒng)的探測(cè)和修理工具都不再適用了,取而代之的是以調(diào)試器為核心的各種軟件調(diào)試工具。
——《軟件調(diào)試》張銀奎10.6在IDE中調(diào)試程序
對(duì)于程序中錯(cuò)誤的查找,系統(tǒng)提供了易用且有效的調(diào)試手段。在IDE中是通過各種命令來控制程序的運(yùn)行節(jié)奏,把程序運(yùn)行動(dòng)態(tài)的瞬間凝固下來,以方便跟蹤、檢查、分析、記錄CPU執(zhí)行軟件的過程。10.6.1進(jìn)入調(diào)試程序環(huán)境
選擇菜單命令Build→StartDebug→StepInto,系統(tǒng)進(jìn)入調(diào)試程序界面。其中同時(shí)提供了多種窗口監(jiān)視程序運(yùn)行,如圖10.22所示。
注意:在執(zhí)行“StepInto”后“Build”菜單名變?yōu)椤癉ebug”,如圖10.23所示。
圖10.24是調(diào)試工具條,中間的命令圖標(biāo)和圖10.23Debug菜單中的命令相對(duì)應(yīng)。
圖10.22調(diào)試程序界面
圖10.23Debug菜單
圖10.24調(diào)試工具條10.6.2調(diào)試命令
常用調(diào)試命令見表10.3。
(1)單步跟蹤進(jìn)入子函數(shù)(StepInto,F(xiàn)11):每按一次F11鍵,程序執(zhí)行一條無法再進(jìn)行分解的程序行,如果涉及子函數(shù),則會(huì)進(jìn)入子函數(shù)內(nèi)部。
(2)單步跟蹤跳過子函數(shù)(StepOver,F(xiàn)10):每按一次F10鍵,程序執(zhí)行一行;Watch窗口可以顯示變量名及其當(dāng)前值,在單步執(zhí)行的過程中,可以在Watch窗口中加入需觀察的變量,加以輔助監(jiān)視,隨時(shí)了解變量當(dāng)前的情況,如果涉及子函數(shù),則不會(huì)進(jìn)入子函數(shù)內(nèi)部。
表10.3常用調(diào)試命令一覽表
(3)單步跟蹤跳出子函數(shù)(StepOut,Shift+F11):按下Shift+F11鍵后,程序運(yùn)行至當(dāng)前函數(shù)的末尾,然后從當(dāng)前子函數(shù)跳到上一級(jí)主調(diào)函數(shù)。
(4)運(yùn)行到當(dāng)前光標(biāo)處(RuntoCursor,Ctrl+F10):按下Ctrl+F10鍵后,程序運(yùn)行至當(dāng)前光標(biāo)處所在的語(yǔ)句。10.6.3程序運(yùn)行狀態(tài)的查看
調(diào)試過程中最重要的是要觀察程序在運(yùn)行過程中的狀態(tài),這樣才能找出程序的錯(cuò)誤之處。這里所說的狀態(tài)包括各變量的值、寄存中的值、內(nèi)存中的值、堆棧中的值等。為此需要利用各種工具來幫助我們查看程序的狀態(tài)。
選擇菜單命令View→DebugWindows,進(jìn)入Debug窗口菜單,如圖10.25所示,各個(gè)窗口的含義如表10.4所示。
圖10.25Debug窗口菜單
表10.4查看窗口系統(tǒng)支持查看程序運(yùn)行到當(dāng)前指令語(yǔ)句時(shí)變量、表達(dá)式和內(nèi)存的值,所有這些觀察都必須是在單步跟蹤或斷點(diǎn)中斷的情況下進(jìn)行的。圖10.26Watch窗口圖10.27Variables窗口
1.Watch(觀察)窗口
Watch窗口如圖10.26所示。
在Watch窗口中輸入想要查看的變量或者表達(dá)式,就可以看到相應(yīng)的值。
單步調(diào)試程序的過程中,可以在Watch窗口中看到變量值的動(dòng)態(tài)變化,我們以此判斷程序是否在正確運(yùn)行。圖10.28Memory窗口2.Variables(變量)窗口
Variables窗口如圖10.27所示。
Variables窗口中會(huì)自動(dòng)顯示所有當(dāng)前執(zhí)行語(yǔ)句前后可見的變量的值。特別是當(dāng)前指令語(yǔ)句涉及的變量,將以紅色顯示。
如果本地變量比較多,自動(dòng)顯示的窗口會(huì)比較混亂,這時(shí)用Watch窗口查看會(huì)比較清晰。
3.Memory(內(nèi)存)窗口
Memory窗口如圖10.28所示。
Memory窗口用于顯示某個(gè)地址開始處的內(nèi)存信息,默認(rèn)地址為0×00000000。
Watch窗口只能查看固定變量長(zhǎng)度的內(nèi)容,而Memory窗口則可以顯示連續(xù)地址的內(nèi)容。在Memory窗口中需要輸入地址,該地址可以通過Watch窗口查找到。Watch窗口不但顯示變量的內(nèi)容,還會(huì)顯示每個(gè)變量的地址。
4.Registers(寄存器)窗口
Registers窗口用于顯示當(dāng)前所有寄存器的值。
5.CallStack(調(diào)用堆棧)
調(diào)用堆棧反映了當(dāng)前斷點(diǎn)處函數(shù)是被哪些函數(shù)按照什么順序調(diào)用的。CallStack窗口中顯示了一個(gè)調(diào)用系列,最上面的是當(dāng)前函數(shù),往下依次是調(diào)用函數(shù)的上級(jí)函數(shù)。單擊這些函數(shù)名可以跳到對(duì)應(yīng)的函數(shù)中。10.6.4斷點(diǎn)設(shè)置
為方便較大規(guī)模程序的跟蹤,設(shè)置斷點(diǎn)(Breakpoints)是最常用的技巧。
斷點(diǎn)是調(diào)試器在代碼中設(shè)置的一個(gè)位置。當(dāng)程序運(yùn)行到斷點(diǎn)時(shí),程序中斷執(zhí)行,回到調(diào)試器,以便程序員檢查程序代碼、變量值等。
程序在斷點(diǎn)處停止后,可以進(jìn)一步讓程序單步執(zhí)行,來查看程序是否在按照所預(yù)想的方式運(yùn)行??梢酝ㄟ^菜單命令Edit→Breakpoints或快捷鍵F9設(shè)置一個(gè)斷點(diǎn),這里只介紹簡(jiǎn)
單的快捷方式設(shè)置方法,功能見表10.5。
使用快捷方式設(shè)置斷點(diǎn),首先把光標(biāo)移動(dòng)到需要設(shè)置斷點(diǎn)的代碼行上,然后按快捷鍵F9或者單擊“編譯”工具條上的按鈕 ,斷點(diǎn)處所在的程序行的左側(cè)會(huì)出現(xiàn)一個(gè)紅色圓點(diǎn),再按一次則清除斷點(diǎn),如圖10.29所示。
圖10.29斷點(diǎn)設(shè)置10.6.5程序調(diào)試的例子
1.設(shè)置斷點(diǎn)的跟蹤方法
選定printf語(yǔ)句作為斷點(diǎn)位置,如圖10.30所示。
圖10.30斷點(diǎn)調(diào)試步驟1可以通過菜單命令Build→StartDebug→Go或熱鍵F5使程序運(yùn)行到斷點(diǎn)。程序執(zhí)行到第一個(gè)斷點(diǎn)處將暫停執(zhí)行,調(diào)試程序在程序行的左側(cè)添加一個(gè)黃色箭頭,表示程序?qū)⒁獔?zhí)行此條語(yǔ)句,此時(shí)用戶可進(jìn)行變量等的觀察。繼續(xù)執(zhí)行該命令,程序運(yùn)行到下一個(gè)相鄰的斷點(diǎn),如后面沒有斷點(diǎn),則執(zhí)行到程序結(jié)束。
可以通過菜單命令View→DebugWindows→Watch查看變量的值。在圖10.31的Watch窗口中輸入變量名,就可以看到它的值。Name列為要監(jiān)控的表達(dá)式或變量,Value列為對(duì)應(yīng)的值,通過該窗口可監(jiān)控在程序運(yùn)行過程中表達(dá)式值的變化。
圖10.31
斷點(diǎn)調(diào)試步驟2
按F5鍵繼續(xù)執(zhí)行程序,得到輸出結(jié)果,如圖10.32所示。
2.單步跟蹤的方法
選擇菜單命令Build→StartDebug→StepInto或按熱鍵F11,進(jìn)入程序單步跟蹤調(diào)試狀態(tài)。
圖10.33所示為跟蹤調(diào)試步驟1,程序從主函數(shù)main開始運(yùn)行,注意此時(shí)Build菜單變?yōu)镈ebug。
可以通過菜單命令Debug→StepOver或熱鍵F10使程序單步運(yùn)行。
圖10.34所示為跟蹤調(diào)試步驟2,每按一次F10鍵,程序單步執(zhí)行一條語(yǔ)句,語(yǔ)句指示箭頭下移一行。
圖10.32
斷點(diǎn)調(diào)試步驟3
圖10.33跟蹤調(diào)試步驟1
圖10.34跟蹤調(diào)試步驟2圖10.35所示為跟蹤調(diào)試步驟3,在Watch窗口中可以查看相關(guān)的變量。變量b和c并未在程序中賦成顯示的值,這是因?yàn)檫€未執(zhí)行到相應(yīng)的賦值語(yǔ)句,其變量單元的值是隨機(jī)的,而非預(yù)想的。
可以通過菜單命令Debug→RuntoCursor或熱鍵Ctrl+F10讓程序運(yùn)行到指定的位置。
圖10.36所示為跟蹤調(diào)試步驟4。
圖10.35跟蹤調(diào)試步驟3
圖10.36跟蹤調(diào)試步驟4先把光標(biāo)設(shè)到指定的位置,如return0語(yǔ)句行,按下Ctrl+F10鍵,程序會(huì)運(yùn)行到return0語(yǔ)句前一條停下來,黃色箭頭指在return0語(yǔ)句前,此時(shí)可以查看變量的值、變量的地址(變量前加&符號(hào)),也可以查看控制臺(tái)窗口的數(shù)據(jù)輸出情形(如圖10.37所示)。
圖10.38顯示了多個(gè)窗口信息,0x12ff7c是變量a的地址,在Memory窗口中也可以查看這個(gè)地址的值。
Memory窗口中,最左側(cè)一列為內(nèi)存地址,依次向右的四列為內(nèi)存中的內(nèi)容,以十六進(jìn)制表示,最后一列為內(nèi)存內(nèi)容的文本顯示。
圖10.37控制臺(tái)窗口信息
圖10.38多個(gè)窗口信息10.6.6有關(guān)聯(lián)機(jī)幫助
VisualC++6.0提供了詳細(xì)的幫助信息。MSDN(MicrosoftDeveloperNetwork,微軟開發(fā)者網(wǎng)絡(luò))是微軟公司面向軟件開發(fā)者提供的一種信息服務(wù)。程序員可以根據(jù)需要選擇多種方式使用MSDN,可以安裝在自己的機(jī)器上,也可以在線使用MSDN。
在機(jī)器上安裝MSDN后,通過選擇“幫助”(Help)菜單下的“幫助目錄”(Contents)命令就可以進(jìn)入幫助系統(tǒng)。在源文件編輯器中把光標(biāo)定位在一個(gè)需要查詢的單詞處,然后按F1鍵也可以進(jìn)入VisualC++6.0的幫助系統(tǒng)。用戶通過VisualC++6.0的幫助系統(tǒng)可以獲得幾乎所有VisualC++6.0的技術(shù)信息,這也是VisualC++作為一個(gè)非常友好的開發(fā)環(huán)境所具有的特色之一。
程序測(cè)試(ProgramTesting):是指對(duì)一個(gè)完成了全部或部分功能、模塊的計(jì)算機(jī)程序在正式使用前的檢測(cè),以確保該程序能按預(yù)定的方式正確地運(yùn)行。
10.7程序測(cè)試目前,軟件的正確性證明尚未得到根本的解決,軟件測(cè)試仍是發(fā)現(xiàn)軟件錯(cuò)誤和缺陷的主要手段。軟件測(cè)試所追求的是以盡可能少的時(shí)間和人力發(fā)現(xiàn)軟件產(chǎn)品盡可能多的錯(cuò)誤,高效的測(cè)試是指用少量的測(cè)試用例發(fā)現(xiàn)被測(cè)軟件盡可能多的錯(cuò)誤。
1.測(cè)試用例(TestCase)
一個(gè)測(cè)試用例必須包括兩個(gè)部分:
(1)對(duì)程序的輸入數(shù)據(jù)的描述。
(2)對(duì)程序在上述輸入數(shù)據(jù)下應(yīng)有的正確輸出結(jié)果的精確描述。
2.測(cè)試用例制定的原則
制定測(cè)試用例的基本目標(biāo)是:設(shè)計(jì)一組發(fā)現(xiàn)某個(gè)錯(cuò)誤或某類錯(cuò)誤的測(cè)試數(shù)據(jù)。測(cè)試用例要包括欲測(cè)試的功能、應(yīng)輸入的數(shù)據(jù)和預(yù)期的輸出結(jié)果。測(cè)試用例應(yīng)該選用少量、高效的測(cè)試數(shù)據(jù)進(jìn)行盡可能完備的測(cè)試。
程序測(cè)試方法
1.
白盒測(cè)試
白盒測(cè)試也稱結(jié)構(gòu)測(cè)試或邏輯驅(qū)動(dòng)測(cè)試。
白盒的意思是被測(cè)試的軟件是“可視的”,測(cè)試者清楚盒子內(nèi)部的內(nèi)容及運(yùn)作方式。測(cè)試人員依據(jù)程序內(nèi)部邏輯結(jié)構(gòu)的相關(guān)信息,設(shè)計(jì)或選擇測(cè)試用例,對(duì)程序所有邏輯路徑進(jìn)行測(cè)試,通過在不同點(diǎn)檢查程序的狀態(tài),確定實(shí)際的狀態(tài)是否與預(yù)期的狀態(tài)一致。
白盒測(cè)試主要是對(duì)程序模塊進(jìn)行如下檢查:
(1)對(duì)程序模塊的所有獨(dú)立的執(zhí)行路徑至少測(cè)試一遍。
(2)對(duì)所有的邏輯判定,取“真”與取“假”的兩種情況都能至少測(cè)試一遍。
(3)在循環(huán)的邊界和運(yùn)行的界限內(nèi)執(zhí)行循環(huán)體。
(4)測(cè)試內(nèi)部數(shù)據(jù)結(jié)構(gòu)的有效性。
白盒測(cè)試的主要方法有邏輯驅(qū)動(dòng)測(cè)試、基本路徑測(cè)試等。
2.黑盒測(cè)試
黑盒測(cè)試也稱功能測(cè)試或數(shù)據(jù)驅(qū)動(dòng)測(cè)試。
在測(cè)試時(shí),把程序看做一個(gè)不能打開的黑盒子,它不考慮軟件的內(nèi)部結(jié)構(gòu)和處理算法,測(cè)試者在程序接口進(jìn)行測(cè)試,它只檢查程序功能是否按照需求規(guī)格說明書的規(guī)定正常使用,程序是否能適當(dāng)?shù)亟邮蛰斎霐?shù)據(jù)而產(chǎn)生正確的輸出信息。
黑盒測(cè)試主要是為了發(fā)現(xiàn)以下幾類錯(cuò)誤:
(1)是否有不正確或遺漏的功能?
(2)在接口上,輸入是否能正確地被接收?能否輸出正確的結(jié)果?
(3)是否有數(shù)據(jù)結(jié)構(gòu)錯(cuò)誤或外部信息(如數(shù)據(jù)文件)訪問錯(cuò)誤?
(4)性能上是否能夠滿足要求?
(5)是否有初始化或終止性錯(cuò)誤?
常用的黑盒測(cè)試技術(shù)包括等價(jià)類劃分、邊值分析、錯(cuò)誤推測(cè)和因果圖等。
3.測(cè)試用例主要覆蓋方面
(1)正確性測(cè)試:輸入用戶實(shí)際數(shù)據(jù)以驗(yàn)證系統(tǒng)是滿足需求規(guī)格說明書的要求;測(cè)試用例中的測(cè)試點(diǎn)應(yīng)首先保證要至少覆蓋需求規(guī)格說明書中的各項(xiàng)功能,并且正常。
(2)容錯(cuò)性(健壯性)測(cè)試:程序能夠接收正確數(shù)據(jù)輸入并且產(chǎn)生正確(預(yù)期)的輸出,輸入非法數(shù)據(jù)(非法類型、不符合要求的數(shù)據(jù)、溢出數(shù)據(jù)等),程序應(yīng)能給出提示,并進(jìn)行相應(yīng)處理??梢园炎约合胂蟪梢幻麑?duì)產(chǎn)品操作一無所知的客戶
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度企業(yè)法律培訓(xùn)法律顧問聘用協(xié)議2篇
- 2025年度公司與自然人環(huán)境保護(hù)治理合作協(xié)議3篇
- 2025年度智能交通領(lǐng)域公司合作股權(quán)協(xié)議書模板3篇
- 農(nóng)村家庭房屋分割與農(nóng)村環(huán)境保護(hù)合作協(xié)議(2025年度)
- 二零二五年度茶葉電商平臺(tái)客戶服務(wù)合作協(xié)議3篇
- 二零二五年度養(yǎng)殖場(chǎng)養(yǎng)殖技術(shù)指導(dǎo)服務(wù)合同3篇
- 2025農(nóng)村回遷房買賣合同(含公共設(shè)施配套)
- 二零二五年度生態(tài)農(nóng)業(yè)示范園-鄉(xiāng)土樹種批量采購(gòu)合同
- 2025年公司年會(huì)場(chǎng)地租賃及布置服務(wù)合同3篇
- 2025年度農(nóng)產(chǎn)品冷鏈物流配送合同版3篇
- 鋼結(jié)構(gòu)工程實(shí)測(cè)實(shí)量
- 國(guó)開2023法律職業(yè)倫理-形考冊(cè)答案
- 醫(yī)院物業(yè)服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 排水管網(wǎng)清淤疏通方案(技術(shù)方案)
- 什么是冠狀動(dòng)脈左主干狹窄心電圖的“6+2”現(xiàn)象
- 商丘市睢陽(yáng)牧原農(nóng)牧有限公司八場(chǎng)生豬養(yǎng)殖項(xiàng)目環(huán)境影響報(bào)告
- 油田用聚合物驅(qū)油劑相關(guān)知識(shí)
- 護(hù)理病例分析試題題庫(kù)
- 10kV及以下電力客戶受電工程中間檢查和竣工檢驗(yàn)規(guī)范試
- 領(lǐng)導(dǎo)干部實(shí)績(jī)報(bào)告表表樣
- COMMERCIAL INVOICE 商業(yè)發(fā)票模板
評(píng)論
0/150
提交評(píng)論