偵錯
您可以使用 Microsoft C# 擴充功能,在 Visual Studio Code 中偵錯 C# 應用程式。
執行與偵錯
C# 擴充功能與 C# 開發套件 提供多種方式來執行和偵錯您的 C# 應用程式。
若要在沒有 C# 開發套件的情況下執行和偵錯,請參閱 Microsoft C# 擴充功能的 GitHub 頁面以取得文件。
使用 F5 偵錯
在安裝 C# 開發套件擴充功能且偵錯檢視中沒有可供選取的偵錯組態的情況下,您可以開啟 .cs
檔案,然後按下 F5,即可開始偵錯專案。偵錯工具會自動尋找您的專案並開始偵錯。如果您有多個專案,系統會提示您要開始偵錯哪個專案。
您也可以從 VS Code 側邊欄的 執行與偵錯 檢視中開始偵錯工作階段。如需詳細資訊,請參閱 VS Code 中的偵錯。
使用方案總管偵錯
在安裝 C# 開發套件擴充功能後,當您在方案總管中以滑鼠右鍵按一下您的專案時,會出現 偵錯 內容功能表。
有三個選項
- 啟動新執行個體 - 這會啟動您的專案並附加偵錯工具。
- 開始但不偵錯 - 這會執行您的專案,但不附加偵錯工具。
- 逐步執行至新執行個體 - 這會啟動您的專案並附加偵錯工具,但在程式碼的進入點停止。
使用命令面板偵錯
在安裝 C# 開發套件擴充功能後,您也可以從命令面板 ⇧⌘P (Windows、Linux Ctrl+Shift+P) 使用 偵錯:選取並開始偵錯 命令來開始偵錯。
注意:這會將啟動組態項目新增至您的偵錯下拉式清單。
使用動態 (記憶體內) 啟動組態偵錯
在安裝 C# 開發套件擴充功能後,您可以建立動態啟動組態。建立方式取決於您的專案是否有現有的 launch.json
檔案。
現有的 launch.json
如果您有現有的 launch.json
,您可以移至偵錯檢視,選取下拉式清單,然後選取 C#
選項。這應該會提供您可以新增至下拉式清單的啟動目標選取項目。選取後,您可以按下 F5 或使用新產生的組態 開始偵錯。
沒有 launch.json
如果您的專案中沒有 launch.json
,您可以在偵錯檢視的 顯示所有自動偵錯組態 中新增和存取這些動態組態。
移除動態 (記憶體內) 啟動組態
您可以使用命令面板 ⇧⌘P (Windows、Linux Ctrl+Shift+P) 和 偵錯:選取並開始偵錯 命令來移除產生的組態。
在下拉式清單中,它會列出所有現有的偵錯組態。如果您將滑鼠指標停留在動態組態上方,右側會出現可按一下的垃圾桶圖示。您可以選取該圖示來移除動態組態。
使用編輯器偵錯/執行按鈕偵錯
當 .cs
檔案在編輯器中開啟時,可以透過位於編輯器視窗右上角的按鈕存取執行和偵錯選項。這些動作將使用目前檔案來查詢專案系統,並判斷要啟動的相關聯專案。
這兩個選項為
-
執行與此檔案相關聯的專案
:這將使用偵錯配接器啟動您的程式,並將noDebug: true
設為 true。 -
偵錯與此檔案相關聯的專案
:這將在偵錯工具下啟動您的程式。
使用 launch.json 偵錯
如果您使用 C# 開發套件,我們建議不要使用此選項。但是,如果您需要直接修改偵錯組態,請參閱 設定 C# 偵錯的 launch.json。
附加至處理序
您可以使用命令面板 ⇧⌘P (Windows、Linux Ctrl+Shift+P) 並執行 偵錯:附加至 .NET 5+ 或 .NET Core 處理序 命令,以附加至 C# 處理序。
組態選項
有許多選項和設定可用於設定偵錯工具。您可以使用 launchSettings.json
、VS Code 使用者設定 來修改偵錯選項,或直接修改您的 launch.json
。
launchSettings.json
如果您有 Visual Studio 的 launchSettings.json
,您應該會看到使用 從 F5 執行 或 從命令面板執行 列出的設定檔。
如需更多詳細資訊,請參閱 設定 C# 偵錯。
使用者設定
如果您在使用 C# 偵錯工具時想要變更設定,您可以在 檔案 > 喜好設定 > 設定 (⌘, (Windows、Linux Ctrl+,)) 下找到這些選項,並搜尋這些選項。
csharp.debug.stopAtEntry
- 如果為 true,偵錯工具應該在目標的進入點停止。此選項預設為false
。csharp.debug.console
- 在啟動主控台專案時,指出應該將目標程式啟動到哪個主控台。注意: 此選項僅適用於 'dotnet' 偵錯組態類型。internalConsole
[預設] - VS Code 的偵錯主控台。此模式可讓您在一個位置看到來自偵錯工具和目標程式的訊息。如需更多詳細資訊,請參閱 完整文件。integratedTerminal
- VS Code 的整合式終端機。externalTerminal
- 可以透過使用者設定設定的外部終端機。
csharp.debug.sourceFileMap
- 將建置時間路徑對應至本機原始碼位置。所有建置時間路徑的執行個體都將取代為本機原始碼路徑。
範例
{\"<建置路徑>\":\"<本機原始碼路徑>\"}
csharp.debug.justMyCode
- 啟用 (預設) 時,偵錯工具只會顯示和逐步執行使用者程式碼 ("我的程式碼"),而忽略系統程式碼和其他已最佳化或沒有偵錯符號的程式碼。更多資訊。csharp.debug.requireExactSource
- 要求目前原始碼與 pdb 相符的旗標。此選項預設為true
。csharp.debug.enableStepFiltering
- 啟用逐步執行屬性和運算子的旗標。此選項預設為true
。csharp.debug.logging.exceptions
- 判斷是否應將例外狀況訊息記錄到輸出視窗的旗標。此選項預設為true
。csharp.debug.logging.moduleLoad
- 判斷是否應將模組載入事件記錄到輸出視窗的旗標。此選項預設為true
。csharp.debug.logging.programOutput
- 判斷在未使用外部主控台時,是否應將程式輸出記錄到輸出視窗的旗標。此選項預設為true
。csharp.debug.logging.diagnosticsLog
- 用於診斷偵錯工具問題的各種設定。csharp.debug.logging.browserStdOut
- 判斷是否應將從啟動 Web 瀏覽器產生的 stdout 文字記錄到輸出視窗的旗標。此選項預設為true
。csharp.debug.logging.elapsedTiming
- 如果為 true,引擎記錄會包含adapterElapsedTime
和engineElapsedTime
屬性,以指出要求所花費的時間 (以微秒為單位)。此選項預設為false
。csharp.debug.logging.threadExit
- 控制在目標處理序中的執行緒結束時是否記錄訊息。此選項預設為false
。csharp.debug.logging.processExit
- 控制在目標處理序結束或偵錯停止時是否記錄訊息。此選項預設為true
。csharp.debug.suppressJITOptimizations
- 如果為 true,當最佳化模組 (在發行組態中編譯的 .dll) 載入目標處理序時,偵錯工具會要求 Just-In-Time 編譯器產生停用最佳化的程式碼。更多資訊csharp.debug.symbolOptions.searchPaths
- 要搜尋 .pdb 檔案的符號伺服器 URL (範例:http://MyExampleSymbolServer
) 或目錄 (範例:/build/symbols) 陣列。除了模組旁邊的預設位置以及最初卸載 pdb 的路徑之外,還會搜尋這些目錄。csharp.debug.symbolOptions.searchMicrosoftSymbolServer
- 如果為true
,Microsoft 符號伺服器 (https://msdl.microsoft.com/download/symbols
) 會新增至符號搜尋路徑。如果未指定,此選項預設為false
。csharp.debug.symbolOptions.searchNuGetOrgSymbolServer
- 如果為true
,NuGet.org 符號伺服器 (https://symbols.nuget.org/download/symbols
) 會新增至符號搜尋路徑。如果未指定,此選項預設為false
。csharp.debug.symbolOptions.cachePath
- 應該快取從符號伺服器下載的符號的目錄。如果未指定,在 Windows 上,偵錯工具預設為%TEMP%\\SymbolCache
,而在 Linux 和 macOS 上,偵錯工具預設為~/.dotnet/symbolcache
。csharp.debug.symbolOptions.moduleFilter.mode
- 控制模組篩選器運作的兩種基本操作模式中的哪一種。loadAllButExcluded
- 載入所有模組的符號,除非模組位於excludedModules
陣列中。loadOnlyIncluded
- 不要嘗試載入任何模組的符號,除非模組位於includedModules
陣列中,或透過includeSymbolsNextToModules
設定包含。
csharp.debug.symbolOptions.moduleFilter.excludedModules
- 偵錯工具不應載入符號的模組陣列。支援萬用字元 (範例:MyCompany.*.dll)。除非mode
設定為loadAllButExcluded
,否則會忽略此屬性。csharp.debug.symbolOptions.moduleFilter.includedModules
- 偵錯工具應載入符號的模組陣列。支援萬用字元 (範例:MyCompany.*.dll)。除非mode
設定為loadOnlyIncluded
,否則會忽略此屬性。csharp.debug.symbolOptions.moduleFilter.includeSymbolsNextToModules
- 如果為 true,對於不在includedModules
陣列中的任何模組,偵錯工具仍會檢查模組本身和啟動可執行檔旁邊的位置,但不會檢查符號搜尋清單上的路徑。此選項預設為true
。除非mode
設定為loadOnlyIncluded
,否則會忽略此屬性csharp.debug.allowFastEvaluate
- 如果為 true (預設狀態),偵錯工具會嘗試透過模擬簡單屬性和方法的執行來進行更快速的評估。csharp.experimental.debug.hotReload
- 如果為 true,偵錯工具會在目標應用程式支援熱重新載入時啟用在偵錯時套用變更。csharp.debug.hotReloadOnSave
- 如果為 true (預設狀態),偵錯工具會在檔案儲存時自動套用程式碼變更。csharp.debug.hotReloadVerbosity
- 控制 C# 熱重新載入 輸出視窗的記錄詳細程度。它可以設定為minimal
(預設)、detailed
或diagnostic
。如果熱重新載入開始出現非預期的行為,建議增加詳細程度層級。
中斷點
C# 偵錯工具支援各種中斷點,例如原始碼行中斷點、條件中斷點和記錄點。
中斷點 - 條件中斷點
在運算式評估的協助下,偵錯工具也支援條件中斷點。您可以將中斷點設定為在運算式評估為 true 時中斷。
中斷點 - 函式中斷點
偵錯工具也支援函式中斷點。您可以按一下偵錯窗格中斷點區段中的 +
,將中斷點設定為在特定函式上中斷。
中斷點 - 記錄點
記錄點 (在 Visual Studio 中也稱為追蹤點) 可讓您將輸出傳送至偵錯主控台,而無需編輯程式碼。它們與中斷點不同,因為它們不會停止應用程式的執行流程。
若要新增記錄點,請在程式碼行旁邊的最左邊邊界中按一下滑鼠右鍵。選取 新增記錄點,然後輸入您要記錄的訊息。當點擊記錄點時,將會評估大括號 ('{' 和 '}') 之間的任何運算式。
記錄訊息中也支援下列權杖
權杖 | 描述 | 範例輸出 |
---|---|---|
$FILEPOS | 目前原始檔位置 | C:\sources\repos\Project\Program.cs:4 |
$FUNCTION | 目前函式名稱 | Program.<Main>$ |
$ADDRESS | 目前指令 | 0x00007FFF83A54001 |
$TID | 執行緒識別碼 | 20668 |
$PID | 處理序識別碼 | 10028 |
$TNAME | 執行緒名稱 | <無執行緒名稱> |
$PNAME | 處理序名稱 | C:\sources\repos\Project\bin\Debug\net7.0\console.exe |
$CALLER | 呼叫函式名稱 | void console.dll!Program.Foo() |
$CALLSTACK | 呼叫堆疊 | void console.dll!Program.Bar() void console.dll!Program.Foo() void console.dll!Program.<Main>$(string[] args) [外部程式碼] |
$TICK | 計時週期計數 (來自 Windows GetTickCount) | 28194046 |
$HITCOUNT | 點擊此中斷點的次數 | 5 |
中斷點 - 觸發的中斷點
觸發的中斷點是在點擊另一個中斷點後自動啟用的中斷點。當診斷僅在特定前提條件之後發生的程式碼中的失敗案例時,它們可能非常有用。
可以透過在字形邊界上按一下滑鼠右鍵、選取 新增觸發的中斷點,然後選擇哪個其他中斷點啟用中斷點來設定觸發的中斷點。
例外狀況時停止
C# 偵錯工具支援在擲回或攔截例外狀況時偵錯工具停止的組態選項。這透過 執行 檢視的 中斷點 區段中的兩個不同項目來完成
請注意,在第一次使用 C# 偵錯工具偵錯資料夾之前,中斷點 區段將會遺失這些項目。
勾選 所有例外狀況 將會設定偵錯工具在擲回例外狀況時停止。如果啟用 僅限我的程式碼 (預設為啟用),則如果例外狀況在程式庫程式碼中內部擲回並攔截,偵錯工具將不會中斷。但是,如果例外狀況在程式庫程式碼中擲回並傳回給使用者程式碼,偵錯工具將會中斷。
勾選 使用者未處理的例外狀況 將會設定偵錯工具在使用者程式碼中擲回或透過使用者程式碼傳輸後,在非使用者程式碼中攔截例外狀況時停止。成為使用者未處理的例外狀況不一定是偵錯中處理序中的錯誤 - 可能是使用者程式碼正在實作 API,並預期會引發例外狀況。在許多情況下,確實存在實際問題,因此,預設情況下,偵錯工具會在例外狀況變成使用者未處理時停止。
例外狀況條件
這兩個核取方塊都支援僅在選取的例外狀況類型上中斷的條件。若要編輯條件,請選取鉛筆圖示 (請參閱上方影像) 或以滑鼠右鍵按一下項目並叫用 編輯條件。條件是要中斷的例外狀況類型逗號分隔清單,或者,如果清單以 '!' 開頭,則是要忽略的例外狀況類型清單。
範例條件
範例條件值 | 結果 |
---|---|
System.NullReferenceException | 這只會在 NullReferenceException 上中斷。 |
System.NullReferenceException, System.InvalidOperationException | 這會在 NullReferenceException 和 InvalidOperationException 上中斷。 |
!System.Threading.Tasks.TaskCanceledException | 這會在 TaskCanceledException 以外的所有例外狀況上中斷。 |
!System.Threading.Tasks.TaskCanceledException, System.NotImplementedException | 這會在 TaskCanceledException 和 NotImplementedException 以外的所有例外狀況上中斷。 |
運算式評估
偵錯工具也讓您可以在 監看式 視窗以及偵錯主控台中評估運算式。
熱重新載入
在安裝 C# 開發套件擴充功能後,偵錯工具可讓您在偵錯時套用 C# 程式碼變更。
為了啟用熱重新載入,csharp.experimental.debug.hotReload
必須設定為 true,請參閱 使用者設定 以取得更多資訊。只有在目標偵錯工具引擎支援套用程式碼變更時,才會啟動熱重新載入工作階段。
支援的專案和案例
C# 開發套件支援 "傳統" 熱重新載入體驗,也稱為編輯後繼續。無論您是否停在中斷點或程式正在執行,您都可以在偵錯時套用程式碼變更。
截至 2023 年 11 月,某些功能 (例如 MetadataUpdateHandler
) (可讓 ASP.NET Core 應用程式在進行變更後自動重新整理瀏覽器 ) 尚無法使用。也不支援在不偵錯的情況下套用程式碼變更。
執行階段在 .NET 8 中新增了在 Linux/macOS 上偵錯時套用變更的支援,因此在 Linux/macOS 上執行的 .NET 應用程式套用程式碼變更時,需要 .NET 8+ 的執行階段版本。
應用程式類型 | 支援使用 C# 開發套件進行熱重新載入 | 需要 .NET 8+ |
---|---|---|
主控台 | ✅ | 僅限 Linux/macOS |
測試專案 | ✅ | 僅限 Linux/macOS |
類別庫專案 | ✅ | 僅限 Linux/macOS |
ASP.NET Core | ⚠️* 目前僅支援 .cs 檔案的變更 |
僅限 Linux/macOS |
MAUI | ❌* 即將推出 | -- |
Unity | ❌ | -- |
如需 C# 開發套件目前支援的專案的詳細資訊,請參閱 支援的專案。另請參閱 C# 開發套件常見問題,以取得有關其他不支援案例的疑難排解的更多資訊。
如何套用程式碼變更
一旦熱重新載入工作階段開始且進行新的變更,您可以使用下列任何動作將這些變更套用至您的應用程式
動作 | 說明 |
---|---|
熱重新載入 Ctrl+Shift+Enter |
套用程式碼變更,可從 偵錯工具列 取得。 |
儲存檔案 ⌘S (Windows、Linux Ctrl+S) |
如果 csharp.debug.hotReloadOnSave 設定為 true,則開始套用程式碼變更。請參閱 使用者設定 以取得更多資訊。 |
繼續 / 逐步執行 / 逐步執行進入 / 逐步執行跳出 F5 / F10 / F11 / ⇧F11 (Windows、Linux Shift+F11) |
當在岔斷狀態 (例如,停在中斷點時) 進行變更時,這些命令將會自動套用這些變更。 |
後續步驟
繼續閱讀以瞭解
- 偵錯 - 瞭解如何在 VS Code 中搭配您的專案使用任何語言的偵錯工具。