GDB调试主要有两种方法:
(1)直接在目标板上通过gdb调试程序
(2)在目标板上通过gdbserver运行程序,在宿主机上通过gdb调试程序
这两种方法中的gdb编译方法是不同的。(1)中的gdb是运行在目标板上,其elf文件应该是目标板芯片架构(如ARM aarch64等);(2)中的gdb运行于宿主机上,其elf文件应该是宿主机架构(如x86-64等)。
其中,(1)的编译方法在gdb源码下载及编译已经有介绍了,本文主要介绍(2)中gdb的编译方法及gdbserver的编译方法
一 gdbServer编译方法
gdbServer的编译方法和gdb相同,但需要先进入gdbserver目录示例如下:
mkdir -p /home/zhoujinlong/gdb/gdb-8.2/bin
cd /home/zhoujinlong/gdb/gdb-8.2/gdb/gdbserver
./configure --prefix=/home/zhoujinlong/gdb/gdb-8.2/bin --host=aarch64-linux-gnu LD=aarch64-linux-gnu-ld CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++
make -j8 && make install
gdbserver生成目录/home/zhoujinlong/gdb/gdb-8.2/bin
二 宿主机gdb编译方法
示例程序如下:
mkdir -p /home/zhoujinlong/gdb/gdb-8.2/bin
cd /home/zhoujinlong/gdb/gdb-8.2/gdb/gdbserver
./configure --target=aarch64-linux --program-prefix=aarch64-linux-gnu-
--prefix=/home/zhoujinlong/gdb/gdb-8.2/bin
make -j8 && make install
注意:
(1)configure 参数的不同, 这里没有指定CC/CXX/LD,默认使用宿主机编译工具链,故其生成的gdb可在宿主机运行
(2)--program-prefix=aarch64-linux-gnu-是指生成的可执行文件的前缀,比如aarch64-linux-gnu-gdb
(3)用于gdbserver调试的两个工具(gdb/gdbserver)其版本必须保持一致,故这里使用同一源码编译
三 使用方法
(1)将gdbserver和可执行程序拷贝到目标机上,并执行如下代码
#./gdbserver IP:PORT 可执行程序
./gdbserver 192.168.9.20:6666 mv_send_debug
Process /run/media/mmcblk1p1/mv_send_debug created; pid = 1528
Listening on port 6666
(2)在宿主机上运行gdb + 可执行程序
./aarch64-linux-gnu-gdb mv_send_debug
(3)在宿主机gdb环境下连接目标机
(gdb) target remote 192.168.9.20:6666
(4)连接成功后,宿主机gdb环境下按c运行程序,以及使用其他gdb调试命令,调试目标机程序
注意:
上述方法是通过网络连接的方式,故目标机和宿主机必须保证网络通信正常。
当然gdb/gdbserver也可以通过串口方式连接,其他方法可自行了解,这里不做介绍