チュートリアル: Visual Studio Code を使用して .NET コンソール アプリケーションをデバッグする

このチュートリアルでは、.NET アプリを操作するために Visual Studio Code で使用できるデバッグ ツールについて説明します。

必須コンポーネント

デバッグ ビルド構成の使用

"デバッグ" と "リリース" は、.NET の組み込みビルド構成です。 デバッグ用のデバッグ ビルド構成と、最終リリース配布用のリリース構成を使用します。

デバッグ構成では、プログラムのコンパイルにシンボリック デバッグ情報が完全に含まれ、最適化は行われません。 ソース コードと生成された命令の関係は非常に複雑であり、最適化を行うとデバッグが困難になるためです。 プログラムのリリース構成は、シンボリック デバッグ情報を含まず、完全に最適化されます。

既定では、Visual Studio Code の起動設定ではデバッグ ビルド構成が使用されるため、デバッグの前に変更を加える必要はありません。

  1. Visual Studio Code を開始します。

  2. Visual Studio Code を使用して .NET コンソール アプリケーションを作成する」で作成したプロジェクトのフォルダーを開きます。

ブレークポイントの設定

"ブレークポイント" によって、ブレークポイントを含む行が実行される前に、アプリケーションの実行が一時的に中断されます。

  1. Program.cs ファイルを開きます。

  2. コード ウィンドウの左側の余白をクリックして、名前、日付、時刻を表示する行に "ブレークポイント" を設定します。 左余白は、行番号の左側にあります。 ブレークポイントを設定するその他の方法としては、コード行を選択した状態で F9 キーを押すか、メニューから [実行]>[ブレークポイントの設定/解除] を選択します。

    Visual Studio Code では、左余白に赤い点を表示することで、ブレークポイントが設定されている行が示されます。

    Breakpoint set

ターミナル入力用の設定

ブレークポイントは、Console.ReadLine メソッドの呼び出しの後に配置されます。 デバッグ コンソール は、実行中のプログラムのターミナル入力を受け入れません。 デバッグ中にターミナル入力を処理するには、統合ターミナル (Visual Studio Code ウィンドウの 1 つ) または外部ターミナルを使用できます。 このチュートリアルでは、統合ターミナルを使用します。

  1. .vscode/launch.json を開きます。

  2. console 設定を internalConsole から integratedTerminal に変更します。

    "console": "integratedTerminal",
    
  3. 変更内容を保存します。

[デバッグ開始]

  1. 左側のメニューにある [デバッグ] アイコンを選択して、デバッグ ビューを開きます。

    Open the Debug tab in Visual Studio Code

  2. ペインの上部にある [.NET Core Launch (console)](.NET Core の起動 (コンソール)) の横の緑色の矢印を選択します。 デバッグ モードでプログラムを起動するその他の方法は、F5 キーを押すか、メニューから [実行]>[デバッグの開始] を選択することです。

    Start debugging

  3. [ターミナル] タブを選択すると、"What is your name?" (あなたのお名前は?) というプロンプトが表示されます。これは応答を待機する前にプログラムによって表示されます。

    Select the Terminal tab

  4. 名前のプロンプトに応答する文字列を [ターミナル] ウィンドウに入力し、Enter キーを押します。

    プログラムがブレークポイントに到達すると、プログラム実行は停止します。Console.WriteLine メソッドが実行される前にも停止します。 [変数] ウィンドウの [ローカル] セクションには、現在実行しているメソッドで定義されている変数の値が表示されます。

    Breakpoint hit, showing Locals

デバッグ コンソールを使用する

[デバッグ コンソール] ウィンドウでは、デバッグ中のアプリケーションと対話できます。 変数の値を変更して、プログラムにどのような影響があるかを確認できます。

  1. [デバッグ コンソール] タブを選択します。

  2. [デバッグ コンソール] ウィンドウの下部にあるプロンプトで name = "Gracie" を入力し、Enter キーを押します。

    Change variable values

  3. [デバッグ コンソール] ウィンドウの下部に currentDate = DateTime.Parse("2019-11-16T17:25:00Z").ToUniversalTime() を入力し、Enter キーを押します。

    [変数] ウィンドウには、name 変数と currentDate 変数の新しい値が表示されます。

  4. ツール バーの [続行] ボタンを選択して、プログラムの実行を続けます。 続行するもう 1 つの方法は、F5 キーを押すことです。

    Continue debugging

  5. もう一度 [ターミナル] タブを選択します。

    コンソール ウィンドウに表示される値は、 [デバッグ コンソール] で行った変更に対応しています。

    Terminal showing the entered values

  6. 任意のキーを押してアプリケーションを終了し、デバッグを停止します。

条件付きブレークポイントの設定

プログラムによって、ユーザーが入力した文字列が表示されます。 ユーザーが何も入力しないとどうなるでしょうか。 これは、"条件付きブレークポイント" と呼ばれる便利なデバッグ機能を使用してテストできます。

  1. ブレークポイントを表す赤い点を右クリック (macOS では Ctrl キーを押しながらクリック) します。 コンテキスト メニューで [ブレークポイントの編集] を選択して、条件式を入力するためのダイアログボックスを開きます。

    Breakpoint context menu

  2. ドロップダウン リストで [Expression] を選択し、次の条件式を入力して、Enter キーを押します。

    String.IsNullOrEmpty(name)
    

    Enter a conditional expression

    ブレークポイントにヒットするたびに、デバッガーは String.IsNullOrEmpty(name) メソッドを呼び出し、メソッド呼び出しが true を返す場合にのみ、この行で中断します。

    条件式の代わりに、"ヒット カウント" を指定できます。この場合、ステートメントが指定された回数実行される前にプログラムの実行が中断されます。 もう 1 つのオプションは、"フィルター条件" を指定することです。これにより、スレッド識別子、プロセス名、またはスレッド名などの属性に基づいてプログラムの実行が中断されます。

  3. F5 を押して、デバッグとともにプログラムを開始します。

  4. [ターミナル] タブで、自分の名前を入力するように求められたら、Enter キーを押します。

    指定した条件 (namenull または String.Empty のどちらか) が満たされたため、ブレークポイントに到達すると、Console.WriteLine メソッドが実行される前に、プログラムの実行が停止します。

    [変数] ウィンドウには、name 変数の値が "" または String.Empty であることが表示されます。

  5. デバッグ コンソール プロンプトで次のステートメントを入力し、Enter キーを押して、値が空の文字列であることを確認します。 結果は true になります。

    name == String.Empty
    
  6. ツール バーの [続行] を選んで、プログラムの実行を続けます。

  7. [ターミナル] タブを選択し、任意のキーを押してプログラムを終了し、デバッグを停止します。

  8. コード ウィンドウの左余白のドットをクリックして、ブレークポイントをクリアします。 ブレークポイントをクリアするその他の方法としては、コード行を選択した状態で F9 キーを押すか、メニューから [実行] > [ブレークポイントの設定/解除] を選択します。

  9. ブレークポイントの条件が失われることを示す警告が表示された場合は、 [ブレークポイントの削除] を選択します。

プログラムのステップ実行

Visual Studio Code では、1 行ずつプログラムをステップ実行して、実行を監視することもできます。 通常は、ブレークポイントを設定して、プログラム コードのごく一部を通じてプログラム フローに従います。 このプログラムは小さいため、次の手順に従ってプログラム全体をステップ実行できます。

  1. Main メソッドの左中かっこにブレークポイントを設定します。

  2. F5 キーを押してデバッグを開始します。

    Visual Studio Code では、ブレークポイント行が強調表示されます。

    この時点で、 [変数] ウィンドウに args 配列が空であることが示され、namecurrentDate には既定値が設定されています。

  3. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    Step-Into button

    Visual Studio Code では次の行が強調表示されます。

  4. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    Visual Studio Code では、名前プロンプトの Console.WriteLine が実行され、次に実行される行が強調表示されます。 次の行は、nameConsole.ReadLine です。 [変数] ウィンドウは変更されず、[ターミナル] タブに "What is your name?" (あなたのお名前は?) というプロンプトが表示されます。

  5. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    Visual Studio によって、name 変数代入が強調表示されます。 [変数] ウィンドウに、name がまだ null であることが示されます。

  6. [ターミナル] タブに文字列を入力し、Enter キーを押して、このプロンプトに応答します。

    [ターミナル] タブには、入力時に入力した文字列が表示されない場合がありますが、Console.ReadLine メソッドによって入力がキャプチャされます。

  7. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    Visual Studio Code によって、currentDate 変数代入が強調表示されます。 [変数] ウィンドウには、Console.ReadLine メソッドの呼び出しによって返された値が表示されます。 [ターミナル] タブには、プロンプトで入力した文字列が表示されます。

  8. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    [変数] ウィンドウには、DateTime.Now プロパティから代入された後の currentDate 変数の値が表示されます。

  9. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    Visual Studio Code によって Console.WriteLine(String, Object, Object) メソッドが呼び出されます。 コンソール ウィンドウには書式設定された文字列が表示されます。

  10. [実行]>[ステップ アウト] の順に選択するか、Shift+F11 キーを押します。

    Step-Out button

  11. [ターミナル] タブを選択します。

    ターミナルに、"Press any key to exit..." (終了するには何かキーを押してください...) が表示されます。

  12. 任意のキーを押してプログラムを終了します。

リリース ビルド構成を使用する

アプリケーションのデバッグ バージョンのテストが終了したら、リリース バージョンもコンパイルしてテストする必要があります。 リリース バージョンには、アプリケーションの動作に影響を与える可能性があるコンパイラの最適化が組み込まれています。 たとえば、パフォーマンスを向上させるように設計されたコンパイラの最適化では、マルチスレッド アプリケーションで競合状態が生じる場合があります。

コンソール アプリケーションのリリース バージョンをビルドしてテストするには、ターミナルを開き、次のコマンドを実行します。

dotnet run --configuration Release

その他の技術情報

次の手順

このチュートリアルでは、Visual Studio Code のデバッグ ツールを使用しました。 次のチュートリアルでは、アプリの展開可能なバージョンを発行します。

このチュートリアルでは、.NET アプリを操作するために Visual Studio Code で使用できるデバッグ ツールについて説明します。

必須コンポーネント

デバッグ ビルド構成の使用

"デバッグ" と "リリース" は、.NET Core の組み込みビルド構成です。 デバッグ用のデバッグ ビルド構成と、最終リリース配布用のリリース構成を使用します。

デバッグ構成では、プログラムのコンパイルにシンボリック デバッグ情報が完全に含まれ、最適化は行われません。 ソース コードと生成された命令の関係は非常に複雑であり、最適化を行うとデバッグが困難になるためです。 プログラムのリリース構成は、シンボリック デバッグ情報を含まず、完全に最適化されます。

既定では、Visual Studio Code の起動設定ではデバッグ ビルド構成が使用されるため、デバッグの前に変更を加える必要はありません。

  1. Visual Studio Code を開始します。

  2. Visual Studio Code を使用して .NET コンソール アプリケーションを作成する」で作成したプロジェクトのフォルダーを開きます。

ブレークポイントの設定

"ブレークポイント" によって、ブレークポイントを含む行が実行される前に、アプリケーションの実行が一時的に中断されます。

  1. Program.cs ファイルを開きます。

  2. コード ウィンドウの左側の余白をクリックして、名前、日付、時刻を表示する行に "ブレークポイント" を設定します。 左余白は、行番号の左側にあります。 ブレークポイントを設定するその他の方法としては、コード行を選択した状態で F9 キーを押すか、メニューから [実行]>[ブレークポイントの設定/解除] を選択します。

    Visual Studio Code では、左余白に赤い点を表示することで、ブレークポイントが設定されている行が示されます。

    Breakpoint set

ターミナル入力用の設定

ブレークポイントは、Console.ReadLine メソッドの呼び出しの後に配置されます。 デバッグ コンソール は、実行中のプログラムのターミナル入力を受け入れません。 デバッグ中にターミナル入力を処理するには、統合ターミナル (Visual Studio Code ウィンドウの 1 つ) または外部ターミナルを使用できます。 このチュートリアルでは、統合ターミナルを使用します。

  1. .vscode/launch.json を開きます。

  2. console 設定を internalConsole から integratedTerminal に変更します。

    "console": "integratedTerminal",
    
  3. 変更内容を保存します。

[デバッグ開始]

  1. 左側のメニューにある [デバッグ] アイコンを選択して、デバッグ ビューを開きます。

    Open the Debug tab in Visual Studio Code

  2. ペインの上部にある [.NET Core Launch (console)](.NET Core の起動 (コンソール)) の横の緑色の矢印を選択します。 デバッグ モードでプログラムを起動するその他の方法は、F5 キーを押すか、メニューから [実行]>[デバッグの開始] を選択することです。

    Start debugging

  3. [ターミナル] タブを選択すると、"What is your name?" (あなたのお名前は?) というプロンプトが表示されます。これは応答を待機する前にプログラムによって表示されます。

    Select the Terminal tab

  4. 名前のプロンプトに応答する文字列を [ターミナル] ウィンドウに入力し、Enter キーを押します。

    プログラムがブレークポイントに到達すると、プログラム実行は停止します。Console.WriteLine メソッドが実行される前にも停止します。 [変数] ウィンドウの [ローカル] セクションには、現在実行しているメソッドで定義されている変数の値が表示されます。

    Breakpoint hit, showing Locals

デバッグ コンソールを使用する

[デバッグ コンソール] ウィンドウでは、デバッグ中のアプリケーションと対話できます。 変数の値を変更して、プログラムにどのような影響があるかを確認できます。

  1. [デバッグ コンソール] タブを選択します。

  2. [デバッグ コンソール] ウィンドウの下部にあるプロンプトで name = "Gracie" を入力し、Enter キーを押します。

    Change variable values

  3. [デバッグ コンソール] ウィンドウの下部に currentDate = DateTime.Parse("2019-11-16T17:25:00Z").ToUniversalTime() を入力し、Enter キーを押します。

    [変数] ウィンドウには、name 変数と currentDate 変数の新しい値が表示されます。

  4. ツール バーの [続行] ボタンを選択して、プログラムの実行を続けます。 続行するもう 1 つの方法は、F5 キーを押すことです。

    Continue debugging

  5. もう一度 [ターミナル] タブを選択します。

    コンソール ウィンドウに表示される値は、 [デバッグ コンソール] で行った変更に対応しています。

    Terminal showing the entered values

  6. 任意のキーを押してアプリケーションを終了し、デバッグを停止します。

条件付きブレークポイントの設定

プログラムによって、ユーザーが入力した文字列が表示されます。 ユーザーが何も入力しないとどうなるでしょうか。 これは、"条件付きブレークポイント" と呼ばれる便利なデバッグ機能を使用してテストできます。

  1. ブレークポイントを表す赤い点を右クリック (macOS では Ctrl キーを押しながらクリック) します。 コンテキスト メニューで [ブレークポイントの編集] を選択して、条件式を入力するためのダイアログボックスを開きます。

    Breakpoint context menu

  2. ドロップダウン リストで [Expression] を選択し、次の条件式を入力して、Enter キーを押します。

    String.IsNullOrEmpty(name)
    

    Enter a conditional expression

    ブレークポイントにヒットするたびに、デバッガーは String.IsNullOrEmpty(name) メソッドを呼び出し、メソッド呼び出しが true を返す場合にのみ、この行で中断します。

    条件式の代わりに、"ヒット カウント" を指定できます。この場合、ステートメントが指定された回数実行される前にプログラムの実行が中断されます。 もう 1 つのオプションは、"フィルター条件" を指定することです。これにより、スレッド識別子、プロセス名、またはスレッド名などの属性に基づいてプログラムの実行が中断されます。

  3. F5 を押して、デバッグとともにプログラムを開始します。

  4. [ターミナル] タブで、自分の名前を入力するように求められたら、Enter キーを押します。

    指定した条件 (namenull または String.Empty のどちらか) が満たされたため、ブレークポイントに到達すると、Console.WriteLine メソッドが実行される前に、プログラムの実行が停止します。

    [変数] ウィンドウには、name 変数の値が "" または String.Empty であることが表示されます。

  5. デバッグ コンソール プロンプトで次のステートメントを入力し、Enter キーを押して、値が空の文字列であることを確認します。 結果は true になります。

    name == String.Empty
    

    Debug Console returning a value of true after the statement is executed

  6. ツール バーの [続行] を選んで、プログラムの実行を続けます。

  7. [ターミナル] タブを選択し、任意のキーを押してプログラムを終了し、デバッグを停止します。

  8. コード ウィンドウの左余白のドットをクリックして、ブレークポイントをクリアします。 ブレークポイントをクリアするその他の方法としては、コード行を選択した状態で F9 キーを押すか、メニューから [実行] > [ブレークポイントの設定/解除] を選択します。

  9. ブレークポイントの条件が失われることを示す警告が表示された場合は、 [ブレークポイントの削除] を選択します。

プログラムのステップ実行

Visual Studio Code では、1 行ずつプログラムをステップ実行して、実行を監視することもできます。 通常は、ブレークポイントを設定して、プログラム コードのごく一部を通じてプログラム フローに従います。 このプログラムは小さいため、次の手順に従ってプログラム全体をステップ実行できます。

  1. Main メソッドの左中かっこにブレークポイントを設定します。

  2. F5 キーを押してデバッグを開始します。

    Visual Studio Code では、ブレークポイント行が強調表示されます。

    この時点で、 [変数] ウィンドウに args 配列が空であることが示され、namecurrentDate には既定値が設定されています。

  3. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    Step-Into button

    Visual Studio Code では次の行が強調表示されます。

  4. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    Visual Studio Code では、名前プロンプトの Console.WriteLine が実行され、次に実行される行が強調表示されます。 次の行は、nameConsole.ReadLine です。 [変数] ウィンドウは変更されず、[ターミナル] タブに "What is your name?" (あなたのお名前は?) というプロンプトが表示されます。

  5. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    Visual Studio によって、name 変数代入が強調表示されます。 [変数] ウィンドウに、name がまだ null であることが示されます。

  6. [ターミナル] タブに文字列を入力し、Enter キーを押して、このプロンプトに応答します。

    [ターミナル] タブには、入力時に入力した文字列が表示されない場合がありますが、Console.ReadLine メソッドによって入力がキャプチャされます。

  7. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    Visual Studio Code によって、currentDate 変数代入が強調表示されます。 [変数] ウィンドウには、Console.ReadLine メソッドの呼び出しによって返された値が表示されます。 [ターミナル] タブには、プロンプトで入力した文字列が表示されます。

  8. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    [変数] ウィンドウには、DateTime.Now プロパティから代入された後の currentDate 変数の値が表示されます。

  9. [実行]>[ステップ イン] を選択するか、F11 キーを押します。

    Visual Studio Code によって Console.WriteLine(String, Object, Object) メソッドが呼び出されます。 コンソール ウィンドウには書式設定された文字列が表示されます。

  10. [実行]>[ステップ アウト] の順に選択するか、Shift+F11 キーを押します。

    Step-Out button

  11. [ターミナル] タブを選択します。

    ターミナルに、"Press any key to exit..." (終了するには何かキーを押してください...) が表示されます。

  12. 任意のキーを押してプログラムを終了します。

リリース ビルド構成を使用する

アプリケーションのデバッグ バージョンのテストが終了したら、リリース バージョンもコンパイルしてテストする必要があります。 リリース バージョンには、アプリケーションの動作に影響を与える可能性があるコンパイラの最適化が組み込まれています。 たとえば、パフォーマンスを向上させるように設計されたコンパイラの最適化では、マルチスレッド アプリケーションで競合状態が生じる場合があります。

コンソール アプリケーションのリリース バージョンをビルドしてテストするには、ターミナルを開き、次のコマンドを実行します。

dotnet run --configuration Release

その他の技術情報

次の手順

このチュートリアルでは、Visual Studio Code のデバッグ ツールを使用しました。 次のチュートリアルでは、アプリの展開可能なバージョンを発行します。

このチュートリアルは、.NET 5 と .NET 6 でのみ使用できます。 ページ上部のこれらのオプションのいずれかを選択します。