跨平台编译&远程调试(rock5b开发板)小记

起因是想给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

操作步骤如下:

  1. 交叉编译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"
    }
    ]
    }
  2. 将之前交叉编译好的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"
    }
    ]
    }
  3. 配置好远程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"
    ]
    }
    ]
    }
  4. 开发板上启动gdb-server

    1
    gdbserver 0.0.0.0:17777 ./fanctrl

    如果要root权限记得加sudo;

    端口号17777 要和上一部中的一致。

  5. 启动VSCode的Debug

    需要在VSCode的Debug界面启动,不能用rust-analyser那个。

后面的碎碎念

这个方案很扭曲,因为VSCode在Windows下面,开发环境在WSL下面,而调试环境在Armbian下面。

不过后来想了下,(考虑到rock5b其实跑编译没问题)好像可以在Windows下面改代码然后直接同步到Armbian下编译,反正平时编译rust也是 Terminal> cargo build。问题在于同步方案还没想好。Windows下面有rsync吗?

最后,希望别哪天CodeLLDB不支持gdb-server了 (~o ̄3 ̄)~。

最后给个整机图:

Author: DWCarrot
Link: https://dwcarrot.github.io/blog/2023/03/26/cross-compiling-and-remote-debug-on-rock5b-tips/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.