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