我正在开发一个基于64位ARM处理器的嵌入式Linux板上运行的Rust程序。目标的嵌入式Linux是使用Yocto (dunfell)构建的。我的Rust开发环境是在Linux (Ubuntu)上运行的Visual代码。如何设置它来对目标板上的程序进行远程调试?
我想这个序列应该是:
lldb-server.
发布于 2021-08-23 07:22:33
扩展
可以更好地调试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然后在我的VS代码工作区中,在.vscode/tasks.json中交叉编译
{
...
"tasks": [
...
{
"label": "rust: cargo build ARM"
"type": "cargo",
"command": "build",
"args": ["--target=aarch64-unknown-linux-gnu"],
"problemMatcher": [
"$rustc"
],
"group": "build",
},
]
}然后我只做Shift-Ctrl,并选择“锈蚀:货物构建臂”构建任务。
远程调试
目标是将myapp作为低特权用户targetuser (而不是根用户)在targetboard.local上运行。
在VS代码中,CodeLLDB扩展使用lldb来调试Rust程序。但是,lldb是Yocto中针对目标硬件的一个大型编译。但是,它可以很好地连接到目标板上运行的gdbserver。在目标板上运行的嵌入式Linux映像只需要有gdbserver就行了。
目标板还需要在其上运行一个SSH服务器,并支持rsync或普通SSH副本。rsync很好,因为它可以更快地将可执行文件复制到目标。
在我的VS代码工作区中,我的应用程序在.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"]
}
]
}在我的VS代码工作区中,我的应用程序在.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",
],
},
]
}在我的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启动远程调试。
https://stackoverflow.com/questions/68888706
复制相似问题