在 vscode 中使用 gdb 跨平台远程调试 C/C++ 代码
重新编译安装 gdb
要使用 gdb 跨平台远程调试,需要在编译 gdb 的时候开启相关的支持选项,简单的说在 configure 选项中加入 --enable-targets=all
。
archlinux 用户可以使用 asp 来获取 gdb 的 PKGBUILD,做如下修改:
build() {
cd gdb-$pkgver
./configure --prefix=/usr --disable-nls \
--enable-targets=all \
--with-system-readline \
--with-python=/usr/bin/python3 \
--with-guile=guile-2.0 \
--with-system-gdbinit=/etc/gdb/gdbinit
make
}
然后运行 makepkg -si
编译安装,应该会报签名无法验证的错误,这时候需要我们先导入 PGP 公钥:
gpg --keyserver pgp.ustc.edu.cn --recv-keys 92EDB04BFF325CF3
然后再运行 makepkg -si
。
配置 vscode
首先要安装微软官方提供的 C/C++ 扩展。
然后进入菜单 “调试”-> “添加配置”打开配置文件 launch.json
,做如下配置:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Remote Launch",
"type": "cppdbg",
"request": "launch",
"miDebuggerServerAddress": "192.168.1.101:2333",
"program": "${workspaceFolder}/build-debug/program",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"sourceFileMap": {
"/build": "/build"
},
"logging": {
"engineLogging": false
},
"MIMode": "gdb",
}
]
}
下面几个选项按自己的实际情况修改:
- miDebuggerServerAddress 是远程机器的地址及 gdbserver 监听的端口
- program 是本地的可执行文件路径
- sourceFileMap 是本地路径与远程路径的映射关系
这里需要特别注意的是,由于 C/C++ 扩展本身的逻辑 bug,需要本地和远程机器上都有我们要调试的程序,并且架构保持一致。
如果我们的代码是在远程机器上编译的,可以将远程机器上编译好的二进制复制到本地机器上(虽然它并不会被执行),这一点与使用 CLion 不一样,CLion 做跨平台远程调试的时候是不需要本地有可执行文件的。
开始调试
按照上面的说明配置好后,先在在远程机器上运行 gdbserver:
gdbserver :2333 /path/to/build-debug/program
然后在 vscode 调试界面单击“开始调试”按钮,即可开始调试,如果遇到报错可以修改配置中的 engineLogging 为 true 后再次尝试启动调试,这时可以在调试控制台看到更详细的日志输出,以便定位及解决问题。