在 ARM 单板计算机上调试 .NET 应用
调试在基于 ARM 的 SBC(如 Raspberry Pi)上运行的 .NET 应用带来了独特的挑战。 如果需要,可以在设备上安装 Visual Studio Code 和 .NET SDK,并在本地进行开发。 但是,设备的性能使得在本地进行编码和调试的效果不理想。 此外,适用于 C# 的 Visual Studio Code 扩展与 32 位 ARM 操作系统不兼容。 因此,仅 64 位系统支持 ARM 设备上的 Visual Studio Code 中的 IntelliSense 和调试等功能。
出于这些原因,强烈建议在开发计算机上开发应用,然后将应用部署到设备进行远程调试。 如果要在设备上进行本地开发和调试,需要满足以下条件:
- 具有桌面环境的 64 位 OS(如 Raspberry Pi OS [64 位])。
- Visual Studio Code(具有 C# 扩展)。
- .NET SDK 6.0 或更高版本。
- 使用 dotnet-install 脚本安装,操作类似于依赖于框架的部署。 请务必添加
DOTNET_ROOT
环境变量并将 .dotnet 目录添加到 $PATH
。
本文的其余部分介绍如何从开发计算机远程调试单板计算机上的 .NET 应用。
重要
截至本文撰写时,在 linux-arm
环境中远程调试 .NET 7 应用是不可靠的,并且可能导致进程过早退出。 我们正在调查此问题。 面向 linux-arm
的 .NET 6 应用和面向 linux-arm64
的 .NET 7 应用不受影响。
在 Visual Studio Code 的单板计算机上调试 .NET,需要在 SBC 上以及项目的 launch.json 文件中执行配置步骤。
远程调试需要 SSH。 若要在 Raspberry Pi 上启用 SSH,请参阅 Raspberry Pi 文档中的“启用 SSH”。 确保已配置无密码 SSH。
重要
此示例要求在设备上配置无密码 SSH,因为 OpenSSH 不支持在命令行上传递密码。 如果需要使用密码,请考虑将 Plink 工具替换为 ssh。
在 SBC 上安装 Visual Studio 远程调试器
在 SBC 上的 Bash 控制台中(在本地会话中或通过 SSH)运行以下命令。 此命令在设备上下载并安装 Visual Studio 远程调试器:
curl -sSL https://aka.ms/getvsdbgsh | /bin/sh /dev/stdin -v latest -l ~/vsdbg
在 Visual Studio Code 中安装 launch.json 文件
在开发计算机上,将启动配置添加到项目的 launch.js 文件中。 如果项目没有 launch.json 文件,请添加一个文件,方法是切换到“运行”选项卡,选择“创建 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 客户端的参数。 请确保指定 password 参数,以及格式为 <user>@<hostname>
的 pi
用户。
"configurations": [
{
"name": ".NET Remote Launch - Framework-dependent",
"type": "coreclr",
"request": "launch",
"program": "~/dotnet/dotnet",
"args": ["~/sample/sample.dll"],
"cwd": "~/sample",
"justMyCode": false,
"stopAtEntry": false,
"console": "internalConsole",
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "ssh",
"pipeArgs": [
"pi@raspberrypi"
],
"debuggerPath": "~/vsdbg/vsdbg"
}
},
请注意以下内容:
program
是设备上 .NET 运行时的路径。
args
是要在设备上调试的程序集的路径。
cwd
是在设备上启动应用时使用的工作目录。
justMyCode
设置为 false
以确保调试器在应用代码中的断点处中断。
pipeProgram
是本地计算机上 SSH 客户端的路径。
pipeArgs
是要传递到 SSH 客户端的参数。 请确保指定 password 参数,以及格式为 <user>@<hostname>
的 pi
用户。
按照将 .Net 应用部署到 ARM 单板计算机中的说明来部署应用。 确保部署路径与 launch.js 配置内 cwd
参数中指定的路径相同。
在 Visual Studio Code 中的“运行和调试”选项卡上,选择添加到 launch.json 的配置,然后选择“开始调试”。 应用在设备上启动。 调试器可用于设置断点、检查局部变量等。
在 Windows 上从 Visual Studio 进行调试
Visual Studio 可通过 SSH 在远程设备上调试 .NET 应用。 设备上无需进行专用配置。 若要详细了解如何使用 Visual Studio 远程调试 .NET,请参阅在 Linux 上使用 SSH 远程调试 .Net。
如果要调试依赖于框架的部署,请务必选择 dotnet
进程。 否则,该进程的名称将与应用的可执行文件相同。