You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS Code下通过SSH远程调试C++,如何仅保留本地源码?

解决方案思路

针对你的需求,不用复制源码到嵌入式板就能实现远程调试,核心是利用VS Code的C/C++扩展+Remote - SSH扩展,配合本地源码映射和远程gdbserver来完成,以下是具体步骤和配置示例:

一、前置准备

  • 确保嵌入式Linux板上已安装gdbserver(Yocto构建时可将其加入镜像,或者通过包管理安装)。
  • 确认WSL中使用Yocto SDK编译时添加了-g参数,生成带调试信息的可执行文件。
  • 在VS Code中安装C/C++、Remote - SSH这两个官方扩展。

二、配置launch.json(核心:源码映射+远程调试)

在VS Code的.vscode/launch.json中添加如下配置,关键是通过sourceFileMap将本地WSL的源码路径映射到远程调试时的路径,避免复制源码:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Remote Embedded Debug",
            "type": "cppdbg",
            "request": "launch",
            // 嵌入式板上可执行文件的绝对路径
            "program": "/home/root/your_project/your_executable",
            "args": [],
            "stopAtEntry": false,
            // 程序在板上的工作目录
            "cwd": "/home/root/your_project",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            // WSL中Yocto SDK提供的交叉编译gdb路径(比如arm-poky-linux-gnueabi-gdb)
            "miDebuggerPath": "/opt/poky/3.1/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gdb",
            // 嵌入式板的IP+gdbserver监听端口
            "miDebuggerServerAddress": "192.168.1.100:1234",
            // 源码映射:将远程调试时识别的源码路径(如果有的话)映射到本地WSL的源码根目录
            "sourceFileMap": {
                "/home/root/your_project/src": "${workspaceFolder}/src"
            },
            "setupCommands": [
                {
                    "description": "开启gdb美观打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            // 关联调试前的部署任务(自动传可执行文件到板上)
            "preLaunchTask": "Deploy Executable"
        }
    ]
}

三、配置tasks.json(自动部署可执行文件)

在.vscode/tasks.json中添加编译+部署的自动任务,避免手动传输文件:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Deploy Executable",
            "type": "shell",
            // 先编译,再通过SCP传到嵌入式板
            "command": "cd ${workspaceFolder} && make && scp ./your_executable root@192.168.1.100:/home/root/your_project/",
            "args": [],
            "problemMatcher": [],
            "dependsOn": "Build Project"
        },
        {
            "label": "Build Project",
            "type": "shell",
            "command": "cd ${workspaceFolder} && make", // 替换成你的编译命令(如cmake --build)
            "args": [],
            "problemMatcher": "$gcc"
        }
    ]
}

四、启动gdbserver的两种方式

  1. 自动启动(推荐):修改Deploy Executable任务的command,在传输文件后通过SSH自动启动gdbserver:

    cd ${workspaceFolder} && make && scp ./your_executable root@192.168.1.100:/home/root/your_project/ && ssh root@192.168.1.100 "gdbserver :1234 /home/root/your_project/your_executable"
    

    注意:这种方式gdbserver会在前台运行,调试结束后需要手动终止,或者添加nohup ... &让其后台运行,但要注意端口占用问题。

  2. 手动启动:通过SSH登录嵌入式板,执行:

    gdbserver :1234 /home/root/your_project/your_executable
    

    保持该终端窗口打开,再启动VS Code的调试会话。

五、Pipe Transport的配置(更稳定的连接)

如果不想手动管理端口,或者需要更可靠的连接,可以用pipeTransport替代miDebuggerServerAddress,让VS Code自动通过SSH建立和gdbserver的管道连接,修改launch.json的对应部分:

// 去掉miDebuggerServerAddress,添加以下内容
"pipeTransport": {
    "pipeProgram": "ssh",
    "pipeArgs": ["root@192.168.1.100"],
    "debuggerPath": "/usr/bin/gdbserver", // 嵌入式板上gdbserver的绝对路径
    "pipeCwd": "${workspaceFolder}",
    "quoteArgs": false
},

这种方式无需手动启动gdbserver,VS Code会在调试时自动通过SSH启动并建立连接,更适合嵌入式场景。

内容的提问来源于stack exchange,提问作者BakeThemAwayToys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:00:59