当前位置: 首页 > news >正文

GDB远程调试的实现

以前在安裝gdbserver的过程中出现了很多问题,导致导致实验没有成功。今天有搜到一些资料,并重新做了一遍,基本上算是成功了。虽然对当中的一些问题还是没搞很明白,但是还是记录下来,以备后用。

远程调试环境由宿主机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。

一、编译安装gdb+gdbserver
下载到某个目 录,我下载到自己的用户目录:/home/may。
下载完后,进入/home/may目录,配置编译步骤如下:


     

在这一步中出现问题:make CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc

问题:


 
 
 

 

 

这样做之后,再执行上述命令,就没有错误了。运行完上述命令,就会在gdbserver目录下生成gdbserver可执行文件,把它烧写到flash的根文件系统分区,或通过nfs mount的方式复制到你的开发板上就可以了。只要保证gdbserver能在开发板上运行就行。我是使用nfs mount的方式,在开发板上挂载宿主机的目录,并将生成的可执行文件gdbserver拷贝到宿主机上的共享目录中,以使其在目标板上可见。如:

mount -o nolock -t nfs 192.168.0.167:/mnt/nfs /mnt

192.168.0.167是宿主机的IP。当然,在使用这种方式时要启动nfs服务。

二、调试步骤

接下面就可以用gdb+gdbserver调试我们开发板上的程序了。在目标板上运行 gdbserver,其实就是在宿主机的minicom下。从上一步mount目录的过程中看出,我将应用程序(hello.c)和gdbserver都拷贝到宿主机的/mnt/nfs目录下了,从而在目标板的/mnt目录可以看到他们(当然你可以将他们再拷到目标板的其他位置),并对其进行操作。

   1、在宿主机上进行交叉编译,带参数-g加入调试信息。
    假设要调试的程序为hello.c。
    #arm-linux-gcc -g hello.c -o hello

   2、在目标板上开启gdbserver
       #gdbserver <host-ip>:2345 hello
        gdbserver开始监听2345端口(你也可以设其他的值),然后启动hello,你会看到“Process hello created:pid=88”

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

192.168.0.167为宿主机IP,在目标系统的2345端口开启了一个调试进程,hello为要调试的程序(主义编译时要加上-g选项)。

在这一步出现问题,./gdbserver: error while loading shared libraries: cannot open shared object...

板子的lib库中缺少一个文件libthread_db.so.1。根据网上查到的解决办法:将宿主机上的交叉编译工具中的lib库中的copy一个过来。于是乎我将/usr/local/arm/2.95.3/arm-linux/lib/libthread_db.so.1文件拷贝到目标板的/lib中后错误消失,并出现提示:

出现提示:

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

注意:
建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r”。因为程序已经在Target Board上面由gdbserver启动了。结果输出是在Target Board端,用超级终端查看。

仍然存在的问题:
在远程调试一个程序时, pc端输入回馈如下:
(gdb) list
No symbol table is loaded.   Use the "file" command.
(gdb) step
Cannot find bounds of current function
(gdb) info program
Debugging a target over a serial line.
Program stopped at 0x14000.
It stopped with signal SIGTRAP, Trace/breakpoint trap.
(gdb) info thread
   1 thread 769   0x00014000 in ?? ()
warning: GDB can't find the start of the function at 0x14000.
(gdb) info stack
#0   0x00014000 in ?? ()

输入continue可以跑,
输入break的情况和下list是一样的.
也就是说,还是还不能正常对arm板上的应用程序进行调试。(但是在第二天,再次用带-g选项的交叉编译器编译了源程序后,可以成功进行远程调试了;不知道到底是为什么,嵌入式里面的很多东西我还不懂,但是在做的过程中,可真是痛苦阿!)


参考文档:http://blog.chinaunix.net/u/22630/showart_298299.html
                http://www.minigui.org/cgi-bin/lb5000/topic.cgi?forum=6&topic=6279
                http://szricky.blog.hexun.com/8886993_d.html
                http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!268.entry

转载于:https://www.cnblogs.com/papam/archive/2009/08/31/1557595.html

相关文章:

  • 缘何中国光大银行选择华为FusionCube构建融合架构资源池?
  • CCNA系列路由之   动态路由RIP
  • Android 通过触摸动态地在屏幕上画矩形
  • 逻辑学概论笔记
  • 强烈推荐:240多个jQuery插件
  • Linux命令 -- source(点命令)
  • 关于数据库导入出错的问题
  • 一次C语言实现字符排序出现的问题
  • maven多模块搭建
  • vs2005 调试时出现“无法附加。绑定句柄无效”的解决办法
  • 正在考虑用Scala语言来实现TTCN-3的功能
  • ICMP协议
  • 组建简单的IPv6网络
  • 单点登录 - CAS退出登录后跳转到指定页面
  • Active Directory的脱机碎片整理,Active Directory系列之七
  • 30秒的PHP代码片段(1)数组 - Array
  • E-HPC支持多队列管理和自动伸缩
  • Facebook AccountKit 接入的坑点
  • gitlab-ci配置详解(一)
  • idea + plantuml 画流程图
  • nodejs调试方法
  • Theano - 导数
  • 阿里云前端周刊 - 第 26 期
  • 百度小程序遇到的问题
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 译自由幺半群
  • 正则与JS中的正则
  • 智能合约开发环境搭建及Hello World合约
  • 仓管云——企业云erp功能有哪些?
  • ​flutter 代码混淆
  • #每天一道面试题# 什么是MySQL的回表查询
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (C语言)二分查找 超详细
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十)c52学习之旅-定时器实验
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)fock函数详解
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .gitignore文件_Git:.gitignore
  • .Net 6.0 处理跨域的方式
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • @property括号内属性讲解
  • @Transactional 详解
  • [ C++ ] STL---string类的使用指南
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [20171101]rman to destination.txt
  • [AIGC] Spring Interceptor 拦截器详解
  • [Android Pro] Notification的使用
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [C#]DataTable常用操作总结【转】
  • [C++]高精度 bign (重载运算符版本)