嵌入式 C++ 远程开发环境: 从 SSH 到交叉调试

3 阅读3分钟

原始案例: VSCode C++ 开发效率优化


1. SSH 连接配置

1.1 密钥生成与部署

# 生成 Ed25519 密钥 (比 RSA 更短更安全)
ssh-keygen -t ed25519 -C "dev@embedded"

# 部署公钥到目标板
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@arm-board

若目标板不支持 ssh-copy-id:

cat ~/.ssh/id_ed25519.pub | ssh user@arm-board "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

1.2 SSH Config

# 嵌入式开发板
Host arm-board
    HostName 192.168.1.100
    User root
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60
    ServerAliveCountMax 3

# 通过跳板机访问内网开发板
Host arm-internal
    HostName 10.0.0.50
    User root
    ProxyJump jumphost

1.3 连接复用 (ControlMaster)

首次连接建立主连接,后续复用 socket,减少握手开销:

Host *
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h:%p
    ControlPersist 10m

VS Code Remote-SSH 有时与 ControlMaster 冲突导致连接挂起,遇到问题时对特定 Host 禁用:

Host arm-board
    ControlMaster no

2. 代码索引: clangd 替代 gtags

原文推荐 gtags + GNU Global 加速"查找所有引用"。现在 clangd 是更好的方案:

维度gtagsclangd
索引精度文本匹配,宏展开后误报编译器前端,语义级精确
跳转准确性模板/重载经常跳错完全理解 C++ 语义
增量更新需手动 global -u保存文件自动更新
交叉编译不理解 -I -D读取 compile_commands.json

2.1 生成 compile_commands.json

# CMake 项目
cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

# Makefile 项目 (用 bear 包装)
sudo apt install bear
bear -- make -j$(nproc)

2.2 交叉编译场景

项目根目录创建 .clangd:

CompileFlags:
  Add:
    - --target=aarch64-linux-gnu
    - -I/opt/toolchain/aarch64-linux-gnu/include
  Remove:
    - -mfpu=*
    - -march=*

2.3 VS Code 配置

安装 clangd 扩展,禁用微软 C/C++ 扩展的 IntelliSense 避免冲突:

{
    "clangd.arguments": [
        "--background-index",
        "--clang-tidy",
        "--header-insertion=iwyu",
        "-j=4"
    ],
    "C_Cpp.intelliSenseEngine": "disabled"
}

使用 clangd 后不再需要手动维护 c_cpp_properties.json 中的 includePath,所有信息从 compile_commands.json 自动获取。


3. 远程调试: gdbserver 交叉调试

编译在宿主机 (x86),运行在目标板 (ARM),通过 gdbserver 交叉调试。

3.1 launch.json

{
    "version": "0.2.0",
    "configurations": [{
        "name": "Remote ARM Debug",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/build/your_program",
        "MIMode": "gdb",
        "miDebuggerPath": "/opt/toolchain/bin/aarch64-linux-gnu-gdb",
        "miDebuggerServerAddress": "192.168.1.100:2345",
        "setupCommands": [
            {
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
            },
            {
                "text": "-gdb-set sysroot /opt/toolchain/aarch64-linux-gnu/libc",
                "ignoreFailures": false
            }
        ],
        "preLaunchTask": "deploy-and-start-gdbserver"
    }]
}

关键参数:

  • miDebuggerPath: 交叉工具链中的 GDB,不是宿主机的 /usr/bin/gdb
  • sysroot: 让 GDB 找到目标板共享库符号,否则无法解析 libc 调用栈

3.2 自动部署 + 启动 gdbserver

.vscode/tasks.json:

{
    "version": "2.0.0",
    "tasks": [{
        "label": "deploy-and-start-gdbserver",
        "type": "shell",
        "command": "bash",
        "args": ["-c", "scp build/your_program root@192.168.1.100:/tmp/ && ssh root@192.168.1.100 'killall -q gdbserver; gdbserver :2345 /tmp/your_program' &"],
        "isBackground": true,
        "problemMatcher": []
    }]
}

按 F5 即可: scp 部署 → 启动 gdbserver → GDB 连接 → 断点调试。

3.3 替代方案: Remote-SSH 直连

目标板资源充足 (RAM > 512MB) 时,直接用 Remote-SSH 连接目标板,调试配置简化为本地调试,省去交叉调试的复杂性。


4. 文件共享

方案性能复杂度适用场景
VMware HGFS虚拟机开发
NFS局域网共享
SSHFS远程临时访问
rsync + inotify交叉编译同步

嵌入式交叉编译推荐 rsync 自动同步:

inotifywait -mr build/ -e close_write | while read path action file; do
    rsync -avz build/your_program root@192.168.1.100:/tmp/
done

VMware 共享文件夹挂载:

sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,uid=$(id -u),gid=$(id -g)

5. 网络受限环境

5.1 VS Code Server 离线安装

# 有网络的机器上下载
commit_id=$(code --version | head -2 | tail -1)
curl -L "https://update.code.visualstudio.com/commit:${commit_id}/server-linux-arm64/stable" -o vscode-server.tar.gz

# 传输到目标板
scp vscode-server.tar.gz root@arm-board:~
ssh root@arm-board "mkdir -p ~/.vscode-server/bin/${commit_id} && tar -xzf ~/vscode-server.tar.gz -C ~/.vscode-server/bin/${commit_id} --strip-components=1"

URL 架构: server-linux-x64 (x86) / server-linux-arm64 (ARM64) / server-linux-armhf (ARM32)。

5.2 扩展离线安装

marketplace 下载 .vsix,scp 传输后远程安装:

scp clangd-0.1.29.vsix root@arm-board:~/
ssh root@arm-board "code-server --install-extension ~/clangd-0.1.29.vsix"

6. SSH 安全加固

生产环境嵌入式设备 (/etc/ssh/sshd_config):

PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers developer
PermitRootLogin prohibit-password
MaxAuthTries 3

参考资源