次の方法で共有


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

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

Visual Studio Code デバッガーに関する知識があるとします。

  • VS Code デバッガーの一般的な概要については、「Visual Studio Code でのデバッグ」を参照してください。

  • PowerShell スクリプト ファイルとモジュールのデバッグの例については、「のリモート編集とデバッグに Visual Studio Code を使用する」を参照してください。

このガイドでは、ポータブル モジュールの作成に関する ガイドの手順を読み、それに従っていることを前提としています。

ビルド タスクの作成

デバッグ セッションを起動する前に、プロジェクトを自動的にビルドします。 再構築により、最新バージョンのコードを確実にデバッグできます。

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

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

    既定のビルド タスクの構成 を実行する

  2. [ 構成するタスクの選択] ダイアログで、[テンプレート から tasks.json ファイル作成] を選択します。

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

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

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

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

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

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

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

    {
        "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. C# for Visual Studio Code 拡張機能をインストールする

  2. [デバッグ] ウィンドウで、デバッグ構成を追加します

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

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

  5. 既定のデバッグ構成を作成するには、[Launch .NET Core Console App ] を選択します。

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

  6. nameprogramargs、および console フィールドを次のように編集します。

     {
         "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. namePowerShell cmdlets: powershell にすべきです

  2. typeclr にすべきです

  3. programpowershell にすべきです

    次のようになります。

     {
         "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"
     }
    

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

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

  • デバッグするコマンドレットのソース コードにブレークポイントを配置します。

    ブレークポイントは、余白の に赤い点として表示されます。

  • デバッグ ビューの構成ドロップダウン メニューで、関連する PowerShell コマンドレット 構成が選択されていることを確認します。

    起動構成 を選択します

  • F5 を押してください、または [デバッグの開始] ボタンをクリックしてください

  • ターミナル ウィンドウに切り替えて、コマンドレットを呼び出します。

    コマンドレット を呼び出す

  • ブレークポイントで実行が停止します。

    ブレークポイント で実行が停止する

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

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