GDB+GdbServer: ARM程序调试
程序,否则必须到gdbserver所在目录下运行之),或通过nfs mount的方式都可以。只要保证gdbserver能在开发板上运行就行。
四、gdb+gdbservernfs调试流程
下面就可以用gdb+gdbserver调试我们开发板上的程序了。在目标板上运行gdbserver,其实就是在宿主机的minicom下。我是在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端口(你也可以设其他可用的值,当然必须跟主机的gdb一致)开启了一个调试进程,hello为要调试的程序(必须-g加入调试信息)。
出现提示:
Process /tmp/hello created: pid=80 Listening on port 2345 (另一个终端下) #cd / #export PATH=$PATH:/usr/local/arm-gdb/bin #arm-linux-gdbhello 最后一行显示:ThisGDBwas configured as “--host=i686-pc-linux-gnu,--target=arm-linux”...,如果不一致说明arm-linux-gdb有问题 说明此gdb在X86的Host上运行,但是调试目标是ARM代码。 (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) |
注意:你的端口号必须与gdbserver开启的端口号一致,这样才能进行通信。建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r”。因为程序已经在Target Board上面由gdbserver启动了。结果输出是在Target Board端,用超级终端查看。连接成功,这时候就可以输入各种GDB命令如list、run、next、step、break等进行程序调试了。
以上针对通过nfs mount和tftp的方式,只能在主机上调试好后下载到开发板上运行,如果有错误要反复这个过程,繁琐不说,有些程序只能在开发板上调试。所以笔者采用了gdbserver的远程调试方式。希望对大家调试程序有用!
五、如何利用串口调试
如果你用串口1调试hello的话,你就要现在板子上运行命令:
gdbserver hello /dev/ttyS0(详情可以参考gdbserver目录下的readme文件)
这时gdbserver就在等待gdb的应答信号了。
然后在pc机上运行命令:
xxx-linux-gdbhello
在xxx-linux-gdb里敲入入下命令:
set remotedevice /dev/ttyS0(这里设置串口1)
set remote baud 9600(这里设置串口波特率)
set debug remote 1(可选)
target remote /dev/ttyS0
操作到这儿,gdb就应该和gdbserver联系上了。
六、实战调试
1.编辑文件
# vi gdbtest.c
1 #include
2
3 int
4 func(int n){
5 int sum=0, i;
6 for (i=0; i 7 sum += i; 8 } 9 return sum; 10 } 11 12 int 13 main(void) 14 { 15 int i; 16 long result = 0; 17 for (i=0; i<=100; i++){ 18 result += i; 19 } 20 21 printf("result[1-100] = %d \n", result); 22 printf("resutl[1-225] = %d \n", func(255)); 23 24 return 0; 25 } #arm-linux-gcc -g gdbtest.c -o gdbtest //交叉编译 2.下载文件到目标板: gdbtest和gdbserver 假设host pc ip:192.168.1.45 board ip:192.168.1.180 将文件拷贝到目标板上: 先将gdbtest和gdbserver两个文件拷贝到主机的/tftpboot目录下,此时系统主机和目标机都必须能够支持nfs 在目标板的Linux中运行: #mount 192.168.1.108:/tftpboot /mnt/nfs #cd /mnt/nfs #ls 看是否有gdbtest和gdbserver两个文件。 3.运行调试 client board: #./gdbserver 192.168.1.45:1234 gdbtest //目标板上运行gdbtest监听端口1234
[root@AT91RM9200DKarm]$./gdbserver 192.168.0.12:2345 mainparacarm
./gdbserver: error in loading shared libraries: libthread_db.so.1: cannot open [root@AT91RM9200DKarm]$
host pc:
#cd /usr/local/arm-gdb/bin/以便能够运行arm-linux-gdb,但是无此必要,可在环境变量中设置此路径即可。
#copy gdbtest /usr/local/arm-gdb/bin/ //将前面编译的文件gdbtest拷贝到此目录
#./arm-linux-gdbgdbtest
(gdb)target remote 192.168.1.180:1234 //连接到开发板成功后就可以
进行调试
(gdb)list or l
(gdb)break func
(gdb)break 22
(gdb)info br
(gdb)con
GDBGdbServerARM程序调 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)