GDBstub的剖析与改进_第1页
GDBstub的剖析与改进_第2页
GDBstub的剖析与改进_第3页
GDBstub的剖析与改进_第4页
全文预览已结束

下载本文档

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

文档简介

1、GDBstub的剖析与改进黄红燕,史 烈 时间:2008年05月27日 字 体: 大 中 小关键词:摘要:关键词: 远程调试 stub GDBserver KGDB 嵌入式系统调试1 RSP协议GDB RSP(Remote Serial Protocol)定义了GDB宿主机与被调试目标机进行通信时数据包的格式。信息的格式是:数据#校验码。多数信息使用ASCII码,数据由一系列的ASCII码组成,校验码是由两个16进制数组成的单字节校验码。接收方接收数据并校验,若正确则回应“”,否则回应“”。通信的内容包括读写数据、控制程序运行、报告程序状态等命令。RSP的基本命令从通信对话角度可以分为两种:(

2、1)请求?:读当前系统状态g:读所有寄存器 Gregister_data:写所有寄存器maddress,length:读内存Maddress,length:memory_data:写内存c:继续执行s:单步执行k:终止进程(2)答复“”:告诉GDB上次请求命令不支持。E:告诉GDB出错OK:上次请求正确 Wexit_status:系统在“exit_status”状态下退出。Xsignal:系统在signal信号下终止。Ssignal:系统在signal信号下停止。O:告诉GDB控制台输出,这也是惟一向GDB发出的命令。2 GDB远程调试功能调试内核时通常还没有文件系统,而且多数嵌入式系统由于自

3、身资源的限制不具备文件系统,因此将与文件系统有关的源文件、目标文件及符号表都存放在主机上,由主机上的调试器处理。同样,调试用的输入输出设备也是由主机提供。主机上的调试器接收用户输入的调试命令并进行预处理,对于某些命令(如breakpoint)的处理在主机GDB上实现,不需要与目标机通信。当然,更多的指令需要在目标机调试代理上实现。主机根据RSP对预处理之后的命令进行封装,发送给目标机上的调试代理,调试代理接收命令后作相应的处理,并返回信息给主机上的调试器。3 目标机上stub的实现目标机上stub的基本功能是与主机GDB通信,实现读写内存、寄存器,stop、continue指令。主机GDB与目

4、标机上stub通信的通用模型如图2。目标机与主机通过硬件连接,被调试部分插入stub,GDB与被调试部分通过RSP通信。根据stub所处层的不同实现不同层的调试,包括内核层、应用层的调试。3.1 内核层调试模型内核层调试模型如图3,将stub插入到内核可以实现内核的调试。Linux内核调试机制KGDB就是使用这种模式。KGDB可以分为初始化模块和控制模块。控制模块与主机GDB通信的具体流程如图4。KGDB只调试内核态程序。handle_exception函数首先判断CPU是否处于VM86模式或用户态,若是则返回;然后接收GDB发来的信息,根据接收的信息作出相应的操作和回复。流程图内的虚线框是所

5、有GDBstub中handle_exception函数的通用流程。3.2 应用程序调试模型在嵌入式Linux开发领域中调试应用程序常用调试代理工具GDBserver。其工作原理不是在被调试应用程序内编译stub,而是把被调试程序作为GDBserver的子进程,这样GDBserver可以利用内核提供的代码跟踪机制(ptrace)监控被调试进程的运行,从而完成调试任务。此工作原理与GDB本地调试相似。其调试模型如图5。GDBserver的工作流程是:GDBserver创建子进程绑定跟踪ptrace(ptrace_traceme,)从主机传来的各种调试命令通过GDBserver转化为各种操作需求的p

6、trace。如果用GDBserver进行远程调试,需要内核操作系统的支持,包括子进程、代码跟踪机制,这样其他嵌入式系统内核工作量会较大。而且ptrace也有其局限性,例如只能跟踪子进程,在调试进程与被调试进程之间传送一个长字的数据。使用通用的调试模式工作量会更小。如图6,在应用程序中编译stub,并在应用程序入口处插入断点,程序开始将控制权交给GDB,之后的流程与内核层调试类似。4 不修改内核前提下调试应用程序GDB设置断点的方式是使用内存的读写,即将原指令用一个trap指令代替,使程序执行到该指令时产生单步调试中断,然后进入异常处理函数,针对调试器的各种操作处理函数作出相应的操作。不同的系统

7、提供不同的调试异常指令,如int3、trap2等。为了使用硬件平台提供的断点指令实现GDBstub调试功能,需要改写这些指令异常处理函数。因此一般的调试系统器或调试代理都要涉及单步调试指令的处理函数,需要系统内核的支持。上面提到的KGDB修改了异常处理函数,GDBserver需要系统内核提供ptrace函数。这种方法存在一些不足:修改内核工作量大,移植性差。针对这些情况可以采用另一种断点实现方案:在stub中定义一个设置断点函数。断点函数模拟调试异常指令,保护现场、调用异常处理函数、恢复现场并将控制权交给被调试程序。断点函数的基本流程如下。#define BREAKPOINT _asm_ _v

8、olatile_(bl ent_exceptionn)void debug_trap( ) _asm_ _volatile_(ent_exception: n保存现场bl handle_exception nout_exception: n恢复现场);handle_exception( )流程类似图4中的虚线框部分,实现的关键是断点指令的替换。断点设置时,从GDB传来硬件平台提供的断点异常指令的二进制码,必须将此二进制码替换成stub中新定义的BREAKPOINT二进制码,才能进入调试异常处理函数。因此在handle_exception( )中,如果收到的请求是“M”,则需要处理数据,流程如图7。这种方法理论上在内核调试和应用程序调试中都可以使用,但在应用程序的调试中优点更明显。在写stub时不涉及内核,在调试应用程序时不需切换到内核模式下,直接在用户模式中即可完成。此方法也存在不足之处。为了实现现场保护,要求用户了解系统内的寄存器。随着stub本身复杂度的增加,其正确性需要更多的检验。加stub的远程调试方法方便而有效,而且可以降低项目成本,在实际工作中得到广泛的应用。在不修改内核前提

温馨提示

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

评论

0/150

提交评论