デバッグ
Visual Studio Code で C# アプリケーションをデバッグするには、Microsoft C# 拡張機能を使用します。
実行とデバッグ
C# 拡張機能は、C# Dev Kit とともに、C# アプリケーションを実行およびデバッグするための複数の方法を提供します。
C# Dev Kit なしで実行およびデバッグするには、ドキュメントについて Microsoft C# 拡張機能の GitHub ページを参照してください。
F5 でデバッグ
C# Dev Kit 拡張機能がインストールされていて、デバッグ ビューで選択できるデバッグ構成がない場合、.cs
ファイルを開いてから F5 を押すことでプロジェクトのデバッグを開始できます。デバッガーは自動的にプロジェクトを見つけてデバッグを開始します。複数のプロジェクトがある場合は、どのプロジェクトのデバッグを開始するかを尋ねられます。
VS Code のサイドバーにある実行とデバッグビューからデバッグ セッションを開始することもできます。詳細は VS Code でのデバッグを参照してください。
ソリューション エクスプローラーでデバッグ
C# Dev Kit 拡張機能をインストールすると、ソリューション エクスプローラーでプロジェクトを右クリックしたときにデバッグコンテキスト メニューが表示されます。
3 つのオプションがあります
- 新しいインスタンスを開始 - デバッガーをアタッチしてプロジェクトを開始します。
- デバッグなしで開始 - デバッガーをアタッチせずにプロジェクトを実行します。
- 新しいインスタンスにステップイン - デバッガーをアタッチしてプロジェクトを開始しますが、コードのエントリーポイントで停止します。
コマンド パレットでデバッグ
C# Dev Kit 拡張機能をインストールすると、コマンド パレット ⇧⌘P (Windows, Linux Ctrl+Shift+P) からデバッグ: デバッグの選択と開始コマンドを使用してデバッグを開始することもできます。
注意: これにより、起動構成エントリがデバッグのドロップダウン リストに追加されます。
動的 (インメモリ) 起動構成でデバッグ
C# Dev Kit 拡張機能をインストールすると、動的な起動構成を作成できます。作成方法は、プロジェクトに既存の launch.json
ファイルがあるかどうかによって異なります。
既存の launch.json
既存の launch.json
がある場合、デバッグ ビューに移動し、ドロップダウンを選択して C#
オプションを選択します。これにより、ドロップダウン リストに追加できる起動ターゲットの選択肢が表示されます。選択後、F5 を押すか、新しく生成された構成でデバッグの開始を選択します。
launch.json がない場合
プロジェクトに launch.json
がない場合、デバッグ ビューのすべての自動デバッグ構成を表示でこれらの動的構成を追加してアクセスできます。
動的 (インメモリ) 起動構成の削除
コマンド パレット ⇧⌘P (Windows, Linux Ctrl+Shift+P) を開き、デバッグ: デバッグの選択と開始コマンドを使用して生成された構成を削除できます。
ドロップダウンには、既存のすべてのデバッグ構成が一覧表示されます。動的構成の上にマウスカーソルを合わせると、右側にクリック可能なごみ箱アイコンが表示されます。そのアイコンを選択して動的構成を削除できます。
エディターのデバッグ/実行ボタンでデバッグ
.cs
ファイルがエディターで開かれている場合、エディター ウィンドウの右上隅にあるボタンから実行およびデバッグ オプションにアクセスできます。これらのアクションは、現在のファイルを使用してプロジェクト システムにクエリを実行し、起動する関連プロジェクトを決定します。
2 つのオプションがあります
-
このファイルに関連付けられたプロジェクトを実行
: デバッグ アダプターでnoDebug: true
を指定してプログラムを起動します。 -
このファイルに関連付けられたプロジェクトをデバッグ
: デバッガーの下でプログラムを起動します。
launch.json でデバッグ
C# Dev Kit を使用している場合、このオプションの使用は推奨しません。ただし、デバッグ構成を直接変更する必要がある場合は、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 のデバッグ コンソール。このモードでは、デバッガーとターゲット プログラムの両方からのメッセージを 1 か所で確認できます。詳細については、完全なドキュメントを参照してください。integratedTerminal
- VS Code の統合ターミナル。externalTerminal
- ユーザー設定で構成できる外部ターミナル。
csharp.debug.sourceFileMap
- ビルド時のパスをローカルのソースの場所にマッピングします。ビルド時のパスのすべてのインスタンスは、ローカルのソース パスに置き換えられます。
例
{\"<build-path>\":\"<local-source-path>\"}
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
- モジュール フィルターが動作する 2 つの基本的な動作モードのどちらかを制御します。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 | スレッド ID | 20668 |
$PID | プロセス ID | 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# デバッガーは、例外がスローまたはキャッチされたときにデバッガーが停止するタイミングの構成オプションをサポートしています。これは、実行ビューのブレークポイントセクションにある 2 つの異なるエントリを通じて行われます
注意: ブレークポイントセクションには、フォルダーが C# デバッガーで初めてデバッグされるまで、これらのエントリが表示されません。
すべての例外をチェックすると、例外がスローされたときにデバッガーが停止するように構成されます。マイ コードのみが有効な場合 (既定で有効)、ライブラリ コード内で例外が内部的にスローされてキャッチされてもデバッガーは中断しません。ただし、例外がライブラリ コードでスローされ、ユーザー コードに返された場合、デバッガーは中断します。
ユーザー未処理の例外をチェックすると、ユーザー コードでスローされた後、またはユーザー コードを通過した後に非ユーザー コードで例外がキャッチされたときに、デバッガーが停止するように構成されます。ユーザー未処理になる例外は、必ずしもデバッグ中のプロセスのバグではありません。ユーザー コードが API を実装しており、例外を発生させることが期待されている可能性があります。多くの場合、実際には問題があるため、既定では、例外がユーザー未処理になるとデバッガーは停止します。
例外の条件
両方のチェックボックスは、選択した例外タイプでのみ中断する条件をサポートしています。条件を編集するには、鉛筆アイコン (上の画像を参照) を選択するか、エントリを右クリックして条件の編集を呼び出します。条件は、中断する例外タイプのコンマ区切りのリスト、またはリストが '!' で始まる場合は無視する例外タイプのリストです。
条件の例
条件値の例 | 結果 |
---|---|
System.NullReferenceException | これは null 参照例外でのみ中断します。 |
System.NullReferenceException, System.InvalidOperationException | これは null 参照例外と無効な操作例外の両方で中断します。 |
!System.Threading.Tasks.TaskCanceledException | これはタスク キャンセル例外を除くすべての例外で中断します。 |
!System.Threading.Tasks.TaskCanceledException, System.NotImplementedException | これはタスク キャンセルと未実装の例外を除くすべての例外で中断します。 |
式評価
デバッガーでは、ウォッチ ウィンドウとデバッグ コンソールで式を評価することもできます。
ホット リロード
C# Dev Kit 拡張機能をインストールすると、デバッガーはデバッグ中に C# コードの変更を適用できます。
ホット リロードを有効にするには、csharp.experimental.debug.hotReload
を true に設定する必要があります。詳細についてはユーザー設定を参照してください。ホット リロード セッションは、ターゲットのデバッガー エンジンがコード変更の適用をサポートしている場合にのみ開始されます。
サポートされているプロジェクトとシナリオ
C# Dev Kit は、「クラシック」なホット リロード体験、つまりエディット コンティニュをサポートしています。ブレークポイントで停止しているか、プログラムが実行中かに関わらず、デバッグ中にコードの変更を適用できます。
2023 年 11 月現在、ASP.NET Core アプリケーションが変更後にブラウザーを自動的に更新できるようにする MetadataUpdateHandler
などの一部の機能はまだ利用できません。デバッグなしでのコード変更の適用もサポートされていません。
ランタイムは .NET 8 で Linux/macOS でのデバッグ中の変更適用をサポートするようになったため、これらのオペレーティング システムで実行されている .NET アプリのコード変更を適用するには、.NET 8+ のランタイム バージョンが必要です。
アプリケーションの種類 | C# Dev Kit でホット リロードをサポート | .NET 8+ が必要 |
---|---|---|
コンソール | ✅ | Linux/macOS のみ |
テスト プロジェクト | ✅ | Linux/macOS のみ |
クラス ライブラリ プロジェクト | ✅ | Linux/macOS のみ |
ASP.NET Core | ⚠️* 現在 .cs ファイルの変更のみをサポート |
Linux/macOS のみ |
MAUI | ❌* 近日公開予定 | -- |
Unity | ❌ | -- |
現在 C# Dev Kit でサポートされているプロジェクトの詳細については、サポートされているプロジェクトを参照してください。その他のサポートされていないシナリオのトラブルシューティングについては、C# Dev Kit FAQ も参照してください。
コードの変更を適用する方法
ホット リロード セッションが開始され、新しい変更が行われると、次のいずれかのアクションでこれらの変更をアプリケーションに適用できます
アクション | 説明 |
---|---|
ホット リロード Ctrl+Shift+Enter |
コードの変更を適用します。デバッグ ツールバーから利用できます。 |
ファイルの保存 ⌘S (Windows, Linux Ctrl+S) |
csharp.debug.hotReloadOnSave が true に設定されている場合、コード変更の適用を開始します。詳細については、ユーザー設定を参照してください。 |
続行 / ステップ オーバー / ステップ イン / ステップ アウト F5 / F10 / F11 / ⇧F11 (Windows, Linux Shift+F11) |
ブレーク状態で変更が行われた場合 (たとえば、ブレークポイントで停止中)、これらのコマンドは自動的に変更を適用します。 |
次のステップ
さらに読む
- デバッグ - あらゆる言語のプロジェクトで VS Code のデバッガーを使用する方法をご覧ください。