gdb+gdbserver方式进行ARM程序调试

2019-07-13 05:55发布

gdb+gdbserver方式进行ARM程序调试(收藏)

总体介绍 远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用 GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。 就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROMMonitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于,目标机远程调试stub的存在形式的不同,而其设计思路和实现方法则是大致相同的。 而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。

一配置编译及安装下载

1. 到http://www.gnu.org/software/gdb下载gdb-6.8.tar.gz到/tmp目录   2. 解压到/opt目录下
#cd /opt
#tar xzvf /tmp/gdb-6.8.tar.gz   3. 建立配置文件、编译
gdb允许把编译配置和编译结果放到任意的目录,因此可以在gdb目录之外建立一个专门存放编译结果目录.
#cd /opt
#mkdir -p arm-gdb/build
#cd arm-gdb/build
#/opt/gdb-6.8/configure --target=arm-linux--prefix=/opt/arm-gdb
#make
#make install   (--target配置gdb的目标平台,--prefixp指定了编译结果的存放位置,也就是安装目录。编译完后可以在/opt/arm-gdb/bin目录下找到可执行的arm-linux-gdb, arm-linux -gdbtui, arm-linux-run。 拷贝arm-linux-gdb到/usr/bin目录
#cd /opt/arm-gdb/bin/
#cp arm-linux-gdb /usr/bin/
  4. gdbserver的移植
gdbserver要用到gdb源码目录下的一些头文件,因此无法在gdb源码目录之外编译文件。
进入gdb/gdbserver目录: [root@dding gdbserver]# pwd /opt/gdb-6.8/gdb/gdbserver [root@dding gdbserver]#必须在gdbserver目录下运行配置命令,此时才能用相对路径 #./configure --target=arm-linux--host=arm-linux (--target=arm-linux表示目标平台,--host表示主机端运行的是arm-linux-gdb,不需要配置—prefix,因为gdbserver不在主机端安装运行) #makeCC=/usr/bin/arm/4.3.2/bin/arm-linux-gcc (这一步要指定你自己的arm-linux-gcc的绝对位置,我试过相对的不行,提示make: arm-linux-gcc:Command notfound,可好多人都用的相对路径,即直接赋值arm-linux-gcc,可采取make时传递参数,也可以直接修改gdbserver目录下的Makefile文件中的环境变量CC)   没有错误的话就在gdbserver目录下生成gdbserver可执行文件,注意此时要更改其属性,否则可能会出现无法访问的情况,chmod 777gdbserver将其更改为任何人都可以读写执行;使用arm-linux-strip命令处理一下gdbserver,将多余的符号信息删除,可让elf文件更精简,通常在应用程序的最后发布时使用;然后把它烧写到flash的根文件系统分区的/usr/bin(在此目录下,系统可以自动找到应用程序,否则必须到gdbserver所在目录下运行之),或通过nfsmount的方式都可以。只要保证gdbserver能在开发板上运行就行。
二、gdb+gdbserver nfs调试流程 下面就可以用gdb+gdbserver调试我们开发板上的程序了。在目标板上运行gdbserver,其实就是在宿主机的minicom下。连接主机和开发板.我选择了串口线和网线连接起了主机和开发板连接好电源,串口线,网线,打开串口终端. 通过NFS启动系统后,在开发板终端输入 # mount -t nfs-oonolock192.168.50.72:/opt/FriendlyARM/mini2440/root_qtopia  /mnt/ hello程序放在root_qtopia  下面.hello为要调试的程序(必须-g加入调试信息)。 # arm-linux-gcc -g-o hello hello.c   要进行gdb调试,首先要在目标系统上启动gdbserver服务。在gdbserver所在目录下输入命令: #cd /mnt/ #gdbserver192.168.50.72:2345 hello   192.168.50.72为宿主机IP,在目标系统的2345端口(你也可以设其他可用的值,当然必须跟主机的gdb一致)开启了一个调试进程,hello为要调试的程序(必须-g加入调试信息)。 出现提示:   Process/mnt/hello created: pid=80 Listening on port2345 (另一个终端下) #cd /opt/FriendlyARM/mini2440/root_qtopia   #arm-linux-gdbhello 最后一行显示:This GDB wasconfigured as “--hosti686pclinuxgnu,--targetarmlinux”...,如果不一致说明arm-linux-gdb有问题 说明此gdbX86Host上运行,但是调试目标是ARM代码。 (gdb) target remote192.168.50.168:2345 192.168.50.168为开发板IP   Remotedebugging using 192.168.50.168:2345 [New thread 80] [Switching to thread80] 0x40002a90 in??() 同时在minicom下提示: Remote debugging from host192.168.50.72(gdb)     注意:你的端口号必须与gdbserver开启的端口号一致,这样才能进行通信。建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r”。因为程序已经在TargetBoard上面由gdbserver启动了。结果输出是在TargetBoard端,用超级终端查看。连接成功,这时候就可以输入各种GDB命令如listrunnextstepbreak等进行程序调试了。     建立连接后进行gdb远程调试和gdb本地调试方法相同