一、gdb、gdbserver总体介绍
远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用 GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机 调试程序间的一个媒介而存在。
就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于,目标机远程调试stub 的存在形式的不同,而其设计思路和实现方法则是大致相同的。
而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复 杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。
二、配置编译及安装下载
嵌入式linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target端使用gdbserver。这样,应用程序在嵌入式目标系统上运行,而gdb调试在Host端。一般linux都有一个自带的GDB,但是不能直接使用,而要获取GDB源代码包,针对ARM平台作一个简单配置,重新编译得到相应的GDB。
GDB的源代码包可以从 http://www.gnu.org/software/gdb/download/ 下载
我下载的是gdb-7.3版,放在~/Downloads目录下
以下是配置编译步骤:
cd gdb-7.3 ./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v
--target配置gdb的目标平台,--prefix配置安装路径
编译 make
安装 make install
至此,gdb安装完成。
接下来为linux-arm安装gdbserver
进入~/Downloads/gdb-7.3/gdb/gdbserver
配置
./configure --target=arm-linux --host=arm-linux
编译
make CC=arm-linux-gcc
没有错误的话,就在gdbserver目录下生成gdbserver可执行文件,更改其属性,使用任何人都可以读写执行。
chmod 777 gdbserver
arm-linux-strip gdbserver
将多余的符号信息删除,可让elf文件更精简。
然后通过NFS传给linux-arm,并将gdbserver放入根文件系统分区的/usr/bin
具体NFS的操作方法:http://www.cnblogs.com/flyingcloude/archive/2012/10/23/2735495.html
三、调试
下载GNU Hello
这个软件包需要配置成使用交叉编译;不过这其实很容易做;它只需要一个交叉编译器的前缀。
wget http://ftp.gnu.org/gnu/hello/hello-2.6.tar.gz tar xzf hello-2.6.tar.gz cd hello-2.6 ./configure --host=arm-none-linux-gnueabi make cd ..
结果就是一个ARM架构的可执行文件“hello-2.6/src/hello”。
开始调试
在linux-arm中运行 gdbserver --multi 192.168.1.123:1234
在host中,运行
arm-linux-gdb
要调试远端的程序,我需要告诉GDB使用ARM的共享库而不是本地库(那些用于32位x86的);否则执行的时候调试器会抱怨说库不匹配。
1 set solib-absolute-prefix nonexistantpath 2 set solib-search-path /opt/FriendlyARM/toolschain/4.4.3/arm/arm-none-linux-gnueabi/lib/ 3 file ./hello-2.6/src/hello 4 target extended-remote 192.168.1.123:1234 5 set remote exec-file /nfs/hello 6 break main 7 run
(gdb) target extended-remote 192.168.1.123:1234 Remote debugging using 192.168.1.123:1234 (gdb) set remote exec-file /nfs/hello (gdb) break main Breakpoint 1 at 0x8c24: file hello.c, line 46. (gdb) run Starting program: /home/ubuntu/nfs/hello warning: Can not parse XML target description; XML support was disabled at compile time warning: Unable to find dynamic linker breakpoint function. GDB will be unable to debug shared library initializers and track explicitly loaded dynamic code. Cannot access memory at address 0x0 warning: Could not load shared library symbols for 2 libraries, e.g. /lib/arm-linux-gnueabi/libc.so.6. Use the "info sharedlibrary" command to see the complete listing. Do you need "set solib-search-path" or "set sysroot"? Breakpoint 1, main (argc=1, argv=0xbe85ce34) at hello.c:46 46 { (gdb)
参考:http://blog.csdn.net/maijian/article/details/5968367