VS2017調試技巧


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;

效果如下:

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

說這個方法不完美是因為它對沒有代碼的其它dll里的全局變量無法使用.

給斷點加條件

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

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

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

條件表達式:

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

命中次數:

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

篩選器:

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

多線程調試

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

查看所有線程當前位置

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

效果如下:

凍結一個線程

這時候我們可以單獨凍結一個線程,讓這個線程被單獨掛起,其它線程繼續調試,選擇線程,然后點這里:

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

切換線程

如果當前掛起的線程不是自己要調試的線程,可以在這里切換到別的線程:

 
分類:  C# ASP.NET


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM