1 導(dǎo)言在軟件開發(fā)周期中,測試和修正缺陷(defect,defect與bug的區(qū)別:Bug是缺陷的一種表現(xiàn)形式,而一個缺陷是可以引起多種Bug的)的時間遠(yuǎn)多于寫代碼的時間。通常,debug是指發(fā)現(xiàn)缺陷并改正的過程。修正缺陷緊隨debug之后,或者說二者是相關(guān)的。如果代碼中存在缺陷,我們首先要識別造成缺陷的根本原因(root cause),這個過程就稱作調(diào)試(debugging)。找到根本原因后,就可以修正缺陷。 那么如何調(diào)試代碼呢?Visual Studio提供了很多用于調(diào)試的工具。有時調(diào)試需要花費大量時間去識別root cause。VS提供了許多輔助調(diào)試的便捷的工具。調(diào)試器(Debugger)包含錯誤列表、添加斷點、可視化的程序流程、控制執(zhí)行流程、Data Tips、監(jiān)視窗口(watch windows)、多線程調(diào)試、線程窗口、并行調(diào)試概覽以及IntelliTrace調(diào)試概覽。我希望本文能夠?qū)φ{(diào)試功能的使用者有所裨益。請注意,本文使用VS2010。某些功能在舊版本中也是一致的,但是VS2010新增了許多features(Labeling breakpoint, Pinned DataTip, Multithreaded Debugging, Parallel debugging and IntelliTrace)。 2 如何啟動調(diào)試?可以通過VS的調(diào)試(Debug)菜單啟動調(diào)試。點擊調(diào)試菜單下的“啟動調(diào)試”或者按F5鍵啟動。如果你已經(jīng)在代碼中加入了斷點,那么執(zhí)行會自動開始。
“附加到進(jìn)程(Attach to Process)”是另一種啟動調(diào)試的方法。Attach Process會為應(yīng)用程序啟動一個調(diào)試會話??赡芪覀兏煜SP.NET Web應(yīng)用的Attach Process調(diào)試。我發(fā)了另外兩篇相關(guān)的帖子。如下:
通常我們通過在可能存在問題代碼處加斷點來啟動調(diào)試。因此,我們從斷點開始講起。 3 斷點(Breakpoints)斷點用于通知調(diào)試器何時何處暫停程序的執(zhí)行。通過點擊左邊欄或者按F9鍵在當(dāng)前行添加斷點。在加斷點之前,你需要知道你的代碼將會出現(xiàn)什么錯誤,在什么地方停止執(zhí)行。當(dāng)調(diào)試器執(zhí)行到斷點處時,你可以使用其他的調(diào)試工具核對代碼何處出現(xiàn)錯誤。
3.1 使用斷點進(jìn)行調(diào)試你已經(jīng)在你想要暫停執(zhí)行的地方設(shè)置了斷點?,F(xiàn)在按F5鍵啟動調(diào)試,當(dāng)程序執(zhí)行到斷點處時,自動暫停執(zhí)行。此時你有多種方式來檢查代碼。命中斷點(hit the breakpoint)后,加斷點的行變?yōu)辄S色,意指下一步將執(zhí)行此行。
在中斷模式下,你有多條可使用的命令,使用相應(yīng)命令進(jìn)行進(jìn)一步的調(diào)試。
3.1.1 逐過程(Step Over)調(diào)試器執(zhí)行到斷點后,你可能需要一條一條的執(zhí)行代碼。”Step Over“[F10]命令用于一條一條的執(zhí)行代碼。這將執(zhí)行當(dāng)前高亮的行,然后暫停。如果在一條方法調(diào)用語句高亮?xí)r按F10,執(zhí)行會停在調(diào)用語句的下一條語句上。Step Over會一次整個方法。
![]() 圖: 逐過程(Step Over - F10)
3.1.2 逐語句(Step Into)它與Step Over相似。唯一的不同是,如果當(dāng)前高亮語句是方法調(diào)用,調(diào)試器會進(jìn)入方法內(nèi)部??旖萱I是”F11“。
![]() 圖: 逐語句(Step Into - F11)
3.1.3 跳出(Step Out)當(dāng)你在一個方法內(nèi)部調(diào)試時會用到它。如果你在當(dāng)前方法內(nèi)按Shift - F11,調(diào)試器會完成此方法的執(zhí)行,之后在調(diào)用此方法的語句的下一條語句處暫停。
3.1.4 繼續(xù)(Continue)它像是重新執(zhí)行你的程序。它會繼續(xù)程序的執(zhí)行直到遇到下一個斷點??旖萱I是”F5“。
3.1.5 設(shè)置下一語句(Set Next Statement)這是一個非常有趣的特性。設(shè)置下一語句允許你在調(diào)試的時候改變程序的執(zhí)行路徑。如果你的程序在某一行處暫停而且你想改變執(zhí)行路徑,跳到指定行,在這一行上右擊,在右擊菜單中選擇”設(shè)置下一語句“。這樣程序就會轉(zhuǎn)到哪一行執(zhí)行而不執(zhí)行先前的代碼。這在如下情況中非常有用:當(dāng)你發(fā)現(xiàn)代碼中某些行可能會導(dǎo)致程序的中斷(break)而你不想讓程序在那個時候中斷。快捷鍵是Ctrl + Shift + F10。
![]() 圖: 設(shè)置下一語句(Set Next Statement)
3.1.6 顯示下一語句(Show Next Statement [Ctrl+*])這一行用黃色箭頭標(biāo)記。這行是程序繼續(xù)執(zhí)行時下一條將執(zhí)行的語句。
3.2 斷點標(biāo)簽(Labeling in Break Point)這是VS2010提供的新特征(feature)。用于更好的管理斷點。它使得我們能夠更好的分組和過濾斷點。這像是對斷點的歸類。如果我們添加了與某一功能相關(guān)的不同類型的斷點,我們可以根據(jù)需要使能(enable)、取消(disable)、過濾(filter)這些斷點。例如,假設(shè)我們要調(diào)試一下代碼塊。
[csharp] view plaincopy
![]() 圖: 斷點列表
上圖中Labels列都為空。下面介紹如何給斷點設(shè)置標(biāo)簽(label)以及如何使用標(biāo)簽。只需在特定代碼行的斷點符號上右擊(①)或者在斷點窗口中設(shè)置(②)即可對任何斷點設(shè)置標(biāo)簽。
![]() 圖: 設(shè)置斷點標(biāo)簽(Setting Breakpoint Label)
右擊斷點,點擊編輯標(biāo)簽(Edit Labels),即可對任意斷點添加標(biāo)簽。對于示例代碼,我為所有斷點的標(biāo)簽起了易于理解的名字。
![]() 圖: 添加斷點標(biāo)簽(Adding Breakpoint Label)
這些標(biāo)簽如何輔助我們調(diào)試呢?現(xiàn)在,所有斷點都是使能的(enabled)。如果你不想調(diào)試method2,一般情況下你必須去對應(yīng)的方法中一個一個的取消斷點,但這里你可以通過標(biāo)簽名過濾或者搜索它們,然后選中它們以方便的取消它們。
![]() 圖: 使用標(biāo)簽過濾斷點(Filter Breakpoint Using Labels)
斷點標(biāo)簽到此介紹完畢。我舉的例子非常簡單,但是斷點標(biāo)簽在你調(diào)試大量代碼,多個工程等情況下非常有用。
3.3 條件斷點(Conditional Breakpoint)假設(shè)你在多次迭代(循環(huán))處理數(shù)據(jù)而你只想調(diào)試其中某幾次迭代。這意味著你想根據(jù)某些特定條件暫停你的程序。Visual Studio斷點允許你設(shè)置條件斷點。當(dāng)且僅當(dāng)條件滿足時,調(diào)試器才會停住。
首先,你需要在你想暫停執(zhí)行處設(shè)置斷點。然后右擊紅色的斷點圖標(biāo)。右鍵菜單中點擊”條件“。
![]() 圖: 設(shè)置斷點條件(Set Breakpoint Condition)
點擊右鍵菜單中的”條件“后,會彈出下面的對話框設(shè)置斷點的條件。
![]() 圖: 斷點條件設(shè)置
假設(shè)你要調(diào)試下面的代碼塊:
[csharp] view plaincopy
![]() 圖: 設(shè)置斷點條件
查看斷點符號。它應(yīng)該看上去像是一個加(+)號在斷點符號內(nèi)部,這表示該斷點是條件斷點。
![]() 圖: 條件斷點符號(Conditional Breakpoint Symbol)
設(shè)置斷點的條件之后,在調(diào)試程序,調(diào)試器只會在滿足給定條件時才停住。
![]() 圖: 條件斷點命中(Conditional Breakpoint hit)
條件輸入框的自動補(bǔ)全(intellisense):上面給出的斷點條件非常簡單,可以非常容易的寫到條件文本框中。有時你可能需要定義很大很復(fù)雜的條件。不必?fù)?dān)心,VS為條件文本輸入框也提供了自動補(bǔ)全功能。因此,在條件框中輸入就像是在編輯器中一樣方便。如下圖。
![]() 圖: 條件文本框的自動補(bǔ)全(intellisense in condition textbox)
我?guī)缀踔v解了條件斷點的所有內(nèi)容。除了下面這點。在條件窗口中有兩個選項:
我們已經(jīng)看到”Is True“選項的用途了。”Has Changed“用在當(dāng)你想在某些值變?yōu)槟承┨囟ㄖ档臅r候停住。
3.4 導(dǎo)入/導(dǎo)出斷點(Import / Export Breakpoint)3.5 斷點命中計數(shù)(Breakpoint Hit Count)3.6 Breakpoint When Hit3.7 斷點篩選器(Breakpoint Filter)你可以限制斷點只對特定進(jìn)程或線程有效。這在進(jìn)行多線程程序的調(diào)試時非常有用。右擊斷點選”篩選器“即可打開篩選器窗口。
![]() 圖: 斷點篩選器(Breakpoint Filter)
在篩選規(guī)則中,你可以設(shè)置進(jìn)程名,進(jìn)程Id,機(jī)器名,線程ID等。我會在多線程調(diào)試小節(jié)中詳述其用法。
4 數(shù)據(jù)便簽(Data Tip)數(shù)據(jù)便簽是應(yīng)用程序調(diào)試期間用于查看對象和變量的一種高級便簽消息。當(dāng)調(diào)試器執(zhí)行到斷點時,將鼠標(biāo)移到對象或者變量上方時,你會看到它們的當(dāng)前值。你甚至可以看到一些復(fù)雜對象(如dataset,datatable等等)的細(xì)節(jié)。數(shù)據(jù)便簽左上角有一個“+”號用于展開它的子對象或者值。
![]() 圖: 調(diào)試時的數(shù)據(jù)便簽(DataTips During Debugging)
幾個月前,我發(fā)過一篇關(guān)于VS 2010 DataTip Debugging Tips的文章。
下面是一些在調(diào)試時有用的特性。
4.1 Pin Inspect Value During Debugging4.2 Drag-Drop Pin Data Tip4.3 Adding Comments4.4 Last Session Debugging Value4.5 Import Export Data Tips4.6 Change Value Using Data Tips4.7 Clear Data Tips5 監(jiān)視窗口(Watch Windows)5.1 局部變量(Locals)列出當(dāng)前方法中的所有變量。當(dāng)調(diào)試器停在某特定斷點并打開Autos窗口時,將展示當(dāng)前范圍中與此值相關(guān)的變量。
![]() 圖:Local Variables
5.2 自動窗口(Autos)這些變量由VS調(diào)試器在調(diào)試的時候自動檢測。VS檢測與當(dāng)前語句相關(guān)的對象或變量,基于此列出Autos變量。Autos Variable的快捷鍵是Ctrl + D + A。
![]() 圖:Autos - Ctrl + D, A
5.3 監(jiān)視(Watch)Watch窗口用于添加變量。你可以添加任意多個變量。添加方法是,右擊變量并選擇“Add to Watch”。
![]() 圖:Watch - Ctrl + D, W
也可以使用拖放(Drag and Drop)將變量添加到監(jiān)視窗口中。從監(jiān)視窗口中刪除變量的方法是,右擊變量并選擇“Delete Watch”。通過調(diào)試窗口,也可以在運行時編輯這些變量值。
有4個可同時使用的監(jiān)視窗口。
|
Shortcut Keys | Descriptions |
Ctrl-Alt-V, A | Displays the Auto window |
Ctrl-Alt-B | Displays the Breakpoints dialog |
Ctrl-Alt-C | Displays the Call Stack |
Ctrl-Shift-F9 | Clears all of the breakpoints in the project |
Ctrl-F9 | Enables or disables the breakpoint on the current line of code |
Ctrl-Alt-E | Displays the Exceptions dialog |
Ctrl-Alt-I | Displays the Immediate window |
Ctrl-Alt-V, L | Displays the Locals window |
Ctrl-Alt-Q | Displays the Quick Watch dialog |
Ctrl-Shift-F5 | Terminates the current debugging session, rebuilds if necessary, and starts a new debugging session. |
Ctrl-F10 | Starts or resumes execution of your code and then halts execution when it reaches the selected statement. |
Ctrl-Shift-F10 | Sets the execution point to the line of code you choose |
Alt-NUM * | Highlights the next statement |
F5 | If not currently debugging, this runs the startup project or projects and attaches the debugger. |
Ctrl-F5 | Runs the code without invoking the debugger |
F11 | Step Into |
Shift-F11 | Executes the remaining lines out from procedure |
F10 | Executes the next line of code but does not step into any function calls |
Shift-F5 | Available in break and run modes, this terminates the debugging session |
Ctrl-Alt-H | Displays the Threads window to view all of the threads for the current process |
F9 | Sets or removes a breakpoint at the current line |
Ctrl-Alt-W, 1 | Displays the Watch 1 window to view the values of variables or watch expressions |
Ctrl-Alt-P | Displays the Processes dialog, which allows you to attach or detach the debugger to one or more running processes |
Ctrl-D,V | IntelliTrace Event |
“自動窗口”(Autos):當(dāng)前使用的變量
“局部窗口”(Locals):在范圍內(nèi)的所有變量
“監(jiān)視N”(Watch):可定制(N從1到4)
Step Into(逐語句):執(zhí)行并移動到下一條語句(實際上,跳入上一條語句的代碼塊,此代碼塊的第一條)
Step Over(逐過程):執(zhí)行并跳到下一條語句,但不進(jìn)入上一條語句的代碼塊
Step Out(跳出):執(zhí)行到代碼塊結(jié)尾
命令窗口(Command)
即時窗口(Immediate):主要用于計算表達(dá)式
參考資料:
[1] Mastering Debugging in Visual Studio 2010 - A Beginner's Guide
[2] bug和缺陷的區(qū)別
|
來自: corefashion > 《C#》