起因是想给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 ̄)~。
最后给个整机图:
 
