基于VS code的GDB远程调试环境搭建

一、实现功能

在单片机开发过程,如开发环境使用keil、下载器使用j-link,程序编写好后可以使用debug模式进行调试,如单步调试、打断点等。在开发Linux程序过程也可以实现类似的调试方式。本文将介绍如何实现这种调试方式,程序的开发环境是Ubuntu 20.04,开发语言为C。

二、环境搭建过程

1. 所需材料:

  • 目标板,测试设备CPU为ARM架构,运行的系统为Ubuntu;
  • 宿主机,win10操作系统,安装有虚拟机和VS code,虚拟机中安装有Ubuntu 20.04;
  • gdb和gdbserver应用程序(后面章节会介绍如何获取);

2.调试环境搭建

 (1) 在宿主机中安装VS code;

 (2) 运行VS code,安装Remote - SSH插件,如下图所示:

  (3) VS code使用SSH登录到虚拟机(目标机、虚拟机、宿主机三者应设置在同一网段,确保能相互ping通,虚拟机网络适配器设置为桥接模式);

  (4)安装插件C/C++ 、Native Debug,如下图所示:

 3. 编写测试程序

#include <stdio.h>
#include <unistd.h>

int main()
{
    int a = 0;

    while (1)
    {
        a ++;

        printf("Hello, world1!\n");
        fflush(stdout);
        sleep(1);

        printf("Hello, world2!\n");
        fflush(stdout);
        sleep(1);
    }

    return 0;
}

程序在编译时,要加 -g选项,表示添加调试信息。生成的可执行文件名为test。

4. GDB调试配置

按照如下步骤建立“launch.json”配置文件。

仅需对下面的参数进行修改:
“program”:表示可执行文件的路径;
“miDebuggerPath”:表示gdb的路径;
“miDebuggerServerAddress”:表示连接目标机gdbserver的网络参数。

其他参数的意思可以参考配置文件中给的帮助网站链接,建议仔细阅读一下,会很有收获。参数解释部分在网站链接的Debugging--Launch.json attributes

 该文件的文本内容如下:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceRoot}/test",
            "args": [],
            "cwd": "${workspaceRoot}",
            "environment": [],
            "externalConsole": true,
            "stopAtEntry": true,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "miDebuggerPath": "${workspaceRoot}/gdb",
            "miDebuggerServerAddress": "192.168.9.86:1234"
        }
    ]
}

5. GDB调试

将gdbserver与test测试程序传入目标机,目标机切换到root运行程序。正常运行后会打印如下信息:

root@admin:~# ./gdbserver 192.168.9.86:1234 ./test
Process ./test created; pid = 2792
Listening on port 1234

VS code连接gdbserver调试,按照如下进行操作。如果正常启动调试,DEBUG CONSOLE会打印连接过程信息,程序会停在main函数入口处。现在就可以进行DEBUG调试了。

 三、gdb和gdbserver的获取

1. 直接从交叉编译工具链文件包中查找

如果交叉编译工具链是一个完整的文件包,可以在工具链中尝试搜索gdb和gdbserver关键词,如果能检索到,并且可以使用,这是最好的方式了。检索出的名字不一定与上面的完全一致,如:gdb的名称可能是arm-linux-gnueabihf-gdb。如果只找到gdb文件,而没有找到gdbserver文件,如果目标机可以联网,可以尝试用apt install gdbserver下载安装。

2. 网络下载交叉编译工具链查找

先下载交叉编译工具链,然后再工具链包中检索gdb和gdbserver。
下载方式:
进入linaro官网:https://www.linaro.org/
找到下载版块点击download

 点击如图所示

 选择合适的版本

 将下载后的包解压进行检索gdb和gdbserver。

遇到的疑问:

 在这个网站上只查到了2018年-2021年的版本,2018年以前的版本如何查看?

3. 使用源码编译gdb和gdbserver

这种方式在编译过程会报很多错误,包括环境支持、编译配置等问题,而且编译时间长。需要很大的耐心和毅力去排查问题。

(1)下载源码:https://www.sourceware.org/gdb/

(2)编译gdbserver

gdbserver是在目标机运行的,基本是需要交叉编译的,所以在配置过程配置环境应是交叉编译工具链,这个非常重要。所以该指定PATH、CC的去指定。

例如:

export PATH=$PATH:usr/bin
export CC=aarch64-linux-gnu-gcc
./configure  --prefix=/tmp/gdbsever  --target=aarch64-linux-gnu --host=aarch64-linux-gnu
make
make install
--target=指定目标机交叉编译器的前缀,表示目标平台是运行在aarch64体系结构的Linux内核。
--host=表示目标主机,将运行的平台。
--prefix=表示编译生成的可执行文件所在目录。

 

configure过程报错要仔细认真排查,报错各不相同,可以认真分析上面下载源码网站中提供的帮助文档中关于编译gdb源代码部分,分析系统是否缺少必要的依赖。配置的格式也不一定与上面的一致。在make过程中也会报各种错误,仔细分析排查问题。在重新编译时,可以将之前解压的源码删除重新解压,然后configure和make,这样做能确保编译从头开始,没有其他可能的干扰。

(3)编译gdb

gdb的编译与gdbserver类似,gdb是运行在宿主机上的,所以编译环境是宿主机环境,但是在配置过程要指定target,如:

./configure  --prefix=/tmp/gdb  --target=aarch64-linux-gnu --host=x86_64-linux-gnu CC=gcc
make
make install

 

(4)测试

在prefix指定的目录可以找到gdb和gdbserver可执行文件,将gdbserver传输到目标机,gdb传输到宿主机。尝试运行这两个可执行文件,如果可以运行,就可以尝试使用GDB进行程序调试了。

参考资料:

参考资料1:VS Code远程调试Linux C指南

参考资料2:linux驱动开发篇Linaro(arm交叉编译器的下载与安装)

猜你喜欢

转载自blog.csdn.net/luotuo28/article/details/131061740