【VSCode】作为GDB前端调试目标进程

一般情况下调试都是在本机上直接进行的,即使是调试远程主机也是在VSCode中连接到远程主机进行调试的,这种方法下不存在什么问题。

但是我现在遇到的问题就是我不想将代码放到远程主机上去编译,远程主机性能很拉跨,跑不了,但是本机又是 x86_64 架构的,远程主机是 ARM64 架构的,本机还需要交叉编译才行。

我的想法是在本机上使用交叉编译器编译远程主机的 ARM64 代码,然后将编译后的可执行程序发送过去,再在远程主机上执行 GDB Server,打开对该可执行程序的调试,然后使用 VSCode 连接到远程主机的 GDB Server 上进行调试。

这里为了测试的方便,两个环境都使用的一样的架构。

  1. 因为远程主机是在 Linux 环境下的,所有先使用 Docker 创建两个容器用于测试

    1
    2
    docker run -itd --name remote_gdb_test --privileged ubuntu:20.04
    docker run -itd --name remote_gdb_test_edit --link remote_gdb_test ubuntu:20.04
  2. 然后使用 VSCode 远程工具连接到 remote_gdb_test_edit 容器并安装插件

    • Native Debug
      提供 SSH 远程gdb调试支持
    • C/C++ Extension Pack
      提供 c/c++ 断点调试及自动补全支持
  3. 然后在 remote_gdb_test_edit 中创建 c 语言源文件 main.c

    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>

    int main(void)
    {
    printf("Hello World\r\n");
    return 0;
    }
  4. 使用软件进行编译

    1
    2
    apt update -y && apt install -y gcc gdb
    gcc main.c -rdynamic -ldl -o main -g

    生成了个 main 可执行程序,使用命令在 remote_gdb_test_edit 上运行一下看

    1
    ./main

    会输出一个 Hello World

  5. 然后使用 VSCode 远程工具连接到 remote_gdb_test 中安装依赖

    1
    2
    3
    4
    5
    apt update -y && apt install -y gdb openssh-server
    /etc/init.d/ssh start
    echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
    service ssh restart
    echo -e "123456\n123456" | passwd root
  6. 在 remote_gdb_test_edit 的 VSCode 中点击左侧的运行和调试按钮,然后点击按钮右侧的创建 launch.json 文件

  7. 然后选择 GDB,文件内容如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    {
    // 使用 IntelliSense 了解相关属性。
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Debug",
    "type": "gdb",
    "request": "launch",
    "target": "./main",
    "remote": true,
    "cwd": "${workspaceRoot}",
    "valuesFormatting": "parseText",
    "ssh": {
    "forwardX11": false,
    "host": "remote_gdb_test",
    "cwd": "/root",
    "user": "root",
    "password": "123456"
    }
    }
    ]
    }
  8. 将 remote_gdb_test_edit 中编译出的 main 以任何方式复制到 remote_gdb_test 的 /root 目录下,并赋予权限

    1
    chmod a+x main
  9. 在 remote_gdb_test_edit 中的 main.c 文件中的 printf("Hello World\r\n"); 语句下一个断点,然后点击调试,观察现象,可以发现调试器成功命中该语句

小结

远程调试必须要将编译好的文件复制到远程主机中,不然无法调试

【VSCode】作为GDB前端调试目标进程

https://biteax.com/ef373c0b.html

作者

石志超

发布于

2021-12-20

更新于

2023-09-27

许可协议