Visual Studio Debug實戰(zhàn)教程之?dāng)帱c操作
前言
調(diào)試技巧是衡量程序員水平的一個重要指標(biāo).掌握好的調(diào)試技巧與工具的使用方法,也是非常重要的.
Visual Studio 調(diào)試程序有助于你觀察程序的運行時行為并發(fā)現(xiàn)問題。 該調(diào)試器可用于所有 Visual Studio 編程語言及其關(guān)聯(lián)的庫。 使用調(diào)試程序時,可以中斷程序的執(zhí)行以檢查代碼、檢查和編輯變量、查看寄存器、查看從源代碼創(chuàng)建的指令,以及查看應(yīng)用程序占用的內(nèi)存空間。
斷點,可以說是 Debug 過程中最常用的功能。
但是大家最熟悉最經(jīng)常使用的可能就是普通的斷點。其實,關(guān)于斷點,Visual Studio 有很多的高級功能,有些簡直就是調(diào)試?yán)靼 ?/p>
本次教程將介紹 Visual Studio 關(guān)于斷點的更多高級玩法。
1. 普通斷點
為了保證內(nèi)容完整性,還是要說下普通斷點。
設(shè)置普通斷點的方法很簡單,就是在代碼行的左邊欄灰色區(qū)域點擊或者把光標(biāo)放在某代碼行,按下 F9。

如上圖所示,此時左邊欄出現(xiàn)的紅色圓點就代表了一個斷點。
按下 F5, Debugger 就會在此處停下來。
2. 條件斷點
不像是普通的斷點,程序每次執(zhí)行都會停下來。條件斷點的意義是,只有在條件被滿足時,Debugger 才會在此處停下來。
設(shè)置條件斷點一般的方法是在紅點處右鍵選擇條件或者把光標(biāo)放在紅點處,等待齒輪圖標(biāo)出現(xiàn)并點擊。

條件斷點設(shè)置窗口如下。

總共有三種類型的條件斷點:
- 條件表達(dá)式 (Conditional Expression)
- 命中次數(shù) (Hit Count)
- 篩選器 (Filter)
條件表達(dá)式
條件表達(dá)式也有兩種類型:
為 ture (Is ture)
如下圖示,此處設(shè)置的條件為: 當(dāng) testInt == 4 is ture 時命中斷點。

更改時 (When changed)
如下圖示,此處設(shè)置的條件為: 當(dāng) testInt 被更改的時候命中斷點。

命中次數(shù)
命中次數(shù)在 Debug 循環(huán)語句時非常有用。
比如你懷疑程序出錯點發(fā)生在 N 次循環(huán)之后或者某些次循環(huán),那么可以設(shè)置循環(huán)語句內(nèi)的命中次數(shù),讓它在某些次或者某次循環(huán)停下來,而不是每次都停下來。
如下圖,設(shè)置的條件為:讓它每隔一次循環(huán)斷下來。

篩選器
篩選器是用來限制斷點命中時所在的設(shè)備、進(jìn)程和線程。
比如,在一個多線程的程序中,你不必手動 GetThreadId,可以通過篩選器,設(shè)置讓它只在某線程中執(zhí)行到此處時停下來。

篩選器表達(dá)式用法為:
MachineName = "name"
ProcessId = value
ProcessName = "name"
ThreadId = value
ThreadName = "name"
多個表達(dá)式之間可以使用運算符 & (AND), || (OR), ! (NOT) 連接 。
3. 追蹤斷點
在斷點設(shè)置窗口,除了條件,我們還可以看到操作 (Action)選項框。

操作 (Action) 的意義是設(shè)置追蹤點 (Tracepoint)。
Tracepoint 相當(dāng)于是一種臨時的有 Trace 功能的斷點,它會把消息打印到 Output 窗口。
勾選后面的繼續(xù)執(zhí)行 (Continue Execution),代表 Tracepoint 命中時,Debugger 不會停下來,否則將會在此處停下來。兩種情況下,消息都會打印出來。
可以使用下面的關(guān)鍵字作為消息。

4. 函數(shù)斷點
在 Debug 菜單下,點擊新建斷點,可以新建兩種類型的斷點:函數(shù)斷點 (Function Breakpoint)和數(shù)據(jù)斷點(Data Breakpoint)。

函數(shù)斷點是通過函數(shù)名設(shè)置斷點,當(dāng)程序執(zhí)行到該函數(shù)的時候斷點斷下來。

5. 數(shù)據(jù)斷點
緊接上面,這里講下數(shù)據(jù)斷點。
數(shù)據(jù)斷點的意義是,讓程序在當(dāng)某處地址指定字節(jié)發(fā)生改變的時候中斷下來。它只有在 Break Mode 下才可以設(shè)置。

地址欄可以用具體的內(nèi)存地址,也可以用表達(dá)式來代表內(nèi)存地址。例如,可以使用 &avar,讓程序在當(dāng)變量 avar 內(nèi)容發(fā)生改變的時候中斷下來。
6. 在 Call Stack Window 設(shè)置斷點
也許你不知道,是可以在 Call Stack 窗口設(shè)置斷點的。

當(dāng)你在查看函數(shù)的調(diào)用關(guān)系的時候,想在這一些列的函數(shù)中快速設(shè)置斷點,那么其實很簡單:在 Call Stack 窗口,點擊想要設(shè)置斷點的函數(shù)所在的行,按下 F9 即可。
7. 在 Disassembly Window 設(shè)置斷點
還可以在 Disassembly 窗口設(shè)置斷點。但前提必須是 Break Mode 下。

反匯編窗口設(shè)置斷點的方式跟在源代碼中設(shè)置斷點的方式相同,只要在代碼左邊欄邊緣處點擊一下,紅色圓點就出現(xiàn)了。
8. 斷點管理
我們前面所設(shè)置的所有斷點都會出現(xiàn)在斷點窗口 (Breakpoints Windows)。

在這里,可以對所有的斷點進(jìn)行管理,比如批量啟用、禁用、刪除等,還可以在程序運行過程中,查看斷點的命中狀態(tài)。
當(dāng)你的工程非常大,Debug 時設(shè)置了很多的斷點的時候,它會非常有用。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
C#實現(xiàn)上傳照片到物理路徑,并且將地址保存到數(shù)據(jù)庫的小例子
這篇文章主要介紹了c#上傳圖片,并將地址保存到數(shù)據(jù)庫中的簡單實例,有需要的朋友可以參考一下2013-12-12
ASP.NET Core+Docker+Jenkins實現(xiàn)持續(xù)集成的完整實例
這篇文章主要給大家介紹了關(guān)于ASP.NET Core+Docker+Jenkins實現(xiàn)持續(xù)集成的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
asp.net 在線編輯word文檔 可保存到服務(wù)器
使用說明:該方法只在office xp 和 2003上 測試通過,2000及以下 版本沒試。2010-01-01
Visual Stduio 2010開發(fā)環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了Visual Stduio 2010開發(fā)環(huán)境搭建教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
ASP.NET項目開發(fā)中日期控件DatePicker如何使用
這篇文章主要為大家詳細(xì)介紹了ASP.NET項目開發(fā)中日期控件DatePicker的使用方法,感興趣的小伙伴們可以參考一下2016-04-04
.NET?Core?線程池(ThreadPool)底層原理源碼解析
文章介紹了.NET?Core線程池的結(jié)構(gòu)和工作原理,包括生產(chǎn)者-消費者模型、線程饑餓問題、線程池增長策略等,同時,對比了Task和線程池在并發(fā)編程中的優(yōu)缺點,并推薦使用Task來優(yōu)化線程池的使用,感興趣的朋友一起看看吧2024-11-11
VS2017 Cordova Ionic2 移動開發(fā)環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了VS2017 Cordova Ionic2 移動開發(fā)環(huán)境搭建教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04

