1小時學會Visual Studio這些 調試技巧 !
轉自:LightSmaile cnblogs.com/LightSmile/p/11055665.html
寫在前面:假定你在日常的工作中使用到了Visual Studio,并期望了解一些調試技巧來提高工作效率,也許本文適合你。以下Visual Studio簡稱V。
一、入門
以最簡單的控制臺應用程序為例,代碼如下:
class Program
{
static void Main(string[] args)
{
int result = Sum(2, 3);
Console.WriteLine("2+3={0}", result);
}
private static int Sum(int a,int b)
{
return a + b;
}
}調試的根本目的是跟蹤代碼、程序的狀態(tài),判斷是否按照期望的行為運行。常用的跟蹤手段有控制臺輸出、日志輸出以及斷點調試。
1、控制臺輸出用于開發(fā)環(huán)境,可以在vs輸出窗口中查看程序輸出的內容如下圖所示:

由于是控制臺應用程序,Console.WriteLine() 輸出的內容不會顯示在輸出窗口,故采用Trace.WriteLine() 。對非控制臺應用程序,Console.WriteLine() 輸出的內容會正常顯示在輸出窗口。
2、日志輸出用于開發(fā)環(huán)境和生產環(huán)境,但更多用于生產環(huán)境,用來收集程序的運行信息。常用的日志組件有Log4Net、NLog以及自定義日志組件。依據問題嚴重程度大致分為嚴重錯誤、錯誤、警告、信息以及調試信息等幾個級別??山Y合實際需求靈活配置。
3、斷點調試多用于開發(fā)環(huán)境,通過設置斷點,讓程序在指定的位置暫停,以便觀察上下文環(huán)境情況。

以上圖為例,添加斷點后,鼠標移動到變量名上,可以觀察一些變量的值。對于復雜類型的變量,通過選中變量,右鍵選擇快速監(jiān)視的方式。避免鼠標移動后,監(jiān)視的信息消失。

以上三種調試方法中,對于開發(fā)環(huán)境而言,使用最為頻繁的方法當數(shù)斷點調試。后面以斷點調試為主,深入介紹。
二、進階
啟動外部程序
要使用斷點調試,需要滿足一些斷點調試的條件。對于可執(zhí)行程序,如控制臺應用程序、窗體應用程序、WPF應用程序以及Web應用程序,啟動調試后,可以在期望的位置添加斷點。而對于如動態(tài)庫類型,不可以直接啟動調試。想要調試這類項目,有兩種方式。一種是可以設置項目屬性中的啟動操作,指定引用該動態(tài)庫的可執(zhí)行程序路徑。

另一種方式是運行調用了動態(tài)庫的可執(zhí)行程序,通過附加可執(zhí)行程序進程的方式來調試。
附加進程

新建 DllDemo 動態(tài)庫項目,添加 MyMath 類,添加靜態(tài)方法 Max(int a,int b) 。代碼如下:
using System;
namespace DllDemo
{
public class MyMath
{
public static int Max(int a,int b)
{
return Math.Max(a, b);
}
}
}添加對 DllDemo 動態(tài)庫項目引用, 并修改控制臺應用程序如下。為了方便后續(xù)調試,控制臺應用程序中添加 Console.Read()。
using DllDemo;
using System;
using System.Diagnostics;
namespace DebugDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("等待鍵盤輸入...");
Console.Read();
int result = Sum(2, 3);
Console.WriteLine(string.Format("2+3={0}", result));
result = MyMath.Max(2, 3);
Console.WriteLine(string.Format("MyMath.Max(2, 3)={0}", result));
}
private static int Sum(int a, int b)
{
return a + b;
}
}
}運行控制臺應用程序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中設置斷點,啟動調試后打開調用堆棧窗口,如下圖:

異常設置
當程序運行以后,結果不是預期的。初步猜測發(fā)生了異常,由于某些原因,捕獲了異常,卻未妥善處理,導致異常信息被“吞”掉。此時,異常設置會格外有效。以下面代碼為例:
private static void TryToDivideByZero()
{
try
{
int a = 9;
int b = 0;
int c = a / b;
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}由于方法中存在異常,又有異常捕獲,后續(xù)邏輯會被打斷,此時對異常設置做如下設置:

重新調試程序會有如下結果,方便快速定位異常發(fā)生點。

三、高級
在某些場景下,開發(fā)環(huán)境運行正常,非開發(fā)環(huán)境運行異常,依賴常規(guī)手段無法定位問題原因,想要斷點調試,非開發(fā)環(huán)境運行缺少VS時,遠程調試會比較有效。
在VS安裝目錄下拷貝遠程調試所需的文件夾x86,x64到非開發(fā)環(huán)境

依據遠程目標機系統(tǒng)環(huán)境,運行x86/x64文件夾下msvsmon.exe,選擇工具中的選項菜單做如下配置:

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

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

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



臥槽,你更新Win11了嘛?

玩機小技巧,微信免費提現(xiàn)!
