1 導言
在軟件開發周期中,測試和修正缺陷(defect,defect與bug的區別:Bug是缺陷的一種表現形式,而一個缺陷是可以引起多種Bug的)的時間遠多於寫代碼的時間。通常,debug是指發現缺陷並改正的過程。修正缺陷緊隨debug之后,或者說二者是相關的。如果代碼中存在缺陷,我們首先要識別造成缺陷的根本原因(root cause),這個過程就稱作調試(debugging)。找到根本原因后,就可以修正缺陷。
那么如何調試代碼呢?Visual Studio提供了很多用於調試的工具。有時調試需要花費大量時間去識別root cause。VS提供了許多輔助調試的便捷的工具。調試器(Debugger)包含錯誤列表、添加斷點、可視化的程序流程、控制執行流程、Data Tips、監視窗口(watch windows)、多線程調試、線程窗口、並行調試概覽以及IntelliTrace調試概覽。我希望本文能夠對調試功能的使用者有所裨益。請注意,本文使用VS2010。某些功能在舊版本中也是一致的,但是VS2010新增了許多features(Labeling breakpoint, Pinned DataTip, Multithreaded Debugging, Parallel debugging and IntelliTrace)。
2 如何啟動調試?

圖 啟動調試(Start Debugging)
“附加到進程(Attach to Process)”是另一種啟動調試的方法。Attach Process會為應用程序啟動一個調試會話。可能我們更熟悉ASP.NET Web應用的Attach Process調試。我發了另外兩篇相關的帖子。如下:
- Debug Your ASP.NET Application that Hosted on IIS
 - Remote IIS Debugging: Debug your ASP.NET Application which is hosted on "Remote IIS Server"
 
通常我們通過在可能存在問題代碼處加斷點來啟動調試。因此,我們從斷點開始講起。
3 斷點(Breakpoints)

圖 設置斷點(Set Breakpoint)
3.1 使用斷點進行調試
在中斷模式下,你有多條可使用的命令,使用相應命令進行進一步的調試。

圖 斷點工具條(Breakpoint Toolbar)
3.1.1 逐過程(Step Over)
  
        3.1.2 逐語句(Step Into)
  
        3.1.3 跳出(Step Out)
3.1.4 繼續(Continue)
3.1.5 設置下一語句(Set Next Statement)
  
        3.1.6 顯示下一語句(Show Next Statement [Ctrl+*])
3.2 斷點標簽(Labeling in Break Point)
-  
           class Program
 -  
           {
 -  
           static void Main(string[] args)
 -  
           {
 -  
           string[] strNames = { "Name1", "Name2", "Name3", "Name4", "Name5", "Name6" };
 -  
           
 -  
           foreach (string name in strNames)
 -  
           {
 -  
           Console.WriteLine(name); // BreakPoint
 -  
           }
 -  
           int temp = 4;
 -  
           for (int i = 1; i <= 10; i++)
 -  
           {
 -  
           if (i > 6)
 -  
           temp = 5;
 -  
           }
 -  
           }
 -  
           
 -  
           public static void Method1()
 -  
           {
 -  
           Console.WriteLine( "Break Point in Method1"); // BreakPoint
 -  
           }
 -  
           
 -  
           public static void Method2()
 -  
           {
 -  
           Console.WriteLine( "Break Point in Method2"); // BreakPoint
 -  
           Console.WriteLine( "Break Point in Method2"); // BreakPoint
 -  
           }
 -  
           
 -  
           public static void Method3()
 -  
           {
 -  
           Console.WriteLine( "Break Point in Method3"); // Breakpoint
 -  
           }
 -  
           }
 
  
        
  
        
  
        
  
        3.3 條件斷點(Conditional Breakpoint)
  
        
  
        -  
           class Program
 -  
           {
 -  
           static void Main(string[] args)
 -  
           {
 -  
           string [] strNames = { "Name1","Name2", "Name3", "Name4", "Name5", "Name6"};
 -  
           
 -  
           foreach(string name in strNames)
 -  
           {
 -  
           Console.WriteLine(name); // Breakpoint is here
 -  
           }
 -  
           }
 -  
           }
 
  
        
  
        
  
        
  
        - Is True
 - Has Changed
 
3.4 導入/導出斷點(Import / Export Breakpoint)
3.5 斷點命中計數(Breakpoint Hit Count)
3.6 Breakpoint When Hit
3.7 斷點篩選器(Breakpoint Filter)
  
        4 數據便簽(Data Tip)
  
        4.1 Pin Inspect Value During Debugging
4.2 Drag-Drop Pin Data Tip
4.3 Adding Comments
4.4 Last Session Debugging Value
4.5 Import Export Data Tips
4.6 Change Value Using Data Tips
4.7 Clear Data Tips
5 監視窗口(Watch Windows)
5.1 局部變量(Locals)
  
        5.2 自動窗口(Autos)
  
        5.3 監視(Watch)
  
        有4個可同時使用的監視窗口。

圖:多個監視窗口
 
        
 
        5.3.1 Creating Object ID
  
        
  
        5.4
6 即時窗口(Immediate Window)
  
        7 調用堆棧(Call Stack)
8 調試多線程程序(Debugging Multithreaded Program)
8.1 Exploring Threads Window
8.2 Flag Just My Code
8.3 Break Point Filter - Multithread Debugging
9 調試並行程序(Debugging Parallel Program)
9.1 Parallel Task and Parallel Stacks
10 Debugging with IntelliTrace
10.1 Overview
10.2 Mapping with IntelliTrace
10.3 Filter IntelliTrace Data
11 調試常用快捷鍵(Useful Shortcut Keys For VS Debugging)
| 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 | 
12 深入學習(Further Study)
13 總結(Summary)
“自動窗口”(Autos):當前使用的變量
“局部窗口”(Locals):在范圍內的所有變量
“監視N”(Watch):可定制(N從1到4)
Step Into(逐語句):執行並移動到下一條語句(實際上,跳入上一條語句的代碼塊,此代碼塊的第一條)
Step Over(逐過程):執行並跳到下一條語句,但不進入上一條語句的代碼塊
Step Out(跳出):執行到代碼塊結尾
命令窗口(Command)
即時窗口(Immediate):主要用於計算表達式
參考資料:
[1] Mastering Debugging in Visual Studio 2010 - A Beginner's Guide
[2] bug和缺陷的區別
