郭樹文
(赤峰市環(huán)境科學(xué)研究院,內(nèi)蒙古 赤峰 024000)
VS.NET中對(duì)應(yīng)用程序進(jìn)行調(diào)試的方法和步驟
郭樹文
(赤峰市環(huán)境科學(xué)研究院,內(nèi)蒙古 赤峰 024000)
本文介紹了在Visual Studio.NET的IDE環(huán)境中對(duì)應(yīng)用程序進(jìn)行調(diào)試的方法和步驟,并介紹了VS.NET中的調(diào)試工具.
應(yīng)用程序;錯(cuò)誤;調(diào)試
開發(fā)出應(yīng)用程序后,必須先確保其沒有錯(cuò)誤并且安全可靠,然后才能將其交付給用戶.也就是說,在確定應(yīng)用程序可以發(fā)布之前,必須先徹底檢查該應(yīng)用程序是否存在錯(cuò)誤,并且應(yīng)糾正遇到的任何錯(cuò)誤.其實(shí),任何實(shí)際的應(yīng)用軟件都不能保證完全沒有錯(cuò)誤,但是程序員要保證盡力發(fā)現(xiàn)軟件存在的錯(cuò)誤并修正這些錯(cuò)誤.搜尋和消除錯(cuò)誤的過程稱為調(diào)試.調(diào)試過程是一個(gè)程序員最重要的工作之一.
本文將詳細(xì)討論如何對(duì)C#中的應(yīng)用程序進(jìn)行調(diào)試、排除錯(cuò)誤.
以某大型購(gòu)物中心的場(chǎng)景為例,該中心使用計(jì)算機(jī)處理其計(jì)費(fèi)系統(tǒng).此系統(tǒng)接受顧客所購(gòu)所有商品的名稱和價(jià)格,計(jì)算總額,減去折扣(如果有),然后輸出最終的帳單金額.假設(shè)在事務(wù)處理過程中,收銀員的計(jì)算機(jī)屏幕顯示一則錯(cuò)誤消息,然后應(yīng)用程序終止.這時(shí)候必須重新執(zhí)行未完成的當(dāng)前事務(wù)處理,還必須重新輸入全部信息.但是,如果程序員已經(jīng)預(yù)先編寫代碼對(duì)這種情況進(jìn)行處理,這種錯(cuò)誤就不會(huì)發(fā)生,系統(tǒng)也不會(huì)崩潰.
必須先完全消除所有已經(jīng)發(fā)現(xiàn)的語(yǔ)法錯(cuò)誤和語(yǔ)義錯(cuò)誤,然后才能成功部署應(yīng)用程序.而在將軟件視為完全可靠之前,應(yīng)該先對(duì)其進(jìn)行測(cè)試.軟件測(cè)試過程是軟件開發(fā)過程中的一個(gè)重要組成部分.但是,盡管測(cè)試有助于確定輸出結(jié)果是否正確,但它無(wú)法確定錯(cuò)誤發(fā)生的確切位置.這就是需要使用調(diào)試的原因.
測(cè)試是對(duì)開發(fā)人員認(rèn)為正確的許多方面進(jìn)行確認(rèn),直至開發(fā)人員發(fā)現(xiàn)其中一項(xiàng)不正確的這樣一個(gè)過程.而調(diào)試就是找出并改正這些不正確項(xiàng)的過程.
例如,程序員認(rèn)為變量X的值在某一時(shí)間將為12,或認(rèn)為在函數(shù)調(diào)用AREA(number,5)中接收到參數(shù)number和5的值是正確的.程序員對(duì)此如何確認(rèn)?答案是使用調(diào)試工具.調(diào)試工具雖然無(wú)法確定錯(cuò)誤,但是對(duì)于確定錯(cuò)誤發(fā)生的位置極為有用.建議在所有的編程工作中使用一個(gè)調(diào)試工具. Visual Studio.NET的IDE帶有調(diào)試工具.
語(yǔ)法錯(cuò)誤是編碼過程中遇到的最明顯的一類錯(cuò)誤.程序員在編寫代碼的過程中不遵循語(yǔ)言規(guī)則時(shí),就會(huì)產(chǎn)生語(yǔ)法錯(cuò)誤.例如,C#要求程序員在每行代碼的末尾加上分號(hào).如果漏掉分號(hào),就被視為語(yǔ)法錯(cuò)誤.
當(dāng)應(yīng)用程序試圖執(zhí)行無(wú)法實(shí)施的操作時(shí),就會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤.此類錯(cuò)誤發(fā)生在運(yùn)行時(shí).在程序運(yùn)行過程中要拿一個(gè)變量作除數(shù),然而這個(gè)時(shí)候這個(gè)變量的值是0,這種情況就會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤.
語(yǔ)義錯(cuò)誤指編譯器不會(huì)直接指出的邏輯錯(cuò)誤,語(yǔ)法可能是對(duì)的,但代碼或許不會(huì)顯示所需的輸出結(jié)果.此類錯(cuò)誤僅在其實(shí)際發(fā)生時(shí)出現(xiàn)在運(yùn)行時(shí),這是最難發(fā)現(xiàn)的程序錯(cuò)誤.檢測(cè)此類錯(cuò)誤的唯一方式是測(cè)試應(yīng)用程序,以確保其提供的輸出結(jié)果為預(yù)期結(jié)果.表1列出了各種錯(cuò)誤之間的區(qū)別.
很多程序員通常都試圖通過調(diào)用輸出函數(shù)(如Console.Write()等)來(lái)顯示某種消息,以判斷該點(diǎn)以前的代碼是否正確執(zhí)行,從而達(dá)到隔離問題的目的.這些函數(shù)還可以用來(lái)跟蹤和顯示程序內(nèi)某個(gè)變量的值.這是一種有效的調(diào)試技術(shù).但麻煩的是,一旦找到并解決了問題,必須從代碼中刪除所有這些輸出函數(shù)的調(diào)用.這是一個(gè)相當(dāng)繁瑣的過程.
表1 語(yǔ)法錯(cuò)誤和語(yǔ)義錯(cuò)誤
為簡(jiǎn)化此過程,大多數(shù)編程語(yǔ)言和工具都提供有調(diào)試器,以便程序員觀察程序的運(yùn)行時(shí)行為并跟蹤變量的值,從而確定錯(cuò)誤的位置.使用調(diào)試器的優(yōu)點(diǎn)是,檢查變量的值時(shí)不必插入任何輸出語(yǔ)句來(lái)顯示這些值.Visual Studio.NET也提供有調(diào)試器,以便程序員調(diào)試使用.NET支持的任意一種語(yǔ)言編寫的代碼.它為程序員提供了計(jì)算變量的值和編輯變量、暫掛或暫停程序執(zhí)行、查看寄存器的內(nèi)容以及查看應(yīng)用程序所耗內(nèi)存空間的工具等.
使用調(diào)試器時(shí),必須在代碼中插入“斷點(diǎn)”,以便在特定行處停止執(zhí)行.斷點(diǎn)告知調(diào)試器,程序應(yīng)在設(shè)置的斷點(diǎn)處暫停執(zhí)行(暫時(shí)停止).程序進(jìn)入中斷模式后,就處于暫掛狀態(tài).VS.NET中的許多調(diào)試器功能都只能在中斷模式下調(diào)用.通過這些功能,程序員可以檢查變量的值,如果需要還可以更改變量的值,也可以檢查其他數(shù)據(jù).
在VS.NET中設(shè)置斷點(diǎn)的步驟如下:
(1)右擊所需代碼行,以設(shè)置斷點(diǎn).此時(shí)會(huì)顯示彈出式窗口
(2)選擇“插入斷點(diǎn)”.設(shè)置斷點(diǎn)所在的代碼行由代碼旁的彩色點(diǎn)指示,且整行均為高亮顯示.
下圖所示為在不同的代碼行設(shè)置有斷點(diǎn)的程序示例的代碼窗口.遇到斷點(diǎn)時(shí),程序會(huì)在設(shè)置斷點(diǎn)所在的代碼行停止.
在上圖中,控制權(quán)位于第一個(gè)斷點(diǎn),代碼旁的黃色箭頭和黃色高亮顯示便可表明這一點(diǎn).要繼續(xù)執(zhí)行程序,請(qǐng)從菜單中選擇“調(diào)試”?“繼續(xù)”(也可以按快捷鍵F5).如果設(shè)置有更多斷點(diǎn),程序執(zhí)行將在每個(gè)斷點(diǎn)處再次停止,選擇“調(diào)試”?“繼續(xù)”后將會(huì)繼續(xù).
Visual Studio.NET環(huán)境提供了創(chuàng)建、編譯和生成應(yīng)用程序解決方案的工具.共有兩種模式可用來(lái)生成應(yīng)用程序,一種是調(diào)試模式(Debug模式)另一種是發(fā)布模式(Release模式).調(diào)試模式可用來(lái)重復(fù)編譯應(yīng)用程序和排除錯(cuò)誤,直至能夠成功運(yùn)行.當(dāng)應(yīng)用程序無(wú)需重復(fù)編譯即可發(fā)布時(shí),再改成發(fā)布模式編譯,然后發(fā)布.
VS.NET調(diào)試器提供有多個(gè)窗口,用以監(jiān)控程序執(zhí)行.其中可在調(diào)試過程中使用的部分窗口包括“局部變量”窗口、“監(jiān)視”窗口、“快速監(jiān)視”對(duì)話框、“即時(shí)”窗口.下面我們將逐個(gè)說明這些窗口:
4.1 “局部變量”窗口
“局部變量”窗口顯示局部變量中的值.它只列出當(dāng)前作用域(即正在執(zhí)行的方法)內(nèi)的變量并跟蹤它們的值.控制權(quán)一旦轉(zhuǎn)到類中的其他方法,系統(tǒng)就會(huì)從“局部變量”窗口中清除列出的變量(如果超出作用域),并顯示當(dāng)前方法的變量.
調(diào)試應(yīng)用程序時(shí)從菜單中選擇“調(diào)試”→“窗口”→“局部變量”,即可顯示“局部變量”窗口.
“局部變量”窗口包含三列信息:“名稱”列顯示變量的名稱,“值”列顯示變量的值,“類型”列顯示變量的類型.當(dāng)程序執(zhí)行從一個(gè)方法轉(zhuǎn)向另一個(gè)方法時(shí),“局部變量”窗口中顯示的變量也會(huì)改變,從而只顯示局部變量.可以為“值”列下的字符串和數(shù)值變量鍵入新值,當(dāng)值被更改后,新值將顯示為紅色.程序?qū)⑹褂眠@個(gè)變量的新值.
4.2 “監(jiān)視”窗口
“監(jiān)視”窗口用于計(jì)算變量和表達(dá)式的值,并通過程序跟蹤它們的值,也可以用來(lái)編輯變量的值.與“局部變量”窗口不同,此窗口中要“監(jiān)視”的變量應(yīng)由開發(fā)人員提供或指示.因此,可以指定不同方法中的變量.要同時(shí)檢查多個(gè)表達(dá)式或變量,可以同時(shí)打開多個(gè)“監(jiān)視”窗口.VS.NETIDE中的“監(jiān)視”窗口如圖9.4所示.變量的名稱應(yīng)在窗口中指定.執(zhí)行程序時(shí),“監(jiān)視”窗口會(huì)自動(dòng)跟蹤變量的值.如果被監(jiān)視的變量作用域不在當(dāng)前執(zhí)行的方法內(nèi),將會(huì)顯示“標(biāo)識(shí)符超出范圍”的錯(cuò)誤.
從菜單中選擇“調(diào)試”→“窗口”→“監(jiān)視”窗口(1)“監(jiān)視”窗口,(2)“監(jiān)視”窗口,(3)或“監(jiān)視”窗口,(4)即可顯示“監(jiān)視”窗口.
4.3 “快速監(jiān)視”對(duì)話框
“快速監(jiān)視”對(duì)話框可用于快速計(jì)算變量或表達(dá)式的值.通過此對(duì)話框還可以修改變量的值.下圖所示為“快速監(jiān)視”對(duì)話框.
此對(duì)話框每次只能用來(lái)顯示一個(gè)變量的值.此外,此對(duì)話框?qū)嶋H為模式對(duì)話框.也就是說,它不能用來(lái)在執(zhí)行過程中跟蹤變量的值.要繼續(xù)執(zhí)行代碼,必須關(guān)閉此對(duì)話框.要跟蹤變量的值,可以單擊“添加監(jiān)視”按鈕,將變量添加到“監(jiān)視”窗口中.
用右鍵單擊變量并選擇“快速監(jiān)視”,即可顯示“快速監(jiān)視”對(duì)話框.
4.4 “即時(shí)”窗口
“命令”窗口的即時(shí)模式可用于檢查變量的值、給變量賦值以及運(yùn)行一行代碼.下圖所示為VS. NET中“命令”窗口的即時(shí)模式.要查找變量的值,必須在變量的名稱前添加問號(hào)(?).當(dāng)應(yīng)用程序處于中斷模式時(shí),值將顯示在“命令”窗口的即時(shí)模式中.同樣,在此窗口中鍵入賦值代碼,然后按下Enter鍵,即可更改變量的值.分中斷模式無(wú)法使用“即時(shí)”窗口.
從菜單中選擇“調(diào)試”→“窗口”→“即時(shí)”,即可顯示即時(shí)模式下的“命令”窗口.
(1)跨語(yǔ)言調(diào)試使用 VB.NET、VC++.NET、VC#.NET、Managed Extensions for C++、腳本和SQL編寫的應(yīng)用程序.
(2)調(diào)試為Microsoft.NET框架公共語(yǔ)言運(yùn)行庫(kù)編寫的應(yīng)用程序以及Win 32本機(jī)應(yīng)用程序.
(3)加入正在主機(jī)或遠(yuǎn)程機(jī)器上運(yùn)行的程序.
(4)通過在單個(gè)Visual Studio解決方案中啟動(dòng)多個(gè)程序,或加入已經(jīng)在運(yùn)行的其他程序來(lái)調(diào)試多個(gè)程序.
調(diào)試在編碼過程中以最小粒度執(zhí)行.現(xiàn)在已經(jīng)有很多的方法和調(diào)試環(huán)境幫助軟件開發(fā)人員在編碼過程中調(diào)試程序.集成開發(fā)環(huán)境(IDE)提供了一種在不需要編譯的情況下捕獲語(yǔ)言專有預(yù)定義錯(cuò)誤(如語(yǔ)句結(jié)尾缺少字符和未定義變量等)的方式.
通過對(duì)應(yīng)用程序的調(diào)試,可以找出程序中存在的絕大部分語(yǔ)法錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤,減少程序在運(yùn)行過程中出現(xiàn)錯(cuò)誤,造成系統(tǒng)中斷.但是,即使找到并消除了應(yīng)用程序中的語(yǔ)法錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤,程序仍然不一定完全正確.要確保應(yīng)用程序工作完全正常,還必須使用各種數(shù)據(jù)對(duì)其進(jìn)行測(cè)試.測(cè)試可以確保向客戶交付穩(wěn)定可靠的產(chǎn)品,是檢查應(yīng)用程序并確保其符合設(shè)計(jì)規(guī)范的過程.測(cè)試的另一個(gè)重要原因是軟件中包含許多尚未發(fā)現(xiàn)的錯(cuò)誤,為找出應(yīng)用程序中這些錯(cuò)誤,應(yīng)當(dāng)對(duì)其進(jìn)行測(cè)試.
〔1〕Jeff Ferguson,Brian Patterson et al.C# Bible [M].北京:電子工業(yè)出版社出版,2002(12):258-269.
TP206
A
1673-260X(2010)03-0026-03