VS2017断点调试
閱讀目錄
- 一、查看或修改變量的值
- 二、控制線程下一步要執(zhí)行的代碼位置
閱讀目錄
- Visual Studio的調(diào)試技巧
- 演示環(huán)境:
- 演示用的代碼:
- 基本概念:斷點
- 在數(shù)據(jù)被改變/讀取的時候掛起(面向?qū)ο蟀鏀?shù)據(jù)斷點)
- 多線程調(diào)試
Visual Studio的調(diào)試技巧
調(diào)試技巧是衡量程序員水平的一個重要指標.掌握好的調(diào)試技巧與工具的使用方法,也是非常重要的.
***
演示環(huán)境:
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回到目錄
基本概念:斷點
這是最基本的操作了,想必大伙都會了...
我們可以點擊編輯器的這個地方:
給代碼添加一個斷點,這樣當(dāng)代碼執(zhí)行到這里的時候就會掛起進程,此時代碼會暫停執(zhí)行,并等待用戶操作.
如何繼續(xù)?
可按以下快捷鍵其中一個來實現(xiàn)繼續(xù):
F5(繼續(xù)執(zhí)行,直到再次遇到斷點,或者按Ctrl+Alt+Break鍵強行中斷)
F10(步過,繼續(xù)執(zhí)行,但是到下一行又會掛起,不管下一行有沒有斷點)
F11(步入,和步過同效,但如果當(dāng)前掛起位置是一個函數(shù)的話,下一步會進到函數(shù)里)
Shift+F11(步出,執(zhí)行到當(dāng)前函數(shù)返回)
掛起的生效范圍
這個掛起,是對整個進程生效的,也就是說所有線程都會暫停.
掛起狀態(tài):
在掛起的時候能做的事
返回頂部查看或修改變量的值
如同圖中那樣,當(dāng)鼠標指針指向變量名的時候,可以查看或修改該變量的值,修改完要按回車確認.
該操作僅限當(dāng)前位置作用域內(nèi)的變量.
控制線程下一步要執(zhí)行的代碼位置
看圖中左邊的小箭頭,其實是能拖動的!可以把他往上或往下拖,從而改變線程下一步要執(zhí)行的代碼位置,但是有兩點要注意:
1:位置改變了,但是操作過的變量值不會改變,所以別指望能用來倒退已經(jīng)執(zhí)行過的操作.
2:改變是有范圍的,不能跳到別的函數(shù),就算是局部函數(shù),也不能跳到外面.
在數(shù)據(jù)被改變/讀取的時候掛起(面向?qū)ο蟀鏀?shù)據(jù)斷點)
有時候代碼執(zhí)行到某地方,某個變量就會被莫名其妙的改了.這時候我們需要找出來是哪里改了這個變量.
VS有提供一個叫做[數(shù)據(jù)斷點]的東西,但那個只支持native類的語言,C#是不行的.
但有個不是很完美的方法:
我們可以給目標變量加上get;set;訪問器,然后在上面加斷點,看開頭的代碼:
效果如下:
這時候按住Ctrl鍵不放,接著連續(xù)按D T鍵,就能呼出調(diào)用堆棧窗口,看是哪里在嘗試修改這個變量,也可以按Shift+F11,執(zhí)行到返回,這樣就能直接跳到修改這個變量的代碼:
說這個方法不完美是因為它對沒有代碼的其它dll里的全局變量無法使用.
給斷點加條件
當(dāng)我們在循環(huán)里打斷點的時候,斷點會被循環(huán)觸發(fā),這樣調(diào)試起來就很麻煩了,我們可以給斷點加條件,讓斷點滿足條件才觸發(fā).
按住Ctrl鍵不放,接著連續(xù)按D B鍵,能看到所有斷點的列表.
在目標斷點按下鼠標右鍵,在菜單里選擇設(shè)置.可進入斷點設(shè)置界面:
給條件打上勾.可看到有三種條件模板,三個模板可相與(居然不能相或...)
條件表達式:
可以輸入一條表達式,以表達式的結(jié)果決定是否觸發(fā),表達式參數(shù)可以是當(dāng)前斷點作用域內(nèi)的變量或常量,判斷方式有兩種:
表達式結(jié)果返回true時觸發(fā)
表達式結(jié)果變化時觸發(fā)(只支持bool類型結(jié)果)
提醒:如果想要在返回false的情況下觸發(fā),可以把表達式改為: !(表達式)
命中次數(shù):
代碼執(zhí)行過斷點次數(shù)達到一定次數(shù)才觸發(fā),這個模版分為三種類型:
等于:執(zhí)行過第x次觸發(fā)斷點
大于等于:執(zhí)行過第x次以及之后都觸發(fā)
倍數(shù)于:代碼執(zhí)行過x的倍數(shù)次時觸發(fā)斷點
篩選器:
可根據(jù)線程ID,線程名,進程ID,進程名,機器名,等條件決定是否斷下線程.各條件之間可進行邏輯操作
******
多線程調(diào)試
按住Ctrl鍵不放,接著連續(xù)按D T鍵,能顯示[線程]窗口,可從中看到當(dāng)前調(diào)試進程的所有線程.
查看所有線程當(dāng)前位置
點菜單欄的這個地方,能顯示所有線程掛起時的位置:
效果如下:
凍結(jié)一個線程
這時候我們可以單獨凍結(jié)一個線程,讓這個線程被單獨掛起,其它線程繼續(xù)調(diào)試,選擇線程,然后點這里:
如你所見,解凍按鈕就在旁邊...
線程被凍結(jié)后,就會被單獨掛起,直到解凍才繼續(xù)執(zhí)行.
切換線程
如果當(dāng)前掛起的線程不是自己要調(diào)試的線程,可以在這里切換到別的線程:
總結(jié)
以上是生活随笔為你收集整理的VS2017断点调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在VS中创建多个项目
- 下一篇: 读取串口数据