在Visual Studio代码中实现Rust程序的远程调试 [英] Remote debug of Rust program in Visual Studio Code
问题描述
我正在开发一个在基于64位ARM处理器的嵌入式Linux板上运行的Rust程序。目标的嵌入式Linux是使用Yocto(Dunfell)构建的。我的Rust开发环境是运行在Linux上的Visual Studio代码(Ubuntu)。如何将其设置为在目标板上进行程序的远程调试?
我预计顺序如下:
- 编译目标的Rust程序(用于调试)。
- 将调试bin文件复制到目标。
- 使用gdb服务器或lldb-server在目标系统上运行它。
- VS代码连接到远程gdb/lldb,并控制程序进行常规调试。
推荐答案
扩展
- 我正在使用锈迹分析器扩展进行代码分析。它比Rust扩展更好。
- CodeLLDB扩展以启用使用lldb调试Rust程序。
交叉编译
目标板是64位ARM处理器,所以我想使用Rust为目标aarch64-unknown-linux-gnu
交叉编译。
我使用的是Ubuntu18.04LTS(它很旧,但我必须使用它来支持用旧的Yocto版本构建的旧项目)。我使用apt
安装了Ubuntu包gcc-8-aarch64-linux-gnu
。在更新的Ubuntu上,也许我可以安装一个更现代的包,如gcc-11-aarch64-linux-gnu
。
在我的~/.cargo/config
中:
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc-8"
然后,我可以使用以下命令手动使用cargo
进行交叉编译:
cargo build --target=aarch64-unknown-linux-gnu
然后在.vscode/tasks.json
中的我的VS代码工作区中的VS代码中进行交叉编译:
{
...
"tasks": [
...
{
"label": "rust: cargo build ARM"
"type": "cargo",
"command": "build",
"args": ["--target=aarch64-unknown-linux-gnu"],
"problemMatcher": [
"$rustc"
],
"group": "build",
},
]
}
然后,我只需执行Shift-Ctrl-B组合键,并选择";rust:Cargo Build Arm;Build任务。
远程调试
目标是以低权限用户targetuser
(而不是超级用户)身份在targetboard.local
上运行myapp
。
gdbserver
。在目标板上运行的嵌入式Linux镜像只需要gdbserver
。
目标板上还需要运行SSH服务器,支持rsync
或普通SSH复制。rsync
很好,因为它可以更快地将可执行文件复制到目标。
在myapp的My VS Code工作区中,.vscode/launch.json
:
{
...
"configurations": [
...
{
"type": "lldb",
"request": "custom",
"name": "Remote executable 'myapp'",
"preLaunchTask": "rust: remote ARM debug setup",
"targetCreateCommands": ["target create ${workspaceFolder}/target/aarch64-unknown-linux-gnu/debug/myapp"],
"processCreateCommands": ["gdb-remote targetboard.local:17777"]
}
]
}
在myapp的My VS Code工作区中,.vscode/tasks.json
:
{
...
"tasks": [
...
{
"label": "rust: remote ARM debug setup",
"type": "shell",
"command": "${workspaceFolder}/scripts/remote_debug.sh",
"args": [ "${workspaceFolder}", "targetboard.local", "17777" ],
"group": "none",
"dependsOn": [
"rust: cargo build ARM",
],
},
]
}
在myapp的VS代码工作区中,我创建了脚本scripts/remote_debug.sh
:
#!/bin/bash
VSCODE_WS="$1"
SSH_REMOTE="$2"
GDBPORT="$3"
APP="myapp"
TARGET_ARCH="aarch64-unknown-linux-gnu"
BUILD_BIN_FILE="${VSCODE_WS}/target/${TARGET_ARCH}/debug/${APP}"
TARGET_USER="targetuser"
TARGET_BIN_FILE="/home/targetuser/${APP}"
TARGET_CWD="/var/lib/myapp"
ssh "${TARGET_USER}@${SSH_REMOTE}" "killall gdbserver ${APP}"
if ! rsync -avz "${BUILD_BIN_FILE}" "${TARGET_USER}@${SSH_REMOTE}:${TARGET_BIN_FILE}"; then
# If rsync doesn't work, it may not be available on target. Fallback to trying SSH copy.
if ! scp "${BUILD_BIN_FILE}" "${TARGET_USER}@${SSH_REMOTE}:${TARGET_BIN_FILE}"; then
exit 2
fi
fi
ssh -f "${TARGET_USER}@${SSH_REMOTE}" "sh -c 'cd ${TARGET_CWD}; nohup gdbserver *:${GDBPORT} ${TARGET_BIN_FILE} > /dev/null 2>&1 &'"
目标CWD/var/lib/myapp
需要具有targetuser
的正确用户权限。我可以改为指定/home/targetuser
。
设置完成后,我只需在VS代码中按F5,它将进行编译,将文件复制到目标板,并通过gdbserver
开始远程调试。
这篇关于在Visual Studio代码中实现Rust程序的远程调试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!