程式設計技巧 --- VS如何除錯.Net原始碼

NiueryDiary發表於2023-11-27

引言

如題,在VS中如何除錯 .Net 原始碼呢?

一般來說,VS2022,都是預設啟用 F12 轉到定義能夠看到原始碼,如果大家發現自己無法使用 F12 檢視原始碼,可以在 "工具" -> "選項" -> "文字編輯器" -> "C#" -> "高階" -> "轉到定義",勾選所有選項就對了。

image.png

但是光以上的操作還是不夠的,這樣的可以檢視原始碼中型別和成員的宣告,但不能看到其實現。
比如,在WPF中,Code-Behind 中使用 FindResource() 查詢資源,那我們直接 F12 轉到定義,則像這樣:
image.png

我們僅能看到他是 FrameworkElement 型別下的一個方法。並沒有具體實現。

示例

那我們怎麼看它的具體實現呢?

首先,我們需要有對應的配置,那就是需要啟用原始碼單步執行。

  1. 在"工具"(或"除錯") -> "選項" -> "除錯" -> "常規"下,確保:
    • 取消選擇"啟用僅我的程式碼"。
    • 選擇"啟用源連結支援"。
  2. 在"工具"(或“除錯”) -> "選項" -> "除錯" -> "符號"下,選擇"Microsoft 符號伺服器"。

image.png

image.png

這樣配置完之後,我們就可以使用"呼叫堆疊"視窗下載和載入符號進行原始碼除錯。

這裡需要注意,當你配置完上述設定後,第一次啟動應用會有較長的一段符號載入的時間,耐心等待。

image.png

準備

首先新建一個WPF專案,窗體中放置一個“測試按鈕”,然後建立一個 Buttonstyle,像這樣:

<Window.Resources>
    <Style x:Key="buttonStyle" TargetType="Button">
        <Setter Property="Background" Value="Red" />
        <Setter Property="FontSize" Value="22" />
        <Setter Property="Foreground" Value="Yellow" />
    </Style>
</Window.Resources>
<Grid>
    <Button
        x:Name="button"
        Width="200"
        Height="80"
        HorizontalAlignment="Center"
        VerticalAlignment="Center"
        Content="測試按鈕"/>
</Grid>

然後,我們主窗體的 Loaded 事件中透過 FindResource() 來給這個按鈕繫結樣式,如下:

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
   button.Style = FindResource("buttonStyle") as Style; 
} 

除錯

接下來除錯就很簡單了,我們在 Loaded 事件中打斷點,命中斷點後,我們就可以直接透過 F11 進入 FindResource() 的原始碼方法體中了,如下:

image.png

從圖中也可以看出,它是可以進行單步除錯的,且也能獲取到上下文或引數的值。
image

小結

本文講解了如何透過 VS2022 除錯 .Net 原始碼,學會原始碼除錯,是一項強有力的技能。

透過除錯原始碼,可以逐步跟蹤程式碼的執行流程,觀察資料的變化,更直觀地理解程式碼的執行方式,深入理解框架工作原理。

更重要的是透過它分析問題根源,在除錯過程中,你可以找到問題的根源,比如變數的狀態、方法的呼叫流程等,提升我們解決BUG的效率。

建議大家動手實踐,提升自己的除錯技巧。

參考連結

https://learn.microsoft.com/zh-cn/visualstudio/debugger/how-to-debug-dotnet-framework-source?view=vs-2022

相關文章