在基于 ARM 的 SBC(如 Raspberry Pi)上运行的调试.NET应用带来了独特的挑战。 如果需要,可以在设备上安装Visual Studio Code和 .NET SDK 并在本地开发。 但是,设备的性能使得本地编码和调试并不理想。 此外,适用于 C# 的 Visual Studio Code 扩展与 32 位 ARM作系统不兼容。 因此,ARM 设备上Visual Studio Code中的 IntelliSense 和调试等功能仅在 64 位系统中受支持。
出于这些原因,强烈建议在开发计算机上开发应用,然后将应用部署到设备进行远程调试。 如果要在本地设备上开发和调试,则需要满足以下要求:
- 具有桌面环境的 64 位 OS,例如 Raspberry Pi OS(64 位)。
-
Visual Studio Code 和 C# 扩展。
- 禁用 硬件加速。
- .NET SDK 10 或更高版本。
- 使用 dotnet-install 脚本进行安装, 就像在依赖于框架的部署中一样。 请务必添加
DOTNET_ROOT环境变量并将 .dotnet 目录添加到$PATH。
- 使用 dotnet-install 脚本进行安装, 就像在依赖于框架的部署中一样。 请务必添加
本文的其余部分介绍如何从开发计算机远程调试单板计算机上的.NET应用。
使用 Visual Studio Code 进行跨平台调试
使用 Visual Studio Code 在单板计算机上调试 .NET 需要在 SBC 上以及项目的 launch.json 文件中进行配置步骤。
在 SBC 上启用 SSH
远程调试需要 SSH。 若要在 Raspberry Pi 上启用 SSH,请参阅 Raspberry Pi 文档中的“启用 SSH”。 确保已配置 无密码 SSH。
在 SBC 上安装 Visual Studio 远程调试器
在 SBC(在本地会话中或通过 SSH)的 Bash 控制台中,运行以下命令。 此命令在设备上下载并安装Visual Studio远程调试器:
curl -sSL https://aka.ms/getvsdbgsh | /bin/sh /dev/stdin -v latest -l ~/vsdbg
在 Visual Studio Code 中设置 launch.json
在开发计算机上,将启动配置添加到项目的 launch.json。 如果项目没有 launch.json 文件, 通过切换到 Run 选项卡添加一个,选择 在对话框中创建 launch.json 文件,然后选择 .NET 或 .NET Core。
launch.json 中的新配置应类似于以下配置之一:
"configurations": [
{
"name": ".NET Remote Launch - Self-contained",
"type": "coreclr",
"request": "launch",
"program": "~/sample/sample",
"args": [],
"cwd": "~/sample",
"stopAtEntry": false,
"console": "internalConsole",
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "ssh",
"pipeArgs": [
"pi@raspberrypi"
],
"debuggerPath": "~/vsdbg/vsdbg"
}
},
请注意以下内容:
-
program是由dotnet publish创建的可执行文件。 -
cwd是在设备上启动应用时要使用的工作目录。 -
pipeProgram是本地计算机上的 SSH 客户端的路径。 -
pipeArgs是要传递给 SSH 客户端的参数。 请务必指定密码参数,并确保用户pi按照格式<user>@<hostname>。
部署应用
请按照 将 .NET 应用部署到 ARM 单板计算机中的说明部署该应用程序。 确保部署路径与 cwd 配置中的参数中指定的路径相同。
启动调试器
在 Visual Studio Code 中,在 Run and Debug 选项卡上,选择添加到 launch.json 的配置,然后选择 Start Debug。 应用在设备上启动。 调试器可用于设置断点、检查局部变量等。
在 Windows 上通过 Visual Studio 进行调试
Visual Studio可以通过 SSH 调试远程设备上的.NET应用。 设备上不需要专用配置。 有关使用 Visual Studio 远程调试.NET的详细信息,请参阅 使用 SSH 在 Linux 上执行调试.NET。
请务必选择 dotnet 过程,如果您正在调试依赖于框架的部署。 否则,进程将命名为与应用的可执行程序相同。