本指南介绍如何使用 Visual Studio Code(VS Code)和 C# 扩展以交互方式调试已编译的 PowerShell 模块的 C# 源代码。
假定你熟悉 Visual Studio Code 调试器。
有关 VS Code 调试器的一般介绍,请参阅 Visual Studio Code 中的调试。
有关调试 PowerShell 脚本文件和模块的示例,请参阅 使用 Visual Studio Code 进行远程编辑和调试。
本指南假定你已阅读并遵循 写入可移植模块 指南中的说明。
创建生成任务
在启动调试会话之前自动生成项目。 重新生成可确保调试最新版本的代码。
配置生成任务:
在 命令面板中,运行 配置默认生成任务 命令。
在选择要配置的任务对话框中,选择从模板创建 tasks.json 文件。
在“选择任务模板 对话框中,选择 .NET Core。
如果尚不存在文件,则会创建一个新的 tasks.json 文件。
测试生成任务:
在 命令面板中,运行 运行生成任务 命令。
在选择要运行的生成任务对话框中,选择生成。
有关锁定的 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
在“调试”窗格中,添加调试配置
在“
Select environment”对话框中,选择.NET Corelaunch.json文件在编辑器中打开。 将光标置于configurations数组中,可以看到configuration选取器。 如果未看到此列表,请选择 添加配置。若要创建默认调试配置,请选择 启动 .NET Core 控制台应用:
编辑
name、program、args和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,以便可以运行要调试的 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。
使用以下更改创建第二个启动配置:
应该将
name改为PowerShell cmdlets: powershell应该将
type改为clr应该将
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" }
启动调试会话
现在,一切准备就绪,可以开始调试。
在要调试的 cmdlet 的源代码中放置断点:
确保在调试视图的配置下拉菜单中选择了相关的 PowerShell cmdlet 配置 :
按 F5,或单击“开始调试 ”按钮
切换到终端窗格并调用 cmdlet:
执行在断点处停止:
可以单步执行源代码、检查变量并检查调用堆栈。
若要结束调试,请单击调试工具栏中的 “停止”或按 Shift+F5。 用于调试的 shell 程序退出后,释放了已编译的 DLL 文件上的锁。