VS Codeのエージェントモードを拡張するには、を試してください!

デバッグ

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 でのデバッグを参照してください。

Debugging using Run and Debug

ソリューション エクスプローラーでデバッグ

C# Dev Kit 拡張機能をインストールすると、ソリューション エクスプローラーでプロジェクトを右クリックしたときにデバッグコンテキスト メニューが表示されます。

3 つのオプションがあります

  • 新しいインスタンスを開始 - デバッガーをアタッチしてプロジェクトを開始します。
  • デバッグなしで開始 - デバッガーをアタッチせずにプロジェクトを実行します。
  • 新しいインスタンスにステップイン - デバッガーをアタッチしてプロジェクトを開始しますが、コードのエントリーポイントで停止します。

Debugging using Solution Explorer

コマンド パレットでデバッグ

C# Dev Kit 拡張機能をインストールすると、コマンド パレット ⇧⌘P (Windows, Linux Ctrl+Shift+P) からデバッグ: デバッグの選択と開始コマンドを使用してデバッグを開始することもできます。

注意: これにより、起動構成エントリがデバッグのドロップダウン リストに追加されます。

Debugging using Command Palette

動的 (インメモリ) 起動構成でデバッグ

C# Dev Kit 拡張機能をインストールすると、動的な起動構成を作成できます。作成方法は、プロジェクトに既存の launch.json ファイルがあるかどうかによって異なります。

既存の launch.json

既存の launch.json がある場合、デバッグ ビューに移動し、ドロップダウンを選択して C# オプションを選択します。これにより、ドロップダウン リストに追加できる起動ターゲットの選択肢が表示されます。選択後、F5 を押すか、新しく生成された構成でデバッグの開始を選択します。

Add Dynamic C# Configuration

launch.json がない場合

プロジェクトに launch.json がない場合、デバッグ ビューのすべての自動デバッグ構成を表示でこれらの動的構成を追加してアクセスできます。

Debug with Show all automatic debug configurations

動的 (インメモリ) 起動構成の削除

コマンド パレット ⇧⌘P (Windows, Linux Ctrl+Shift+P) を開き、デバッグ: デバッグの選択と開始コマンドを使用して生成された構成を削除できます。

ドロップダウンには、既存のすべてのデバッグ構成が一覧表示されます。動的構成の上にマウスカーソルを合わせると、右側にクリック可能なごみ箱アイコンが表示されます。そのアイコンを選択して動的構成を削除できます。

Remove dynamic configuration

エディターのデバッグ/実行ボタンでデバッグ

.cs ファイルがエディターで開かれている場合、エディター ウィンドウの右上隅にあるボタンから実行およびデバッグ オプションにアクセスできます。これらのアクションは、現在のファイルを使用してプロジェクト システムにクエリを実行し、起動する関連プロジェクトを決定します。

2 つのオプションがあります

  • このファイルに関連付けられたプロジェクトを実行: デバッグ アダプターで noDebug: true を指定してプログラムを起動します。
  • このファイルに関連付けられたプロジェクトをデバッグ: デバッガーの下でプログラムを起動します。

Editor Run or Debug

launch.json でデバッグ

C# Dev Kit を使用している場合、このオプションの使用は推奨しません。ただし、デバッグ構成を直接変更する必要がある場合は、C# デバッグ用の launch.json の構成を参照してください。

プロセスへのアタッチ

コマンド パレット ⇧⌘P (Windows, Linux Ctrl+Shift+P) を開き、デバッグ: .NET 5+ または .NET Core プロセスにアタッチコマンドを実行することで、C# プロセスにアタッチできます。

Attach to a C# process

構成オプション

デバッガーを構成するための多くのオプションと設定があります。launchSettings.json、VS Code のユーザー設定を使用してデバッグ オプションを変更したり、launch.json を直接変更したりできます。

launchSettings.json

Visual Studio の launchSettings.json がある場合、F5 から実行またはコマンド パレットから実行を使用して、プロファイルが一覧表示されるはずです。

Debugging using launchSettings.json

詳細については、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 の場合、エンジンログにはリクエストにかかった時間 (マイクロ秒) を示す adapterElapsedTimeengineElapsedTime プロパティが含まれます。このオプションの既定値は 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) がサポートされています。このプロパティは、modeloadAllButExcluded に設定されていない限り無視されます。
  • csharp.debug.symbolOptions.moduleFilter.includedModules - デバッガーがシンボルを読み込むべきモジュールの配列。ワイルドカード (例: MyCompany.*.dll) がサポートされています。このプロパティは、modeloadOnlyIncluded に設定されていない限り無視されます。
  • csharp.debug.symbolOptions.moduleFilter.includeSymbolsNextToModules - true の場合、includedModules 配列にないモジュールについても、デバッガーはモジュール自体と起動実行可能ファイルの隣をチェックしますが、シンボル検索リストのパスはチェックしません。このオプションの既定値は true です。このプロパティは、modeloadOnlyIncluded に設定されていない限り無視されます。
  • csharp.debug.allowFastEvaluate - true (既定の状態) の場合、デバッガーは単純なプロパティとメソッドの実行をシミュレートすることで、より高速な評価を試みます。
  • csharp.experimental.debug.hotReload - true の場合、ターゲット アプリケーションがホット リロードをサポートしていれば、デバッガーはデバッグ中に変更を適用できるようにします。
  • csharp.debug.hotReloadOnSave - true (既定の状態) の場合、ファイルが保存されたときにデバッガーは自動的にコードの変更を適用します。
  • csharp.debug.hotReloadVerbosity - C# ホット リロード出力ウィンドウのログの詳細度を制御します。minimal (既定)、detailed、または diagnostic から設定できます。ホット リロードが予期せず動作し始めた場合は、詳細度レベルを上げることをお勧めします。

ブレークポイント

C# デバッガーは、ソース行ブレークポイント、条件付きブレークポイント、ログポイントなど、さまざまなブレークポイントをサポートしています。

ブレークポイント - 条件付きブレークポイント

式評価の助けを借りて、デバッガーは条件付きブレークポイントもサポートします。式が true に評価されたときにブレークするようにブレークポイントを設定できます。

Conditional Breakpoints

ブレークポイント - 関数ブレークポイント

デバッガーは関数ブレークポイントもサポートしています。デバッグ ペインのブレークポイント セクションの + をクリックすることで、特定の関数でブレークするようにブレークポイントを設定できます。

Function Breakpoints

ブレークポイント - ログポイント

ログポイント (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

LogMessage Breakpoint

ブレークポイント - トリガーされるブレークポイント

トリガーされたブレークポイントとは、別のブレークポイントに到達すると自動的に有効になるブレークポイントです。これらは、特定の事前条件の後にのみ発生するコードの失敗ケースを診断する際に非常に役立ちます。

トリガーされたブレークポイントは、グリフマージンを右クリックし、トリガーされたブレークポイントの追加を選択し、その後、どの他のブレークポイントがこのブレークポイントを有効にするかを選択することで設定できます。

例外で停止

C# デバッガーは、例外がスローまたはキャッチされたときにデバッガーが停止するタイミングの構成オプションをサポートしています。これは、実行ビューのブレークポイントセクションにある 2 つの異なるエントリを通じて行われます

Exceptions settings in BREAKPOINTS Run View

注意: ブレークポイントセクションには、フォルダーが C# デバッガーで初めてデバッグされるまで、これらのエントリが表示されません。

すべての例外をチェックすると、例外がスローされたときにデバッガーが停止するように構成されます。マイ コードのみが有効な場合 (既定で有効)、ライブラリ コード内で例外が内部的にスローされてキャッチされてもデバッガーは中断しません。ただし、例外がライブラリ コードでスローされ、ユーザー コードに返された場合、デバッガーは中断します。

ユーザー未処理の例外をチェックすると、ユーザー コードでスローされた後、またはユーザー コードを通過した後に非ユーザー コードで例外がキャッチされたときに、デバッガーが停止するように構成されます。ユーザー未処理になる例外は、必ずしもデバッグ中のプロセスのバグではありません。ユーザー コードが API を実装しており、例外を発生させることが期待されている可能性があります。多くの場合、実際には問題があるため、既定では、例外がユーザー未処理になるとデバッガーは停止します。

例外の条件

両方のチェックボックスは、選択した例外タイプでのみ中断する条件をサポートしています。条件を編集するには、鉛筆アイコン (上の画像を参照) を選択するか、エントリを右クリックして条件の編集を呼び出します。条件は、中断する例外タイプのコンマ区切りのリスト、またはリストが '!' で始まる場合は無視する例外タイプのリストです。

条件の例

条件値の例 結果
System.NullReferenceException これは null 参照例外でのみ中断します。
System.NullReferenceException, System.InvalidOperationException これは null 参照例外と無効な操作例外の両方で中断します。
!System.Threading.Tasks.TaskCanceledException これはタスク キャンセル例外を除くすべての例外で中断します。
!System.Threading.Tasks.TaskCanceledException, System.NotImplementedException これはタスク キャンセルと未実装の例外を除くすべての例外で中断します。

式評価

デバッガーでは、ウォッチ ウィンドウとデバッグ コンソールで式を評価することもできます。

ホット リロード

C# Dev Kit 拡張機能をインストールすると、デバッガーはデバッグ中に C# コードの変更を適用できます。

Hot Reload displayed in the debugging toolbar

ホット リロードを有効にするには、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)
ブレーク状態で変更が行われた場合 (たとえば、ブレークポイントで停止中)、これらのコマンドは自動的に変更を適用します。

Hot Reload demonstrated on ASP.NET

次のステップ

さらに読む

  • デバッグ - あらゆる言語のプロジェクトで VS Code のデバッガーを使用する方法をご覧ください。