使用 Visual Studio Code 调试编译的 cmdlet

本指南介绍如何使用 Visual Studio Code(VS Code)和 C# 扩展以交互方式调试已编译的 PowerShell 模块的 C# 源代码。

假定你熟悉 Visual Studio Code 调试器。

本指南假定你已阅读并遵循 写入可移植模块 指南中的说明。

创建生成任务

在启动调试会话之前自动生成项目。 重新生成可确保调试最新版本的代码。

配置生成任务:

  1. 命令面板中,运行 配置默认生成任务 命令。

    运行配置默认生成任务

  2. 选择要配置的任务对话框中,选择从模板创建 tasks.json 文件

  3. 在“选择任务模板 对话框中,选择 .NET Core

如果尚不存在文件,则会创建一个新的 tasks.json 文件。

测试生成任务:

  1. 命令面板中,运行 运行生成任务 命令。

  2. 选择要运行的生成任务对话框中,选择生成

有关锁定的 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 cmdlet,需要设置自定义启动配置。 此配置用于:

  • 生成源代码
  • 启动 PowerShell 并加载模块
  • 使 PowerShell 在终端窗格中保持打开状态

在终端会话中调用 cmdlet 时,调试器会在源代码中设置的任何断点处停止。

为 PowerShell 配置 launch.json

  1. 安装适用于 Visual Studio Code 的 C# 扩展

  2. 在“调试”窗格中,添加调试配置

  3. 在“Select environment”对话框中,选择 .NET Core

  4. launch.json 文件在编辑器中打开。 将光标置于 configurations 数组中,可以看到 configuration 选取器。 如果未看到此列表,请选择 添加配置

  5. 若要创建默认调试配置,请选择 启动 .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,以便可以运行要调试的 cmdlet。 -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)中测试 cmdlet。 使用以下更改创建第二个启动配置:

  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。 用于调试的 shell 程序退出后,释放了已编译的 DLL 文件上的锁。