Visual Studio Code を使用したコンパイル済みコマンドレットのデバッグ

このガイドでは、Visual Studio Code (VS Code) と C# 拡張機能を使用して、コンパイル済み PowerShell モジュールの C# ソース コードを対話形式でデバッグする方法について説明します。

Visual Studio Code デバッガーについてのある程度の知識があることを前提としています。

このガイドでは、移植可能なモジュールの作成に関するガイドに記載されている手順を読んで従っていることを前提としています。

ビルド タスクの作成

デバッグ セッションを開始する前に、プロジェクトを自動的にビルドします。 リビルドすることで、最新バージョンのコードを確実にデバッグできます。

ビルド タスクを構成します。

  1. コマンド パレットで、 [Configure Default Build Task]\(既定のビルド タスクを構成する\) コマンドを実行します。

    [Configure Default Build Task]\(既定のビルド タスクを構成する\) を実行する

  2. [Create tasks.json file from template]\(構成するタスクを選択\) ダイアログで、 [テンプレートから tasks.json を生成] を選択します。

  3. [Select a Task Template]\(タスク テンプレートを選択\) ダイアログで、 [.NET Core] を選択します。

まだ存在しない場合は、新しい tasks.json ファイルが作成されます。

ビルド タスクをテストするには:

  1. コマンド パレットで、 [ビルド タスクの実行] コマンドを実行します。

  2. [Select the build task to run]\(実行するビルド タスクを選択\) ダイアログで、 [ビルド] を選択します。

ロックされている DLL ファイルに関する情報

既定では、ビルドが成功した場合は、ターミナル ペインに出力は表示されません。 "プロジェクトファイルが存在しません" というテキストが含まれる出力が表示される場合は、tasks.json ファイルを編集する必要があります。 C# プロジェクトへの明示的なパスの "${workspaceFolder}/myModule" という表記を含めます。 この例で、myModule はプロジェクト フォルダーの名前です。 次のように、args リストの build エントリの後にこのエントリを追加する必要があります。

    {
        "label": "build",
        "command": "dotnet",
        "type": "shell",
        "args": [
            "build",
            "${workspaceFolder}/myModule",
            // Ask dotnet build to generate full paths for file names.
            "/property:GenerateFullPaths=true",
            // Do not generate summary otherwise it leads to duplicate errors in Problems panel
            "/consoleloggerparameters:NoSummary",
        ],
        "group": "build",
        "presentation": {
            "reveal": "silent"
        },
        "problemMatcher": "$msCompile"
    }

デバッグ時には、モジュールの DLL が VS Code ターミナルの PowerShell セッションにインポートされます。 DLL はロックされます。 ターミナル セッションを閉じずにビルド タスクを実行すると、次のメッセージが表示されます。

Could not copy "obj\Debug\netstandard2.0\myModule.dll" to "bin\Debug\netstandard2.0\myModule.dll"`.

リビルドの前に、ターミナル セッションを閉じる必要があります。

デバッガーの設定

PowerShell コマンドレットをデバッグするには、カスタム起動構成を設定する必要があります。 この構成は、次のために使用されます。

  • ソース コードをビルドします
  • モジュールを読み込んで PowerShell を開始します
  • ターミナル ペインで PowerShell を開いたままにします

ターミナル セッションでコマンドレットを呼び出すと、ソース コードに設定されているブレークポイントでデバッガーが停止します。

PowerShell 用の launch.json の構成

  1. Visual Studio Code 用 C# 拡張機能をインストールします

  2. [デバッグ] ペインで、デバッグ構成を追加します

  3. [Select environment] ダイアログで、[.NET Core] を選択します

  4. launch.json がエディターで開かれます。 configurations 配列の内側にカーソルを置くと、configuration ピッカーが表示されます。 このリストが表示されない場合は、 [構成の追加] を選択します。

  5. 既定のデバッグ構成を作成するには、 [Launch .NET Core Console App]\(.NET Core コンソールアプリの起動\) を選択します。

    .NET Core コンソールアプリの起動

  6. nameprogramargsconsole の各フィールドを次のように編集します。

     {
         "name": "PowerShell cmdlets: pwsh",
         "type": "coreclr",
         "request": "launch",
         "preLaunchTask": "build",
         "program": "pwsh",
         "args": [
             "-NoExit",
             "-NoProfile",
             "-Command",
             "Import-Module ${workspaceFolder}/myModule/bin/Debug/netstandard2.0/myModule.dll",
         ],
         "cwd": "${workspaceFolder}",
         "stopAtEntry": false,
         "console": "integratedTerminal"
     }
    

program フィールドは、デバッグ対象のコマンドレットを実行できるように pwsh を起動するために使用されます。 引数 -NoExit を指定すると、モジュールがインポートされても PowerShell セッションはすぐに終了しません。 Import-Module 引数のパスは、移植可能なモジュールの作成に関するガイドに従っている場合の既定のビルド出力パスです。 モジュール マニフェスト (.psd1 ファイル) を作成した場合は、代わりにそのパスを使用する必要があります。 パス区切り記号 / は、Windows、Linux、macOS で動作します。 デバッグ対象の PowerShell コマンドを実行するには、統合ターミナルを使用する必要があります。

注意

デバッガーがどのブレークポイントでも停止しない場合は、Visual Studio Code のデバッグ コンソールで次のような行を探します。

Loaded '/path/to/myModule.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.

これがある場合は、起動構成に "justMyCode": false を追加します ("console": "integratedTerminal" と同じレベル)。

Windows PowerShell 用の launch.json の構成

この起動構成は、Windows PowerShell でコマンドレットをテストするために機能します (powershell.exe)。 次のように変更して、2 番目の起動構成を作成します。

  1. name は、PowerShell cmdlets: powershell である必要があります。

  2. type は、clr である必要があります。

  3. program は、powershell である必要があります。

    次のようになります。

     {
         "name": "PowerShell cmdlets: powershell",
         "type": "clr",
         "request": "launch",
         "preLaunchTask": "build",
         "program": "powershell",
         "args": [
             "-NoExit",
             "-NoProfile",
             "-Command",
             "Import-Module ${workspaceFolder}/myModule/bin/Debug/netstandard2.0/myModule.dll",
         ],
         "cwd": "${workspaceFolder}",
         "stopAtEntry": false,
         "console": "integratedTerminal"
     }
    

デバッグ セッションの起動

これで、デバッグを始める準備がすべて整いました。

ソース コードをステップ実行したり、変数を調べたり、呼び出し履歴を調べたりできます。

デバッグを終了するには、デバッグ ツール バーの [停止] をクリックするか、Shift+F5 キーを押します。 デバッグに使用されたシェルが終了し、コンパイルされた DLL ファイルに対するロックが解除されます。