一,ARM交叉编译安装gdbserver
1,gdbserver下载
Linux系统自带gdb工具,可是无法用在ARM调试中,需要单独下载下来交叉编译arm-linux-gdb。gdbserver下载链接:ftp://sourceware.org/pub/gdb/releases/。下载后解压tar zxvf gdb-9.1.tar.gz。

2,编译gdb过程中需要使用texinfo, 先安装texinfo
sudo apt-get install texinfo
3,然后进入cd gdb-9.1/,配置编译 arm-linux-gnueabihf端:--host=arm-linux-gnueabihf
windows:--host不用配置,默认即可
生成简单的makefile:执行./configure --prefix=$pwd/__install
生成完整的makefile,执行 ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- CC=arm-linux-gnueabihf-gcc --prefix=/home/alinx/gdb_install
![]()
--build:运行编译工具链的平台,也就是正在执行编译操作的平台。如果未指定此参数,则通过 config.guess 猜测得到。通常都不指定此参数。
--host:可执行程序将运行的平台。如果未指定此参数,则和 --build 相同。如果 --host 和 --build 不同,是交叉编译;否则是普通编译。
--target(指定目标平台):可执行程序将处理的平台。如果未指定此参数,则和 --host 相同。一般来说,程序运行在什么平台,处理的就是什么平台,此参数值和 --host 参数相同,不需显式指定,所以通常不会关注到此参数。但在制作交叉编译工具 (如 gcc、gdb 等) 这种特殊情况下,此值和 --host 不同,例如交叉编译器 arm-linux-gcc,它运行在 x86-linux 平台 (--host 参数)。如果是交叉编译一个普通的应用,如运行于arm-linux平台的 tftp 程序,则它的运行平台和处理平台都是 arm-linux 平台
--program-prefix:指定将被加到所安装程序的名字上的前缀.例如,使用'--program-prefix=arm-linux-gnueabihf-'来configure,编译的gdb文件名为arm-linux-gnueabihf-gdb
--prefix(指定安装路径):编译的时候用来指定程序存放路径 。不指定prefix,可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc。其它的资源文件放在/usr /local/share。
4,编译make 和 make install

二,安装gdbserverguo过程中可能出现的问题
1,GDB9.1 Remote ‘g’ packet reply is too long错误

修改gdb/remote.c文件,屏蔽process_g_packet函数中的下列两行:
if (buf_len > 2 * rsa->sizeof_g_packet)
error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf);
换成如下几行:
- if (buf_len > 2 * rsa->sizeof_g_packet)
- {
- rsa->sizeof_g_packet = buf_len ;
- for (i = 0; i < gdbarch_num_regs (gdbarch); i++)
- {
- if (rsa->regs[i].pnum == -1)
- continue;
- if (rsa->regs[i].offset >= rsa->sizeof_g_packet)
- rsa->regs[i].in_g_packet = 0;
- else
- rsa->regs[i].in_g_packet = 1;
- }
- }

2,arm-linux-gdb在调试的时候会加载目标系统的库文件,如果出错时便无法调试

通过指令[set solib-search-path+库文件路径]来手动加载目标系统库文件
(gdb) set solib-search-path /home/alinx/boot/config/gcc-linaro/arm-linux-gnueabi/libc/lib/
三,调试步骤
arm-linux-gnueabihf-gcc -g tcp_test.c -o transdata
宿主机IP:172.27.226.141
目标板IP:172.27.226.16
1,目标板上运行gdbserver
./gdbserver 172.27.226.141:5000 transdata

附录:petalinux2015.4 使用gdbserver方式: Adding GDB to the ROOTFS:

- on target:
- mount /dev/mmcblk0p1 /mnt/
- ifconfig eth0 192.168.150.11
- ping 192.168.150.243
- gdbserver 192.168.150.243:2345 /mnt/linux_app.elf
-
-
-
- on host:
- aarch64-linux-gnu-gdb linux_app.elf
- (gdb) target remote 192.168.150.11:2345
- (gdb) break main
- (gdb) continue
- (gdb) continue
2,宿主机上运行arm-linux-gdb
arm-linux-gdb test