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的两种方式
自动启动(推荐):修改
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 ... &让其后台运行,但要注意端口占用问题。手动启动:通过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
相关产品推荐
相关产品推荐

