寫在前面:假定你在平常的工做中使用到了Visual Studio,並指望瞭解一些調試技巧來提升工做效率,也許本文適合你。如下Visual Studio簡稱vs。ide
以最簡單的控制檯應用程序爲例,代碼以下:工具
1 class Program
2 { 3 static void Main(string[] args) 4 { 5 int result = Sum(2, 3); 6 Console.WriteLine("2+3={0}", result); 7 } 8 9 private static int Sum(int a,int b) 10 { 11 return a + b; 12 } 13 }
調試的根本目的是跟蹤代碼、程序的狀態,判斷是否按照指望的行爲運行。經常使用的跟蹤手段有控制檯輸出、日誌輸出以及斷點調試。spa
因爲是控制檯應用程序,Console.WriteLine() 輸出的內容不會顯示在輸出窗口,故採用Trace.WriteLine() 。對非控制檯應用程序,Console.WriteLine() 輸出的內容會正常顯示在輸出窗口。3d
2. 日誌輸出用於開發環境和生產環境,但更多用於生產環境,用來收集程序的運行信息。經常使用的日誌組件有Log4Net、NLog以及自定義日誌組件。依據問題嚴重程度大體分爲嚴重錯誤、錯誤、警告、信息以及調試信息等幾個級別。可結合實際需求靈活配置。調試
3. 斷點調試多用於開發環境,經過設置斷點,讓程序在指定的位置暫停,以便觀察上下文環境狀況。日誌
以上圖爲例,添加斷點後,鼠標移動到變量名上,能夠觀察一些變量的值。對於複雜類型的變量,經過選中變量,右鍵選擇快速監視的方式。避免鼠標移動後,監視的信息消失。code
以上三種調試方法中,對於開發環境而言,使用最爲頻繁的方法當數斷點調試。後面以斷點調試爲主,深刻介紹。orm
啓動外部程序blog
要使用斷點調試,須要知足一些斷點調試的條件。對於可執行程序,如控制檯應用程序、窗體應用程序、WPF應用程序以及Web應用程序,啓動調試後,能夠在指望的位置添加斷點。而對於如動態庫類型,不能夠直接啓動調試。想要調試這類項目,有兩種方式。一種是能夠設置項目屬性中的啓動操做,指定引用該動態庫的可執行程序路徑。繼承
另外一種方式是運行調用了動態庫的可執行程序,經過附加可執行程序進程的方式來調試。
附加進程
新建 DllDemo 動態庫項目,添加 MyMath 類,添加靜態方法 Max(int a,int b) 。代碼以下:
1 using System;
2
3 namespace DllDemo 4 { 5 public class MyMath 6 { 7 public static int Max(int a,int b) 8 { 9 return Math.Max(a, b); 10 } 11 } 12 }
添加對 DllDemo 動態庫項目引用, 並修改控制檯應用程序以下。爲了方便後續調試,控制檯應用程序中添加 Console.Read()。
1 using DllDemo;
2 using System; 3 using System.Diagnostics; 4 5 namespace DebugDemo 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 Console.WriteLine("等待鍵盤輸入..."); 12 13 Console.Read(); 14 15 int result = Sum(2, 3); 16 17 Console.WriteLine(string.Format("2+3={0}", result)); 18 19 result = MyMath.Max(2, 3); 20 21 Console.WriteLine(string.Format("MyMath.Max(2, 3)={0}", result)); 22 } 23 24 private static int Sum(int a, int b) 25 { 26 return a + b; 27 } 28 } 29 }
運行控制檯應用程序DebugDemo.exe ,附加該進程,在合適的位置添加斷點。
查看調用堆棧
當程序包含接口繼承、抽象類繼承等邏輯,致使結構過於複雜,知道功能入口以及出口,想要了解過程時,調用堆棧會比較有用。如下面代碼爲例:
private static void DoWork()
{
DoWork1();
}
private static void DoWork1() { DoWork2(); } private static void DoWork2() { DoWork3(); } private static void DoWork3() { Console.Write("DoWork3"); }
假設知道功能入口爲DoWork,功能結果爲DoWork3,想要了解DoWork3的調用邏輯,能夠在DoWork3中設置斷點,啓動調試後打開調用堆棧窗口,以下圖:
異常設置
當程序運行之後,結果不是預期的。初步猜想發生了異常,因爲某些緣由,捕獲了異常,卻未妥善處理,致使異常信息被「吞」掉。此時,異常設置會格外有效。如下面代碼爲例:
private static void TryToDivideByZero()
{
try { int a = 9; int b = 0; int c = a / b; } catch(Exception ex) { Console.WriteLine(ex.Message); } }
因爲方法中存在異常,又有異常捕獲,後續邏輯會被打斷,此時對異常設置作以下設置:
從新調試程序會有以下結果,方便快速定位異常發生點。
在某些場景下,開發環境運行正常,非開發環境運行異常,依賴常規手段沒法定位問題緣由,想要斷點調試,非開發環境運行缺乏VS時,遠程調試會比較有效。
在VS安裝目錄下拷貝遠程調試所需的文件夾x86,x64到非開發環境
依據遠程目標機系統環境,運行x86/x64文件夾下msvsmon.exe,選擇工具中的選項菜單作以下配置:
運行待調試程序後,在VS中選擇調試>附加到進程(ctrl+alt+p),設置鏈接類型,鏈接目標(遠程ip地址或計算機名)後查找,會自動列出相關內容。
在可用進程中選擇對應的進程
在合適的位置添加斷點便可開始調試了