一种反向调试方法、装置及调试器的制造方法

文档序号:9865389阅读:181来源:国知局
一种反向调试方法、装置及调试器的制造方法
【技术领域】
[0001] 本发明设及调试领域,尤其设及一种反向调试方法、装置及调试器。
【背景技术】
[0002] 调试往往是一个猜测的过程需要对怀疑的代码重复分析,一般不太可能第一次就 将断点放在最合适的位置。比如我们经常会发现重要的代码已经错过或者在运行到断点之 前程序的某些状态已经不正确了,通常我们只能退出调试并重新启动新的调试从头再来, 调试效率比较低。
[0003] 假如有反向调试功能,在运种情况下我们无需重新启动调试只要简单的让被调程 序反向执行到我们怀疑的地方,排查完后我们还可W继续正向执行调试。运无疑将极大的 提高了调试效率。
[0004] 标准g化从7. 0版本开始支持反向调试(reverse debug)新特性,运个新功能允 许用户无需重新启动调试就可对目标代码来回调试,就像我们在学习英语的时候使用复读 机一样将听不懂的部分重放和分析。
[0005] 它的基本原理为:调试器将程序执行的每一条指令细节录制下来,当需要回退时 根据记录对每一条指令的操作进行恢复,从而将程序恢复到当时的状态。比如某条指令将 寄存器regl的值加了 1那么undo就是将其减1。反向调试过程就象我们熟悉的普通调试 过程一样,只是需要使用相应的反向调试控制命令而已。需要说明的是,目前只支持恢复程 序对内存和寄存器的操作而对文件或终端的操作则无法恢复。
[0006] 标准g化是在同步模式的框架下来实现运种功能的,在运种模式下除非被调程序 处于停止状态否则调试器是不能接收和处理用户的任何调试命令。
[0007] g化调试器子系统调试器部分按照功能对模块进行分解,然后在每个模块内部细 化功能为每个功能单元。模块划分为调试控制模块g化和调试代理模块站bserver两部 分: 阳00引调试控制模块g化:
[0009] g化主要功能为接收用户输入的调试命令并对目标端进行调试控制,对代理模块 返回的调试事件进行解析。
[0010] 调试代理模块gdbserver : 阳011] g化server主要功能为接受g化发送的调试命令,并主动向g化返回调试事件; g化server W同步模型为基础,同时监控g化调试命令和被跟踪任务的状态事件。
[0012] gdb-gdbserver同步框架基本流程:
[0013] 步骤A. g化解析用户输入的调试命令然后向站bserver发送相应的命令让程序运 行起来,然后等待站bserver调试事件上报。由于g化一直在同步等待站bserver上报事 件,因此在此过程中g化无法接收用户输入。 阳014] 步骤B. g化server收到g化的调试命令然后执行完相应调试动作或者触发事件 (收到信号或撞断点等)上报站b。
[0015] 步骤C.如果被调程序发生事件由站bserver上报,g化收到该事件处理后才能再 次接收用户输入命令,如果不是停止事件仍然不能接收用户输入。
[0016] 同步模式下反向调试的录制流程:
[0017] 步骤A.开始录制,g化将用户下发的所有调试控制命令比如继续运行命令,源代 码单步,返回等全部转换为指令单步。 阳018] 步骤B. g化server控制程序完成一次指令单步后将单步完成事件上报给站b,g化 对该指令进行反汇编分析看运条指令完成了哪些操作并把运些操作记录到一个log链表 中去。
[0019] 步骤C.完成了录制之后g化才开始处理事件流程,看当前是否撞断点或当前pc 已经满足本次运行的边界条件,如果是的话就停止下发指令单步操作然后上报用户如果不 是则继续走单步。在同步模式下,g化不需要退回到事件处理循环去感知和获取站bserver 上报调试事件。
[0020] 指令录制帖的结构如图1所示。图中的instl表示第一条指令的录制帖,该指令 对内存和寄存器都进行了操作,因此在本帖分别用mem entry和reg entry记录了运条指 令对内存和寄存器的写操作的详细信息,比如被修改内存的地址和值或被修改寄存器的编 号和值等,end entry表示运条录制帖的结束。同理,inst2表示第二条指令录制帖,它也对 内存和寄存器都有操作;而inst3表示第Ξ条指令录制帖,运条指令只对寄存器有操作因 此没有mem endy ;而那些对内存或寄存器没有写操作的指令,比如分支延迟槽指令,其录 制帖只有end entry 此类推,调试器将录制范围内的所有指令都按照运种格式记录下来 并用每个指令的录制帖为节点的双向链表保存,在指令回放时使用运些数据。
[0021] 同步模式下的录制流程如图2所示。其中,从步骤203到步骤211的箭头表示 g化处于发送单步命令的状态时向站bserver发送指令单步,使得站bserver从命令等待 步骤进入处理命令发送事件步骤来处理该指令单步。从步骤212到步骤204的箭头表示 g化server处于处理命令发送事件步骤时,将处理完成该指令单步的事件上报给站b。
[0022] 同步模式下反向调试的回放流程: 阳023] 步骤A.用户输入反向执行命令(如反向执行,返回,单步)g化从录制log链表中 读取上一条指令记录信息并解析然后通知代理模块对寄存器或内存执行反向操作。
[0024] 步骤B.每执行一条反向操作g化将其视为一个调试事件发生,进入事件处理流 程,如果当前pc已经满足本次操作边界条件g化就停止反向运行操作,并上报用户。
[00巧]由于同步模式的调试不允许调试器在程序运行时处理用户命令,用户体验较差, 因此有些调试器采用异步模式框架。异步框架的基本流程:
[00%] 步骤A.控制模块命令代理模块让程序运行起来,然后等待代理模块上报程序调 试事件上报,在运个过程中控制模块退回到事件/命令等待流程因此仍然可W接收和处理 用户命令。
[0027] 步骤B.代理模块收到命令完成相应调试工作后通知控制模块当前有事件发生。
[0028] 步骤C.控制模块得知有调试事件发生向代理模块查询事件然后代理模块将事件 上报给控制模块。
[0029] 步骤化控制模块处理事件。
[0030] 在目前的调试器中还没有在异步模式下可进行反向调试的实现。

【发明内容】

[0031] 本发明实施例的目的是提供一种反向调试方法、装置及调试器,使得反向调试在 异步调试模式下也能够实现。
[0032] 为解决上述技术问题,本发明实施例提供方案如下:
[0033] 本发明实施例提供一种反向调试方法,用于一控制模块,包括:
[0034] 在向一代理模块发送一单步指令之后,接收一事件或命令发生通知,所述单步指 令由所述控制模块根据用户输入的调试控制命令确定;
[0035] 判断所述事件或命令发生通知是针对事件还是命令,获取一第一判断结果;
[0036] 当所述第一判断结果为所述事件或命令发生通知针对命令时,解析所述用户命 令,获得所述事件或命令发生通知针对的第一命令;W及处理所述第一命令;
[0037] 当所述第一判断结果为所述事件或命令发生通知针对事件时,从所述代理模块获 取所述事件或命令发生通知针对的所述单步指令的完成事件;W及处理所述完成事件。
[0038] 优选地,所述处理所述第一命令包括:
[0039] 判断所述第一命令是否是指令单步,获取一第二判断结果;
[0040] 当所述第二判断结果为所述第一命令是指令单步时,向所述代理模块发送所述第 一命令,使得所述代理模块能够对所述第一命令进行处理;
[0041] 当所述第二判断结果为所述第一命令不是指令单步时,将所述第一命令转换为指 令单步命令,W及向所述代理模块发送所述指令单步命令,使得所述代理模块能够对所述 指令单步命令进行处理。
[0042] 优选地,所述从所述代理模块获取所述事件或命令发生通知针对的所述单步指令 的完成事件包括:
[0043] 向所述代理模块查询所述事件或命令发生通知针对的事件;
[0044] 接收所述代理模块响应的所述所述单步指令的完成事件;
[0045] 所述处理所
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1