交叉编译gdb+gdbserver实现远程调试

时间:2021-03-01 16:38:29

 总结一下linux下交叉编译gdb并远程调试程序的知识 

1.配置交叉编译工具链到系统环境变量PATH下

export PATH=$PATH:'交叉编译工具链的绝对路径‘

2.编译主机端运行的gdb,但是处理的代码是arm平台

./configure --target=arm-linux --host=i686-pc-linux-gnu --prefix=/home/arm-software-install/arm-gdb
(说明:交叉编译时,我理解的target,host后面参数是你的交叉编译工具链的前缀)
make
make install

3.交叉编译arm开发板运行的gdbserver

./configure --target=arm-linux --host=arm-linux --prefix=/home/arm-software-install/arm-gdbserver
make
make install

注意:可能第二步编译gdb时会出现错误,提示configure: error: no termcap library found。
显然系统缺少termcap库,这是一个终端数据库。因此要交叉编译编译termcap库并将编译出来的头文件termcap.h和库文件libtermcap.a分别放到交叉编译工具链默认搜索的include和lib目录下。可以在交叉编译工具链的目录下执行XXXXXXX-linux-gcc -print-file-name libc.a命令查看默认搜索路径。
交叉编译编译termcap时,执行完./configure --target=arm-linux --host=arm-linux --prefix=/home/arm-software-install/arm-termgap命令后,配置完成后可能termgap并不是交叉编译,这里也不知道是什么原因。这时候就需要手动修改生成的makefile文件,将CC和AR分别改成交叉编译工具链的相应工具名称,然后执行make,make install即可。如果再编译gdb时还是提示没有找到termgap库,可以检查以下系统是否安装了ncurses库,可以通过apt-get安装。编译完成后可以通过file命令查看编译出的文件是运行在那种平台上的程序。

编译完成后可以利用gdb+gdbserver进行远程调试(注意:一定要用自己编译出来的gdb和gdbserver调试否则会因为版本不匹配造成调试失败)。

生成的gdb在host端运行,而gdbserver需要下载到板子上运行。这两者之间可以利用TCP(格式为host:port)、UDP(格式为udp:host:port)或者串口(比如/dev/ttyb)来通信。使用gdbserver调试方式时,在目标机端需要一份要调试的程序的拷贝,这通常是通过ftp或NFS下载到目标机上的,宿主机端也需要这信一份拷贝。由于gdbserver不处理程序符号表,所以如果有必要,可以用strip工具将要复制到目标机上的程序中的符号表去掉以节省空间。符号表是由运行在主机端的GDB调试器处理的,不能将主机端的程序中的符号表去掉。

利用网络远程调试步骤:
1.板子上需要运行的命令
gdbserver 192.168.1.200(宿主机的ip地址):7777(服务器端需要监听的端口号,自行指定)   test(要调试的程序)
2.主机上需要运行的命令
arm-linux-gdb test
target remote 192.168.1.168(开发板的ip地址):7777                  --连接gdbserver,连接成功后会在板子的控制台上显示出相应的提示
接下来在host终端上输入调试命令就像调试本地程序一样。