在 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 后再次尝试启动调试,这时可以在调试控制台看到更详细的日志输出,以便定位及解决问题。

标签: GDB, vscode, debug

添加新评论