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的调试命令啦!
七、参考资料以及疑问解答
问题:为什么需要下载源码编译安装GDB而不是从包管理器进行安装呢?
回答:因为从包管理器安装的版本一般都是稳定的版本,会落后于最新版本。自己下载源码编译安装可以自由地选择GDB版本,还可以根据需要来修改参数来选择GDB的一些功能。