GDB调试环境搭建(GDB-16.2)

本文主要介绍如何通过下载GDB源码的方式编译安装GDB调试工具,本文以目前最新的GDB-16.2为例。

一、下载源码并解压

首先到网上下载GDB源码,源码下载可以到GNU官方网站下载或者到国内镜像源下载。GDB源码一般分为以下几种:

图片描述

根据源码包的后缀选择对应的解压命令对源码包进行解压,例如:

tar -zxvf gdb-7.11.1.tar.gz
  • -z:表示使用 gzip 压缩方式处理文件(解压 .tar.gz 或 .tgz 文件时需要此选项)。
  • -x:表示解压归档文件(extract)。
  • -v:表示详细模式(verbose),它会在解压过程中列出所有被处理的文件名。
  • -f:表示指定归档文件(filename),后面接的就是要解压的文件名(gdb-7.11.1.tar.gz)。

这条命令的作用是:解压一个使用 gzip 压缩的 tar 归档文件,同时显示解压过程中的详细信息。文件 gdb-7.11.1.tar.gz 将会被解压到当前目录中。

tar -xvf gdb-16.2.tar.xz
  • -x:表示解压归档文件(extract)。
  • -v:表示详细模式(verbose),在解压过程中列出文件的具体信息。
  • -f:指定归档文件(filename)。

解压完成后,gdb-16.2 文件夹将会出现在当前目录中。

二、检查缺失的依赖项

通过运行源码当中的configure脚本来检查当前linux系统是否有缺失的依赖没有安装。

首先cd到当前的源码目录当中,为了保证源码目录整洁,新建一个build目录用于存放编译后的文件

mkdir build && cd build

在build目录当中运行configure脚本,检查当前系统环境是否安装了必要依赖

../configure

运行configure时的其他参数:

  • --target=aarch64-linux-gnu
  • --prefix=/home/tronlong/RK3562/Ubuntu/gdb-test/install
  • --target 定义了GDB所支持的目标平台,也就是 被调试程序 运行的架构和操作系统。例如:aarch64-linux-gnu 表示目标架构是 AArch64 (ARM64),目标操作系统是 Linux,目标工具链是 GNU工具链。
  • --prefix 表示存放目录,可以选择自定义的目录,未指定时软件安装至默认目录。

如果需要用GDB调试运行在不同架构(如ARM设备)上的程序,则需要在配置时加上 --target 指定目标架构,否则默认就是当前的机器架构。

在执行完configure后,根据终端输出判断还有那些依赖没有安装,未安装的依赖可以通过包管理器安装,看不懂终端输出的话就借助AI帮忙理解,我这里重复了四次操作,可以通过以下命令一次性安装完成:

sudo apt update && sudo apt install build-essential libgmp-dev libmpfr-dev libisl-dev texinfo bison flex m4 expect dejagnu

至此,GDB源码编译所需要的依赖已经准备完了。

三、编译GDB源码

在build目录当中执行:

make -j$(nproc)
  • -j$(nproc) 是为了并行编译,利用CPU的所有核心来加速编译。也可以使用 make 不带参数,但编译时间会更长。

编译后可执行以下命令对GDB的编译结果进行检查,检查的速度取决于机器的性能:

make check

执行以下命令,安装编译好的GDB,安装路径默认为/usr/local/bin。与包管理器安装的位置不同,包管理器安装的位置是位于/usr/bin,因此不会产生冲突,具体使用的版本优先级则需要在环境变量中修改。

sudo make install

由于默认安装的位置是系统目录,所以需要使用sudo提权,除非另外指定安装的目录,例如:

../configure --prefix=/home/yourname/my_gdb
make
make install  # 不需要 sudo

最后使用以下命令打印版本号以查询是否有安装成功:

gdb --version

至此,整个GDB的源码编译安装流程结束。

四、GDB版本优先级

如果担心包管理器安装的版本和自编译安装的版本冲突,可以按照以下步骤查询修改。

输入以下指令查询当前环境变量的搜索顺序:

echo $PATH

使用以下命令来查询当前所使用的GDB的安装位置:

which gdb

一般而言,自己编译安装的软件路径会优先于系统包管理器安装的软件路径,例如在使用echo $PATH命令后,输出以下信息可看出:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

如果需要修改优先级,可以根据系统所使用的终端,来修改对应的配置文件,编辑.bashrc文件或.zshrc。

export PATH=/usr/local/bin:$PATH

保存并运行以下命令使改动生效:

source ~/.bashrc

五、修改与卸载

万一之前编译的时候参数没写或者忘记了,导致了gdb不是自己想要的(主要是我之前编译的时候忘记指定系统架构了),可以采取重新编译再安装的方式替换掉之前安装的gdb。(主要适用于两次安装都处于同一个安装目录下),本文的gdb安装在默认目录下,没有指定其他位置。

首先回到build目录清理构建目录:

make distclean

重新指定目标架构:

../configure --target=aarch64-linux-gnu

执行编译命令:

make -j$(nproc)

使用安装命令:

sudo make install

最后使用以下命令打印版本号以查询是否有安装成功:

gdb --version

如果需要卸载,需要在终端中查找当前所使用的GDB的安装位置:

which gdb

之后在相关目录下手动卸载即可。

六、连接与调试

在linux中创建一个C源文件,这里以“demo.c”为例,使用以下命令编译:

aarch64-linux-gnu-gcc -g demo.c -o demo

编译时添加-g 参数,生成的可执行文件才带有调试信息。这里的aarch64-linux-gnu-gcc如果没有安装的话需要自行安装,可直接使用包管理器安装。

生成demo可执行文件之后,将可执行文件传输至开发板linux系统的文件目录中,并执行以下命令连接:

gdbserver 192.168.13.85:1234 demo

这里的IP地址是开发系统的IP地址,开发系统与开发板需要连接至相同的网段。

终端定位至gdb的安装目录,本文的安装目录为/usr/local/bin,执行以下代码以运行GDB调试程序:

./aarch64-linux-gnu-gdb demo

在开发系统中运行以下命令以连接开发板,这里的IP地址为开发板地址:

target remote 192.168.13.68:1234

连接成功之后就可以使用gdb的调试命令啦!

七、参考资料以及疑问解答

【c++】gdb的安装 - 无信不立 - 博客园

问题:为什么需要下载源码编译安装GDB而不是从包管理器进行安装呢?

回答:因为从包管理器安装的版本一般都是稳定的版本,会落后于最新版本。自己下载源码编译安装可以自由地选择GDB版本,还可以根据需要来修改参数来选择GDB的一些功能。