gdbserver远程调试的具体实现

我采用的是nfs目标板挂载本机目录的方法,当然首先,你得开通本机的nfs共享服务,具体步骤如下:

1、进入/etc目录,vim exports这个文件,在里面添加/home 192.168.0.*(rw,sync)保存后退出

注:/home 为要共享的文件夹的名称,192.168.0.*为本NFS服务器允许访问的客户端ip,若nfs不成功,后面参数rw ro 等标志对文件夹操作权限,sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘。可以将括号里面的sync去掉。

2、重新启动nfs服务,命令为:/sbin/service nfs restart

3、输入命令route del default来关闭网关(加快mount速度)

4、mount 192.168.0.47(为本机的ip):/home /mnt用以测试本机是否开通nfs服务。

cd /mnt目录下,看mnt下的内容是否与home的内容一致,若一致,表明已经开通nfs服务。

当本机的nfs服务开通后,你还需要配置开发板的ip地址,由于各个开发板ip地址配置方法不一样,所以,假设开发板的ip地址为192.168.2.100.

搭建交叉编译环境的步骤:

1、一般在安装linux时候,自动安装c编译环境,因此不需要再重新安装gcc编译器。

2、安装交叉编译器

从ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain/下载交叉编译器cross-3.2.tar.bz2, 存放在/usr/local目录下。

切换致该目录:
# cd  /usr/local
# mkdir  arm

然后解压cross-3.2.tar.bz2:
# tar jxvf cross-3.2.tar.bz2 –C /usr/local/arm

解压后把/usr/local/arm/usr/local/arm中最后一个arm拷贝到/usr/local,也就是用命令cd /usr/local/arm/usr/local中,用cp -a arm /usr/local把arm拷贝到/usr/local中去。

3、把交叉编译器的路径加入到PATH。(两种方法a,b)

a、# export PATH=$PATH:/usr/local/arm/bin     

注:(这只能在当前的终端下才是有效的,)

b、修改/etc/profile 文件:
#  vim /etc/profile

增加路径设置,在末尾添加如下:
export PATH=$PATH:/usr/local/arm/bin

4、使新的环境变量生效。
# source /etc/profile

5、检查是否将路径加入PATH的方法。
# echo $PATH

如果显示的内容中有/usr/local/arm/bin,说明已经将交叉编译器的路径加入PATH。自此,交叉编译环境安装完成。

6、测试。

下面我们就来测试一个简单的例子。

/*Hello.c*/
#include <stdio.h>
int main()
{
printf(“hello word!\n”);
       return 0;
}

程序输好以后确认无误,保存。进入程序文件所在目录
# arm-linux-gcc hello.c –o hello

(-o 可以理解为“目标为生成”)arm-linux-gcc是第一次出现,有人可能会问这个哪里来的,不妨打开刚才安装的交叉编译工具目录/usr/local/arm-linux/arm-linux/bin/可以发现里面有一个arm-linux-gcc文件,这个就是针对arm的CPU的gcc编译器了。以后用其它编译工具链式也可以通过这种方法看看其编译器是什么了。编译好了以后就可以下载到目标机进行测试了。当然也可以先在PC机上测试正误。用gcc hello.c –o hello就可以生成PC机上程序了,在运行./hello 就可以发现终端显示hello!字样。用arm-linux-gcc编译的程序在PC机上是不能运行的,运行后给出错误报告:无法执行二进制文件。说明经过交叉编译环境编译出的文件是硬件可执行的二进制代码文件.

7、交叉编译环境搭建成功。

要经行gdbserver远程调试,还必须安装gdb远程调试工具:

gdb的源代码包可以从http: //ftp.cs.pu.edu.tw/Linux/sourceware/gdb/releases/下载,最新版本为gdb-6.4。下载到某个目录,笔者下载到自己的用户目录:/home/vicky。

下载完后,进入/home/vicky目录,配置编译步骤如下:
#tar jxvf gdb-6.4-tar-bz2
#cd gdb-6.4
#./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v
#make
(这一步的时候可能会有问题,提示一个函数中(具体函数名不记得了)parse error,就是unsigned前边多了一个”}”,你用vi进入那一行把它删掉就行了。一般都不会出错的。)
#make install
#export PATH=$PATH:/usr/local/arm-gdb

进入gdbserver目录:
#./configure --target=arm-linux –host=arm-linux
#make CC=/usr/local/arm/bin/arm-linux-gcc
(这一步要指定arm-linux-gcc的位置,可能跟你的不一样)

没有错误的话就在gdbserver目录下生成gdbserver可执行文件,把它烧写到flash的根文件系统分区,或通过nfs mount的方式都可以。只要保证gdbserver能在开发板上运行就行。

下面就可以用gdb+gdbserver调试我们开发板上的程序了。在目标板上运行gdbserver,其实就是在宿主机的minicom下,我的red hat linux装在vmware下的。我是在minicom下#mount 192.168.2.100:/ /tmp后做的(这里参数-o nolock可以不加,不加这一步执行得反而更快些),hello和gdbserver都是位于linux根目录下,把主机根目录挂在到开发板的/tmp 目录下。

要进行gdb调试,首先要在目标系统上启动gdbserver服务。在gdbserver所在目录下输入命令:

(minicom下)
#cd /tmp
#./gdbserver 192.168.2.100:2345 hello
192.168.2.100为宿主机IP,在目标系统的2345端口开启了一个调试进程,hello为要调试的程序。

出现提示:
Process /tmp/hello created: pid="80"
Listening on port 2345
(另一个终端下)
#cd /
#export PATH=$PATH:/usr/local/arm-gdb/bin
#arm-linux-gdb hello
(gdb) target remote 192.168.2.223:2345
(192.168.2.223为开发板IP)
出现提示:
Remote debugging using 192.168.2.223:2345
[New thread 80]
[Switching to thread 80]
0x40002a90 in ??()

同时在minicom下提示:
Remote debugging from host 192.168.2.100
(gdb)

连接成功,这时候就可以输入各种gdb命令如list、run、next、step、break等进行程序调试了。

注:在远程调试的这些步骤中nfs配置和安装交叉编译工具,以及安装gdb工具的没有什么顺序,只是主意再gdbserver远程连接前要配置好开发板的ip地址。