Visual Studio的調試技巧

調試技巧是衡量程序員水平的一個重要指標.掌握好的調試技巧與工具的使用方法,也是很是重要的.程序員


演示環境:

VS2017
C#多線程


演示用的代碼:

public class Program
{
	private static int data
	{
		get;
		set;
	} = 0;
		
	public static void Main(string[] argv)
	{
		data = 10;
		new Thread(new ThreadStart(T1)) { IsBackground = true }.Start();
		new Thread(new ThreadStart(T2)) { IsBackground = true }.Start();
		Console.ReadKey(true);
	}
	private static int DataA
	{
		get;
		set;
	} = 0;
	private static int DataB = 0;
	private static void T1()
	{
		while (true)
		{
			DataA += 1;
			Thread.Sleep(1000);
		}
	}
	private static void T2()
	{
		while (true)
		{
			DataB += 1;
			Thread.Sleep(1000);
		}
	}
}//End Class

基本概念:斷點

這是最基本的操做了,想必大夥都會了...
咱們能夠點擊編輯器的這個地方:

給代碼添加一個斷點,這樣當代碼執行到這裏的時候就會掛起進程,此時代碼會暫停執行,並等待用戶操做.編輯器

如何繼續?

可按如下快捷鍵其中一個來實現繼續:
F5(繼續執行,直到再次遇到斷點,或者按Ctrl+Alt+Break鍵強行中斷)
F10(步過,繼續執行,可是到下一行又會掛起,無論下一行有沒有斷點)
F11(步入,和步過同效,但若是當前掛起位置是一個函數的話,下一步會進到函數裏)
Shift+F11(步出,執行到當前函數返回)函數

掛起的生效範圍

這個掛起,是對整個進程生效的,也就是說全部線程都會暫停.
掛起狀態:
工具

在掛起的時候能作的事

查看或修改變量的值

如同圖中那樣,當鼠標指針指向變量名的時候,能夠查看或修改該變量的值,修改完要按回車確認.
該操做僅限當前位置做用域內的變量.線程

控制線程下一步要執行的代碼位置

看圖中左邊的小箭頭,實際上是能拖動的!能夠把他往上或往下拖,從而改變線程下一步要執行的代碼位置,可是有兩點要注意:
1:位置改變了,可是操做過的變量值不會改變,因此別期望能用來倒退已經執行過的操做.
2:改變是有範圍的,不能跳到別的函數,就算是局部函數,也不能跳到外面.指針

在數據被改變/讀取的時候掛起(面向對象版數據斷點)

有時候代碼執行到某地方,某個變量就會被莫名其妙的改了.這時候咱們須要找出來是哪裏改了這個變量.
VS有提供一個叫作[數據斷點]的東西,但那個只支持native類的語言,C#是不行的.
但有個不是很完美的方法:
咱們能夠給目標變量加上get;set;訪問器,而後在上面加斷點,看開頭的代碼:調試

private static int data
{
	get;
	set;
} = 0;

效果以下:
code

這時候按住Ctrl鍵不放,接着連續按D T鍵,就能呼出調用堆棧窗口,看是哪裏在嘗試修改這個變量,也能夠按Shift+F11,執行到返回,這樣就能直接跳到修改這個變量的代碼:

說這個方法不完美是由於它對沒有代碼的其它dll裏的全局變量沒法使用.對象

給斷點加條件

當咱們在循環裏打斷點的時候,斷點會被循環觸發,這樣調試起來就很麻煩了,咱們能夠給斷點加條件,讓斷點知足條件才觸發.
按住Ctrl鍵不放,接着連續按D B鍵,能看到全部斷點的列表.

在目標斷點按下鼠標右鍵,在菜單裏選擇設置.可進入斷點設置界面:

給條件打上勾.可看到有三種條件模板,三個模板可相與(竟然不能相或...)

條件表達式:

能夠輸入一條表達式,以表達式的結果決定是否觸發,表達式參數能夠是當前斷點做用域內的變量或常量,判斷方式有兩種:
表達式結果返回true時觸發
表達式結果變化時觸發(只支持bool類型結果)
提醒:若是想要在返回false的狀況下觸發,能夠把表達式改成: !(表達式)

命中次數:

代碼執行過斷點次數達到必定次數才觸發,這個模版分爲三種類型:
等於:執行過第x次觸發斷點
大於等於:執行過第x次以及以後都觸發
倍數於:代碼執行過x的倍數次時觸發斷點

篩選器:

可根據線程ID,線程名,進程ID,進程名,機器名,等條件決定是否斷下線程.各條件之間可進行邏輯操做


多線程調試

按住Ctrl鍵不放,接着連續按D T鍵,能顯示[線程]窗口,可從中看到當前調試進程的全部線程.

查看全部線程當前位置

點菜單欄的這個地方,能顯示全部線程掛起時的位置:

效果以下:

凍結一個線程

這時候咱們能夠單獨凍結一個線程,讓這個線程被單獨掛起,其它線程繼續調試,選擇線程,而後點這裏:

如你所見,解凍按鈕就在旁邊...
線程被凍結後,就會被單獨掛起,直到解凍才繼續執行.

切換線程

若是當前掛起的線程不是本身要調試的線程,能夠在這裏切換到別的線程:

相關文章
相關標籤/搜索