Visual Studio 調試技巧

寫在前面:假定你在平常的工做中使用到了Visual Studio,並指望瞭解一些調試技巧來提升工做效率,也許本文適合你。如下Visual Studio簡稱vs。ide

1、入門

以最簡單的控制檯應用程序爲例,代碼以下:工具

 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

  1. 控制檯輸出用於開發環境,能夠在vs輸出窗口中查看程序輸出的內容以下圖所示:

因爲是控制檯應用程序,Console.WriteLine() 輸出的內容不會顯示在輸出窗口,故採用Trace.WriteLine() 。對非控制檯應用程序,Console.WriteLine() 輸出的內容會正常顯示在輸出窗口。3d

2. 日誌輸出用於開發環境和生產環境,但更多用於生產環境,用來收集程序的運行信息。經常使用的日誌組件有Log4Net、NLog以及自定義日誌組件。依據問題嚴重程度大體分爲嚴重錯誤、錯誤、警告、信息以及調試信息等幾個級別。可結合實際需求靈活配置。調試

3. 斷點調試多用於開發環境,經過設置斷點,讓程序在指定的位置暫停,以便觀察上下文環境狀況。日誌

以上圖爲例,添加斷點後,鼠標移動到變量名上,能夠觀察一些變量的值。對於複雜類型的變量,經過選中變量,右鍵選擇快速監視的方式。避免鼠標移動後,監視的信息消失。code

以上三種調試方法中,對於開發環境而言,使用最爲頻繁的方法當數斷點調試。後面以斷點調試爲主,深刻介紹。orm

2、進階

  • 啓動外部程序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); } }

因爲方法中存在異常,又有異常捕獲,後續邏輯會被打斷,此時對異常設置作以下設置:

從新調試程序會有以下結果,方便快速定位異常發生點。

3、高級

在某些場景下,開發環境運行正常,非開發環境運行異常,依賴常規手段沒法定位問題緣由,想要斷點調試,非開發環境運行缺乏VS時,遠程調試會比較有效。

在VS安裝目錄下拷貝遠程調試所需的文件夾x86,x64到非開發環境

依據遠程目標機系統環境,運行x86/x64文件夾下msvsmon.exe,選擇工具中的選項菜單作以下配置:

運行待調試程序後,在VS中選擇調試>附加到進程(ctrl+alt+p),設置鏈接類型,鏈接目標(遠程ip地址或計算機名)後查找,會自動列出相關內容。

在可用進程中選擇對應的進程

在合適的位置添加斷點便可開始調試了

相關文章
相關標籤/搜索