使用GDB在ARM上进行开发调试

一、安装GDB及GDB server
1.1 GDB简介
GDB调试环境由宿主机GDB和目标开发板的GDB server共同构成,两者通过串口或TCP连接。使用GDB标准串行协议协同工作,实现对目标机的系统内核和上层应用的监控和调试功能。
GdbServer是GDB的一个组件,但通常不随发行版本的GDB一同发布,需要用户自行编译GDB的源代码包得到相应的GDB和GDBServer,可以从下载地址:http://ftp.gnu.org/gnu/gdb/,或者百度获取下载地址。
1.2 安装GDB
本例中目标板为Hi3520D,使用的GDB是GDB 7.2,宿主机为ubuntu10.4(vmware),本机开发环境为win7 x64。在获取源码gdb-7.2a.tar.gz(24MB)后,将其解压:
1.tar zxvf gdb-7.2.tar.gz
2.配置GDB,./configure –target=arm-linux –enable-sim –prefix=/opt/arm-gdb(其中prefix为设置您所需要的安装目录)
3.编译及安装,执行make,然后执行make install
4.执行结束后,在/opt/arm-gdb/bin目录下可看到生成的应用程序。
使用GDB在ARM上进行开发调试_第1张图片
5.将三个应用程序拷贝到/usr/local/bin。
1.3 安装GDB server
在编译安装GDB后,进入到目录gdbserver下,我的目录为/home/arm/gdb/gdb-7.2/gdb/gdbserver,在该目录下进行配置。在命令行里输入:./configure –target=arm-linux –host=arm-linux。接着,配置所采用的交叉编译器。我用的是Hi3520D,所用的交叉编译器为arm-hisiv100nptl-linux-gcc,因此我在命令行里输入 :
make CC=/opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin/arm-hisiv100nptl-linux-gcc
注意,一定要写交叉编译器的绝对路径!在make的过程中可能会出错,提示:
“linux-x86-low.c error: sys/reg.h: No such file or directory”。
这时候,在#ifdef HAVE_SYS_REG_H这句前面加上一句:
#undef HAVE_SYS_REG_H
然后重新编译即可。编译完成后,在gdbserver目录下就会生成gdbserver和gdbreplay。,这两个文件就可以放在目标板上和开发编译的程序一起进行调试。而主机上可以采用编译出来的arm-linux-gdb作为主机端运行的调试。
使用GDB在ARM上进行开发调试_第2张图片
二、测试代码及应用程序生成
为简单起见,我们就用一个十余行的C程序进行GDB调试演示。以下是C代码:

#include

int add(int a,int b)
{
        return a+b;
}
int main(int argc ,char* argv[])
{
int num1=1,num2=2,time;
const int plusCount=3;
for(time=0;time!=plusCount;++time)
    printf("%dplus%d=%d.\r\n",num1,num2,num1+num2);
printf("%dplus%d=%d byfunc.\r\n",num1,num2,add(num1,num2));
return 0;

}

在命令行里输入:arm-hisiv100nptl-linux-gcc test.c -g -o test 即可生成应用程序test。注意,编译时一定要加入-g参数,表示应用程序调试。
这里写图片描述
三、GDB+GDB server nfs调试方法
进行调试前首先需要保证目标开发板与宿主机支持nfs。在宿主机上安装samba教程可自行百度获取,或者参考文章附录。本例中宿主机IP为218.192.171.55,目标板IP为218.192.171.72,开发环境(win7 x64)IP为218.192.171.78,宿主机的共享目录为/mnt/nfs。
1.将gdbserver和test拷贝到/mnt/nfs,更改应用程序权限:chmod 777 gdbserver test。
2.通过telnet或者minicom远程到目标板,挂载nfs:
mount -t nfs -o nolock -o tcp 218.192.171.55:/mnt/nfs /nfsroot
使用GDB在ARM上进行开发调试_第3张图片
3.进入/nfsroot目录,输入指令:
./gdbserver 218.192.171.55:5000 test
其中,218.192.171.55为宿主机IP,5000表示目标开发板的调试端口(一般任意大于1024的端口号均可)。
使用GDB在ARM上进行开发调试_第4张图片
4.在宿主机命令行输入:arm-linux-gdb test,接着输入:
target remote 218.192.171.72:5000
连接成功后,出现如下提示:
使用GDB在ARM上进行开发调试_第5张图片
5.在宿主机命令行输入:b add 设置断点为函数add,然后再输入’c’,执行程序。效果如下:
使用GDB在ARM上进行开发调试_第6张图片
目标板端输出提示如下:
使用GDB在ARM上进行开发调试_第7张图片
6.输入’c’,继续运行程序,直到结束。然后输入’q’退出gdb。效果图如下:
使用GDB在ARM上进行开发调试_第8张图片
使用GDB在ARM上进行开发调试_第9张图片
注,本例仅进行简单测试,其它调试命令可参考附录。
四、GDB+GDB server串口调试
由于本人开发板未配有串口调试,故以下内容为搬运过来的。调试步骤如下:
1.如果你用串口1调试test的话,你就要现在板子上运行命令:gdbserver hello /dev/ttyS0 (详情可以参考gdbserver目录下的readme文件)。
2.在宿主机命令行输入:
arm-linux-gdb test
3.然后配置到串口,在宿主机命令行输入:
set remotedevice /dev/ttyS0(这里设置串口1)
set remote baud 9600 (这里设置串口波特率)
set debug remote 1(可选)
target remote /dev/ttyS0
4.操作到这儿,gdb就应该和gdbserver联系上了。接下来的操作和nfs中的操作保持一致,就不再赘述。
五、附录
本博文参考了多家之言,并且肯定存在许多不足。如果哪里表述有问题,还烦请指正。另外,推荐以下网页,可进一步学习相关内容。
1.GDB在ARM上的调试实战
http://blog.chinaunix.net/uid-2630593-id-2138581.html
2.CentOS 6.3下Samba服务器的安装与配置
http://www.cnblogs.com/mchina/archive/2012/12/18/2816717.html
3.GDB下载地址:
http://ftp.gnu.org/gnu/gdb/
4.GDB十分钟教程
http://blog.csdn.net/liigo/article/details/582231

你可能感兴趣的:(C/C++)