調試技巧是衡量程序員水平的一個重要指標.掌握好的調試技巧與工具的使用方法,也是很是重要的.程序員
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鍵,能顯示[線程]窗口,可從中看到當前調試進程的全部線程.
點菜單欄的這個地方,能顯示全部線程掛起時的位置:
效果以下:
這時候咱們能夠單獨凍結一個線程,讓這個線程被單獨掛起,其它線程繼續調試,選擇線程,而後點這裏:
如你所見,解凍按鈕就在旁邊...
線程被凍結後,就會被單獨掛起,直到解凍才繼續執行.
若是當前掛起的線程不是本身要調試的線程,能夠在這裏切換到別的線程: