title | author | date | CreateTime | categories |
---|---|---|---|---|
VisualStudio 斷點調試詳解
|
lindexi
|
2019-11-29 08:41:17 +0800
|
2019-06-21 16:16:57 +0800
|
VisualStudio
|
本文詳細告訴大家 VisualStudio 斷點調試的功能和使用方法,本文使用的是最新 VisualStudio2019 的功能,也許在你看到這篇博客的時候這個版本已經過時
本文將會按照從簡單到復雜,從常用的到不常用的方式,告訴大家斷點調試方法
在代碼行添加斷點
將光標定位到某一行,在此行的左邊,也就是下圖顯示紅色斷點的地方,進行點擊,此時就可以在此行添加斷點。或通過在此行按下 F9 鍵添加斷點
運行程序,當程序運行到此行的時候,將會進入斷點,程序將會暫停進入調試
從代碼行添加斷點是最常用的方法
添加函數斷點
點擊工具欄的 調試-窗口-斷點 打開斷點設置
點擊添加可以添加函數斷點,函數斷點需要添加限定符,完全的表達式如下
命名空間.類.方法(參數)
例如
WegaljifoWhelbaichewair.Program.Main(string[])
但是一般都可以簡寫,如不存在重載方法的時候,不需要添加參數,如上面代碼可以去掉string[]
在沒有重載的主函數。如不存在多重命名沖突的時候,可以去掉命名空間
從調用堆棧添加斷點
在 VisualStudio 暫停程序進入斷點的時候,可以點擊 調試-窗口-調用堆棧 打開調用堆棧窗口,在調用堆棧窗口可以點擊某個方法右擊添加斷點
在調用堆棧可以雙擊堆棧里面的方法進入此前的調用方法,在進入的時候可以看到進入這個方法的局部變量
如上圖是我的一個程序運行的調用堆棧,在堆棧的每一項就是一次方法調用,在對應的一項上面右擊可以選擇添加斷點
這里可以選擇添加斷點或追蹤點,關於斷點或追蹤點的不同在哪將會在下文說到
添加匯編斷點
在 VisualStudio 提供匯編的功能,可以將代碼轉匯編
在調試匯編的時候也可以在匯編代碼添加斷點
從 調試-窗口-反匯編 可以打開匯編窗口,在這個頁面里面將光標定位到需要添加斷點的行,按下快捷鍵 F9 就可以在這一行添加斷點
或者用鼠標在頁面的左側,也就是上一步添加斷點時斷點顯示的行,點擊一下就可以添加斷點
以上就是添加斷點的各個方法
從代碼行斷點轉函數斷點
對於一個大的項目,想要添加函數斷點還是比較難的,原因是寫全命名空間是比較大的成本。如果此時可以拿到對應源代碼,嘗試在源代碼上面添加斷點,從斷點窗口可以將代碼行斷點轉函數斷點
在斷點窗口點擊 顯示列 可以選擇函數,此時就可以看到斷點窗口顯示多了一列是函數,這就是添加斷點對應的函數,在這個函數里面會寫全命名空間。如果在運行時,將會添加對應的程序文件
鼠標選中對應的斷點一行按下快捷鍵 ctrl+c 進行復制,在文本編輯器進行粘貼,可以看到如下代碼
名稱;標簽;條件;命中次數;函數
KikuSimairme.cs,行 161 字符 9;;;總是中斷(當前為 1);NawbemcemXadre.exe!NawbemcemXadre.KikuSimairme.CreateD2DRender()
最函數對應的一列復制出來,這時這個內容就可以作為斷點窗口的新建函數斷點的函數表達
關閉斷點方法
關閉斷點的方法有兩個,一個是禁用斷點一個是刪除斷點
選禁用斷點,可以看到斷點變白,刪除斷點將可以在斷點窗口刪除這個斷點。通過禁用斷點可以在下次需要斷點時還可以快速開啟,而刪除斷點之后不提供恢復方法
禁用斷點有兩個方法,第一個方法是在對應的斷點的代碼行,將鼠標移動到斷點上方,此時會顯示如下圖的兩個按鈕
點擊右邊白色的圓的按鈕就可以禁用斷點
在斷點被禁用的時候,還是將鼠標移動到斷點上,但是顯示出來的右邊的白色的圓的按鈕就可以開啟斷點,這個按鈕的功能是開啟或禁用斷點
另一個禁用斷點的方法是通過斷點窗口選擇對應的斷點,右擊禁用按鈕就可以禁用斷點,在斷點被禁用的時候
在斷點窗口的禁用或打開斷點的按鈕的功能是如果用戶有勾選某些斷點,那么點擊的時候對被勾選的斷點生效,否則對當前顯示的所有斷點生效
同樣在斷點窗口也可以進行刪除斷點,在禁用或開啟斷點的按鈕旁邊就是刪除斷點,這個按鈕的功能和禁用斷點按鈕的功能一樣,如果有用戶勾選某些斷點的時候就刪除被勾選的斷點,否則就刪除當前顯示的所有斷點
另外一個刪除按鈕是只刪除當前選中項,對於被勾選的斷點不會被刪除,幾個按鈕的功能請看下圖
條件斷點
如果打上斷點每次都進來,有時也會降低調試的速度,例如我在循環的開始打上斷點,每次循環都進入斷點,剛好這個循環需要循環 1000000000 次,假設一秒能調試一次,請問你調試完成這個循環需要多久
為了讓小伙伴可以快速進行調試,忽略自己不關注的斷點,在 VisualStudio 提供了條件斷點的功能,給斷點進入添加條件
給斷點添加條件有兩個方法,第一個方法和使用代碼行添加斷點的方法相同,將鼠標移動到斷點上,此時可以看到顯示了兩個按鈕,在上文說到禁用或啟動斷點的時候用到了右邊的按鈕,現在給斷點添加條件需要用到第一個按鈕
這兩個按鈕的功能如下圖
另一個設置方法是在斷點窗口里面右擊對應的斷點,點擊設置就可以顯示設置窗口
請勾選條件選項,此時可以添加很多條件
命中數
點擊條件下拉可以選命中數,可選的是當命中數是多少的時候,或大於多少等,表示在這個斷點被經過了多少次的時候進入
如我選擇命中數等於 3 那么將會在代碼經過這個斷點這一行的第三次進入斷點
在斷點的中途可以選擇重置次數
又如我在進入一個循環,我想在每 100 次的時候進入暫停讓我看一下,我可以添加命中數選數倍於 100 就可以
條件表達式
在條件表達式是比較復雜的功能,可以將當前的局部變量和實例變量,靜態變量添加表達式,可選當表達式的返回值是 true 或者當表達式發生修改時進入斷點的方法
在選擇表達式為 true 時暫停可以在表達式輸入布爾返回值的表達式
在使用的表達式可以使用變量等的屬性或字段,或直接使用變量進行判斷
例如我當前方法有一個局部變量 foo
和一個字段 _f1
我需要在這兩個都不為空的時候進入斷點,此時可以添加一下表達式
添加表達式可以使用對象的私有字段
多個表達式的與關系使用 &&
符號,或關系使用 ||
和普通表達式相同
篩選器
有時候在調試多線程的時候只是需要在某個線程才進入斷點,此時可以選擇篩選器輸入對應的線程號,在篩選器可以選擇機器名、進程的 ID 和進程名、線程號和線程名,可以判斷當前是等於或不等於
如我需要判斷當前的線程是 2 的時候進入斷點,我可以這樣寫
ThreadId = 19768
這里的等於號寫 =
或 ==
都可以,多個條件可以使用 &
與和 ||
或連接
可以選的判斷有機器名、進程的 ID 和進程名、線程號和線程名
- MachineName = "name"
- ProcessId = value
- ProcessName = "name"
- ThreadId = value
- ThreadName = "name"
如果同時需要添加篩選器和條件表達式可以點擊添加條件,多個條件是與關系,需要同時成立才能進入斷點
值修改斷點
在 VisualStudio 2019 支持對 dotnet core 3.0 的程序添加值更改斷點,支持對某個屬性或字段添加值更改斷點,在這個屬性或值修改就進入斷點
在局部變量和自動窗口等都可以右擊某個屬性設置值更改中斷將會在這個值被修改的時候進入斷點
斷點輸出
還記得在調用堆棧右擊添加斷點的時候可以選追蹤點不,其實在斷點添加輸出就是追蹤點的功能,有時候不能進入斷點但是希望知道當前程序的運行,例如我在觸摸的時候我就不能直接進斷點,我需要在方法里面變量輸出到控制台,此時就可以用到追蹤點功能
和上文的設置條件斷點相同的方法進入斷點設置,勾選操作,此時可以選擇輸出到控制台的內容,輸出的格式是直接輸入的文本將會直接輸出,對於變量請使用{}
包含
如我需要輸出 Foo
屬性的值,那么可以添加下面代碼
我說的是{Foo}
在斷點輸出和條件斷點是沒有沖突的可以設置符合某個條件的時候就執行輸出
在輸出內容可以添加一些預設的值,例如當前的函數,將會輸出 命名控件.類.函數 的格式,使用方法如下
當前的方法是 $FUNCTION 在這個方法
還可以使用的預設的值有很多
$ADDRESS
當前函數和地址,輸出如lindexi.Foo.F1() + 0x7d3abc380000025c
比較少使用$CALLER
調用這個方法的方法名,輸出如lindexi.Foo.F2
當前我進入 F1 方法是在 F2 使用的$CALLSTACK
將會顯示調用堆棧,將會從程序的入口到當前方法的調用堆棧一個個顯示$FUNCTION
當前調用的方法,輸出如lindexi.Foo.F1()
這個方法會比輸出當前函數和地址常用$PID
當前進程號$TID
當前線程號$TNAME
當前線程名$TICK
系統從開啟到現在的毫秒數
在使用輸出的時候可以選擇繼續執行,此時斷點不會停下而是會輸出繼續運行程序
管理斷點
在斷點窗口提供了斷點管理的方法,我會在項目里面使用很多的斷點但是我需要在調試不同的模塊開啟或禁用一些斷點,此時就需要用到斷點的管理功能
在斷點窗口提供搜尋的功能,如下圖在搜尋輸入框輸入字符串按下回車將會在窗口顯示滿足條件的斷點,注意此時不滿足條件的斷點不會失效,只是沒有顯示
可以選擇 在列中 的數據作為搜尋范圍,如選擇條件和函數,通過選擇函數可以過濾某個命名空間
經常使用的是右擊斷點添加標簽,右擊斷點點擊編輯標簽就可以添加標簽,可以給一個斷點添加多個標簽,此后選擇 在列中 的標簽作為范圍,可以直接顯示某個標簽的斷點
此時點擊開啟或禁用斷點按鈕或刪除斷點按鈕就可以對當前顯示的斷點進行全部開啟或禁用等
保存斷點
默認的斷點數據保存在哪
默認會保存在 .vs\**\.suo
文件里面,也就是斷點是不隨代碼倉庫提交的,但是我需要將我的斷點發送到另一台設備使用?除了復制一個 .vs
文件夾之外,還可以導出斷點到文件。在斷點窗口提供導出和導入斷點的功能,可以通過點擊按鈕導出當前滿足搜尋條件的所有斷點,即使你沒有對他打鈎,或右擊某個斷點點擊導出
導出的斷點是 xml 格式,對於代碼行斷點用途不大,因為代碼行都會不斷修改,而對於函數斷點倒是有一點用,這個功能用途不是很多,實際我會在代碼里面通過 Debugger.Break
添加斷點如果我覺得這個斷點很多小伙伴都需要
Use breakpoints in the debugger
更多調試技巧請看 Visual Studio 調試技巧 - LightSmaile - 博客園
我錄了一個很無聊的課件視頻,歡迎小伙伴點擊下面課件
更多請看 dotnet 代碼調試方法 這是一篇我寫了很久的博客,包含了很多有趣的調試方法