登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

转贴:嵌入式Linux的GDB远程调试的实现

作者:weixiao11 栏目:DSP技术
转贴:嵌入式Linux的GDB远程调试的实现
http://www.hhcn.com/cgi-bin/topic.cgi?forum=6&topic=346&show=0
摘自华恒技术支持论坛嵌入式技术园地

嵌入式Linux的GDB远程调试的实现

Author: Vicky

远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准远程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。

就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM MONITOR调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于,目标机远程调试stub的存在形式的不同,而其设计思路和实现方法则是大致相同的。
而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。Gdbserver在目标系统中运行,gdb则在宿主机上运行。

要进行GDB调试,目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序。一般linux发行版中都有一个可以运行的gdb,但开发人员不能直接使用该发行版中的gdb来做远程调试,而要获取gdb的源代码包,针对arm平台作一个简单配置,重新编译得到相应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/2.95.3/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 mount和tftp的方式,只能在主机上调试好后下载到开发板上运行,如果有错误要反复这个过程,繁琐不说,有些程序只能在开发板上调试。所以笔者采用了gdbserver的远程调试方式。希望对大家调试程序有用!






* - 本贴最后修改时间:2006-9-20 10:01:55 修改者:weixiao11

原贴链接

2楼: >>参与讨论
weixiao11
华恒技术支持论坛宝藏丰富,共享一些过来
转贴至此,回答网友关于GDB调试的问题,原贴也有一些跟贴是反映问题的,有困惑的朋友可以点击原贴看看是不是有和自己遇到的类似的现象。

3楼: >>参与讨论
telnetchen
我设置的断点怎么是无效的呢?
我用的是BF531
uClinux
Linux version 2.6.16.11-ADI-2006R1-hhbf (root@server)
        (gcc version 3.4.5 (ADI cvs))#11 Tue Jul 18 22:44:05 CST 2006
用HH提供的HHBF531-R1-v1.0.0-060718.tgz这个压缩包里的工具.编译了里面的Hello world程序HHBF531-R1/uClinux-dist/user/hello
编译好以后可以在目标板上运行(通过NFS). 然后再编译里头的gdbserver
/mnt是NFS mount上去的目录

HHBF531>-# /mnt/gdbserver localhost:3652 /mnt/hello
PROCESS /mnt/hello created; pid = 515
code at 0x27ff50 - (nil), data at 0x27ff48

[root@localhost hello]# bfin-uclinux-gdb hello.gdb
GNU gdb 6.3.50_2004-11-25-cvs
COPYRIGHT 2004 Free SOFTWARE Foundation, Inc.
GDB is free SOFTWARE, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=bfin-uclinux"...
(gdb) target remote 192.168.0.103:3652
Remote debugging using 192.168.0.103:3652
0x00000000 in ?? ()
(gdb) b main
Function Prologue not recognised. pc will point to ENTRY_POINT of the function
Breakpoint 1 at 0x280056: file hello.c, LINE 9.
(gdb) b 10
Note: breakpoint 1 also set at pc 0x280068.
Breakpoint 2 at 0x280068: file hello.c, LINE 10.
(gdb) step
Cannot find bounds of current function
(gdb) next
Cannot find bounds of current function
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) n
Program not restarted.
(gdb) c
Continuing.

Program exited normally.

板上的提示信息是:
Remote debugging using localhost:3652
hello world

Child exited with retcode = 0

Child exited with status 0
GDBserver exiting


为什么它会运行到底,不停下来????????不是已经设了断点了吗?难道不是这么设断点?

我在hello.c里加了几行,所以LINE 9是在main函数的函数体内的.

who can tell me why???

不会是代码已经在cache里,GDB无法插入调试信息???
这个玩笑开在大了吧.

4楼: >>参与讨论
用头撞地球
RE
谢谢,终于晓得在线GDB调试的方法了

真太不错了。今天晚上就试一下,看看好不好用............

* - 本贴最后修改时间:2006-9-21 9:35:07 修改者:用头撞地球

5楼: >>参与讨论
用头撞地球
RE
 楼主,我前几天调试了,但是跟目标板建立不起来连接,请问这是您亲自测试的吗,我在华恒的实验例程上也没找到这样的“在线”调试技术说明啊!急切求问中..........

6楼: >>参与讨论
lemys
楼上什么开发板?
具体型号和使用软件?
BF531的话你楼上的那位兄弟telnetchen 估计已经成功了。

参与讨论
昵称:
讨论内容:
 
 
相关帖子
只讨论DSP吗?aduc848之类的东东不讨论了?
weixiao11,您好!
第一步是如何DIY个并口 JTAG,第二步。。。
HHBF531开发板在visual dsp环境如何下载程序
uclinux 程序下载问题
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号