分类: LINUX
2014-01-23 11:50:25
原文地址:http://blog.csdn.net/j6915819/article/details/6673127
GDB调试器提供了两种不同的调试代理用于支持远程调试,即gdbserver方式和stub(插桩)方式。
这两种远程调试方式是有区别的。gdbserver本身的体积很小,能够在具有很少存储容量的目标系统上独立运行,因而非常适合于嵌入式环境;而stub方式则需要通过链接器把调试代理和要调试的程序链接成一个可执行的应用程序文件,如果程序运行在没有操作系统的机器上,那么stub需要提供异常和中断处理序,以及串口驱动程序,如果程序运行在有操作系统的嵌入式平台上,那么stub需要修改串口驱动程序和操作系统异常处理。显然,对于在有嵌入式操作系统支持下的开发而言,gdbserver比stub程序更容易使用。这里使用的是GDB+gdbserver的方式,建立远程调试的环境。
gdbserver是一个可以独立运行的控制程序,它可以运行在类UNIX操作系统上,当然,也可以运行在Linux的诸多变种。gdbserver允许远程GDB调试器通过target remote命令与运行在目标板上的程序建立连接。
GDB和gdbserver之间可以通过串口线或TCP/IP网络连接通信,采用的通信协议是标准的GDB远程串行协议( Remote Serial Protocol RSP)。
使用gdbserver调试方式时,在目标机端需要一份要调试的程序的拷贝,这通常是通过ftp或NFS下载到目标机上的,宿主机端也需要这信一份拷贝。由于gdbserver不处理程序符号表,所以如果有必要,可以用strip工具将要复制到目标机上的程序中的符号表去掉以节省空间。符号表是由运行在主机端的GDB调试器处理的,不能将主机端的程序中的符号表去掉。
虽然大部分的Linux发行版都已经安装了GDB,但是那都是基于PC的平台的,我们要使用的是在ARM平台上,所以要重新下载gdb的源码,并修改以适应自己的目标平台。可以从获得。这里使用的是GDB的最新的版本7.1。首先将下载到的gdb-7.1.tar.bz2复制到/home/zfz/gdb目录下。在控制台下输入下面的解包命令
#tar -jxvf gdb-7.1.tar.bz2 |
./configure --target=arm-linux --prefix=/home/frank/gdb --program-prefix=arm-linux- |
make |
make intall |
./configure --target=arm-linux --host=arm-linux |
linux-arm-low.c:26:21:sys/reg.h: 没有那个文件 或目录 |
这里的sys/reg.h是指/usr/include/sys/reg.h,在该文件中定义的寄存器都是针对x86平台的,对于运行 |
#define HAVE_SYS_REG_H 1 |
#make CC = arm-linux-gcc |
GNU gdb (Sourcery G++ Lite 2008q3-72) 6.8.50.20080821-cvs
Copyright (C) 2008 Free Software Foundation, Inc. |
[root@Frankzfz]$gdbserver 10.27.10.48:9000 ./test_seg_fault |
arm-linux-gdb/bin$ arm-linux-gdb |
[root@Frankzfz]$gdbserver 10.27.10.48:9000 ./test_seg_fault |
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/j |
GNU gdb (GDB) 7.1 |
zfz@zfz:~/kernel/fs/arm-linux-gdb/bin$ ./arm-linux-gdb test |
[root@Frankzfz]$gdbserver 10.27.10.48:9000 ./test |
set solib-absolute-prefix /nfsroot/rootfs |
directory xfer-1.0.0/src/ |
(gdb) set solib-absolute-prefix /home/kernel/fs/root_nfs |