Gdb+gdbserver嵌入式目标板的调试_第1页
Gdb+gdbserver嵌入式目标板的调试_第2页
Gdb+gdbserver嵌入式目标板的调试_第3页
Gdb+gdbserver嵌入式目标板的调试_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Gdb+gdbserver嵌入式目标板的调试简介远程调试环境由宿主机gdb和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROMMonitor调试目标机程序、用KGDB调试系统内核用gdbserver调试用户空间程序。这三种调试方法的区别主要在于,目标机远程调试stub的存在形式的不同,而其设计思路和实现方法则是大致相同的。而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。Gdbserver在目标系统中运行,gdb则在宿主机上运行。目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序。一般linux发行版中都有一个可以运行的gdb,但开发人员不能直接使用该发行版中的gdb来做远程调试,而要获取gdb的源代码包,针对arm平台作一个简单配置,重新编译得到相应gdb如armv4l-unknown-linux-gdb。环境如下:HOST01Target:00NFS共享目录:/opt/target编译arm-gdb下载gdb源代码:网址:/gnu/gdb/gdb-7.0.1.tar.gz[root@localhost~]#cd/usr/local/[root@localhost~]#gunzipgdb-7.0.1.tar.gz[root@localhost~]#tarzxvfgdb-7.0.1.tar[root@localhost~]#cdgdb-7.0.1[root@localhost~]#./configure--target=arm-linux--prefix=/usr/local/arm-gdb-v[root@localhost~]#make[root@localhost~]#makeinstall[root@localhost~]#exportPATH=$PATH:/usr/local/arm-gdb编译arm-gdb-server[root@localhost~]#cd/usr/local/gdb-7.0.1/gdb/gdbserver[root@localhost~]#./configure--target=arm-linux--host=arm-linux[root@localhost~]#makeCC=/opt/pro_5.0/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-gcc##这里是交叉编译器的路径[root@localhost~]#cpgdbserver/opt/target/opt/dsplink##gdbserver是编译生成的路径是目标板通过nfs方式挂载的文件目录。[root@localhost~]#exportPATH=$PATH:/usr/local/arm-gdb/bin最好加到.bashrc中)在编译的过程中,会抛出一个错误sys/reg.h文件找不到。解决方法:打开/usr/local/gdb-7.0.1/gdb/gdbserver/linux-arm-low.c#ifdefHAVE_SYS_REG_H//#include<sys/reg.h>〃这样把这一行注释掉#endifreg.h该文件定义的寄存器信息都是针对x86平台的,对于运行在arm平台上的gdbserver而言完全就是画蛇添足,因此在这里编译的过程中要直接将它去掉。注意,在configure脚本执行完毕之后,将会生成config.h文件,在这个文件中定义了相应的宏定义,gdbserver的源代码中将根据这些宏定义时候定义来决定时候包含相应的头文件。在config.h中:#defineHAVE_SYS_REH_H1将此行注释掉即可。/*#defineHAVE_SYS_REH_H1*/完毕!拷贝libthread库这一步骤实际上没有做,在opt/target/opt/dsplink目录下存在这几个库(这一步不做的话,运行gdbserver会出错!)。$cd/usr/local/arm/3.4.1/arm-linux/lib//交叉编译器库的位置$ls-llibthread_db*-rwxr-xr-x12619man291512004-07-2823:08libthread_db-1.0.solrwxrwxrwx12619man172008-05-2512:00libthread_db.so->libthread_db.so.1lrwxrwxrwx12619man192008-05-2512:00libthread_db.so.1->libthread_db-1.0.so$cplibthread_db-1.0.so/opt/target/opt/dsplinkminicom下:root@00:~#cd/lib/root@00:~#cp/交叉编译器库的路径/libthread_db-1.0.so/lib/root@00:~#ln-slibthread_db-1.0.solibthread_db.so.1root@00:~#ln-slibthread_db-1.0.solibthread_db.so4测试以上的环境变量都写到〜/.profile中吧写一个程序,用arm_v5t_le-gcc-g编译,放到work目录下,(我的为opt/target/opt/dsplink)minicom下:root@00:~#cd/opt/dsplinkroot@00:~#./gdbserver00:2345lianggpp//目标板target的ip,端口号Processlianggppcreated;pid=981Listeningonport2345Remotedebuggingfromhost00Killingallinferiors终端下:[root@localhost~]#exportPATH=$PATH:/usr/local/arm-gdb/bin[root@localhost~]#cd/opt/target/opt/dsplink[root@localhost~]#arm-linux-gdblianggppGNUgdb(GDB)7.0.1Copyright(C)2009FreeSoftwareFoundation,Inc.LicenseGPLv3+:GNUGPLversion3orlater</licenses/gpl.html>Thisisfreesoftware:youarefreetochangeandredistributeit.ThereisNOWARRANTY,totheextentpermittedbylaw.Type"showcopying"and"showwarranty"fordetails.ThisGDBwasconfiguredas"--host=i686-pc-linux-gnu--target=arm-linux".Forbugreportinginstructions,pleasesee:</software/gdb/bugs/>...Readingsymbolsfrom/opt/target/opt/dsplink/lianggpp...done.(gdb)targetremote00:2345Remotedebuggingusing00:2345warning:Unabletofinddynamiclinkerbreakpointfunction.GDBwillbeunabletodebugsharedlibraryinitializersandtrackexplicitlyloadeddynamiccode.0x400007a0in??()(gdb)输入:(gdb)targetremote00:2345##(连接目标target的ip)Remotedebuggingusing00:23450x40000dd0in??()from/lib/ld-linux.so.2(gdb)setsolib-absolute-prefix/opt/target/(gdb)setsolib-search-path/opt/target/现在可以通过l,b设置断点了运行:用命令c##记住这里不是用run,因为程序已在TargetBoard上面由gdbserver启动了。结果输出是在TargetBoard端。说明:1)目标机上的被调试程序hello,与主机上的程序hello,是相同的程序,但位置不一样,并非是用网络共享的同一个位置的同一个文件,一个在目标机上,一个在主机上,没有关系.2)hostip:01targetOMAPL137ipis00都是局域网ip.编写了一段测试程序:test.c//#include<stdio.h>intmain(){inti=32;char*temp='a';//printf("iis%d\n",i);//printf("*tempis%d\n”,*temp);//printf("tempis0x%x”,temp);return0;}不能用gcc进行编译,虽然能通过,但在目标板上不能运行。要用arm_v5t_le-gcc编译。[root@localhost~]#cd/opt/target/opt/dsplilnk[root@

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论