起因是想给rock5b开发板上的pwm->dc:2pin风扇写个简单控制器;程序会用到开发板上的资源,所以必须在开发板上测试,需要vscode的gdb相关代码提示但是又不希望在开发板上安装vscode-server^1;因此最后整了一个特别扭曲的方案,于是这里记录一下。
跨平台编译
同样是Rust工程到aarch64开发板,所以参考 Rust交叉编译环境配置 即可;不过这边提一下交叉编译工具链的问题。
首先,不要在Windows下做交叉编译,会变得不幸 (尽管是有Window 下的交叉编译工具链)。因此Host选择使用WSL,用VSCode Remote插件连接即可。
然后,当前rock5b上运行的系统是Armbian, 所以我选择了 developer.arm.com 下的aarch64-none-linux-gnu,因此在 .cargo/config 里面的target key需要对应。不过后来搜索这个发现rk3588官方也保留了一个aarch64-none-linux-gnu。这就很奇怪了。暂时没问到这两个的区别是什么。
远程调试
因为不希望在开发板上安装vscode-server,于是不能够直接 用VScode Remote连开发板。通过查阅资料(new bing真好用)选择使用 一种依赖 VSCode CodeLLDB 插件的方法。
VSCode CodeLLDB插件自然是用于lldb debug使用的;不过支持远程debug,而且当前支持 gdb-server。
操作步骤如下:
交叉编译debug版本的应用程序。这里使用了vscode的tasks来管理。
tasks.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18{
"version": "2.0.0",
"tasks": [
...
{
"type": "cargo",
"command": "build",
"problemMatcher": [
"$rustc"
],
"args": [
"--target", "aarch64-unknown-linux-gnu"
],
"group": "build",
"label": "rust: cargo build arm"
}
]
}将之前交叉编译好的debug-binary (
fanctrl
)发送到开发板。这里同样使用了vscode的tasks来管理。tasks.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15{
"version": "2.0.0",
"tasks": [
...
{
"type": "shell",
"command": "scp",
"args": [
"${workspaceFolder}/target/aarch64-unknown-linux-gnu/debug/fanctrl",
"▮.▮.▮.▮:▮▮<workspace>▮▮/fanctrl"
],
"label": "rust: remote ARM debug setup"
}
]
}配置好远程debug:
launch.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "custom",
"name": "remote debug",
"targetCreateCommands": [
"target create ${workspaceFolder}/target/aarch64-unknown-linux-gnu/debug/fanctrl"
],
"processCreateCommands": [
"gdb-remote ▮.▮.▮.▮:17777"
]
}
]
}开发板上启动gdb-server
1
gdbserver 0.0.0.0:17777 ./fanctrl
如果要root权限记得加sudo;
端口号
17777
要和上一部中的一致。启动VSCode的Debug
需要在VSCode的Debug界面启动,不能用rust-analyser那个。
后面的碎碎念
这个方案很扭曲,因为VSCode在Windows下面,开发环境在WSL下面,而调试环境在Armbian下面。
不过后来想了下,(考虑到rock5b其实跑编译没问题)好像可以在Windows下面改代码然后直接同步到Armbian下编译,反正平时编译rust也是 Terminal> cargo build
。问题在于同步方案还没想好。Windows下面有rsync吗?
最后,希望别哪天CodeLLDB不支持gdb-server了 (~o ̄3 ̄)~。
最后给个整机图: