CN105630664B - 一种反向调试方法、装置及调试器 - Google Patents
一种反向调试方法、装置及调试器 Download PDFInfo
- Publication number
- CN105630664B CN105630664B CN201410621460.6A CN201410621460A CN105630664B CN 105630664 B CN105630664 B CN 105630664B CN 201410621460 A CN201410621460 A CN 201410621460A CN 105630664 B CN105630664 B CN 105630664B
- Authority
- CN
- China
- Prior art keywords
- command
- event
- instruction
- module
- occurrence notification
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例提供一种反向调试方法、装置及调试器。所述方法包括:在向一代理模块发送一单步指令之后,接收一事件或命令发生通知,所述单步指令由所述控制模块根据用户输入的调试控制命令确定;判断所述事件或命令发生通知是针对事件还是命令,获取一第一判断结果;当所述第一判断结果为所述事件或命令发生通知针对命令时,解析所述用户命令,获得所述事件或命令发生通知针对的第一命令;以及处理所述第一命令;当所述第一判断结果为所述事件或命令发生通知针对事件时,从所述代理模块获取所述事件或命令发生通知针对的所述单步指令的完成事件;以及处理所述完成事件。本发明实施例实现了异步调试模式下的反向调试。
Description
技术领域
本发明涉及调试领域,尤其涉及一种反向调试方法、装置及调试器。
背景技术
调试往往是一个猜测的过程需要对怀疑的代码重复分析,一般不太可能第一次就将断点放在最合适的位置。比如我们经常会发现重要的代码已经错过或者在运行到断点之前程序的某些状态已经不正确了,通常我们只能退出调试并重新启动新的调试从头再来,调试效率比较低。
假如有反向调试功能,在这种情况下我们无需重新启动调试只要简单的让被调程序反向执行到我们怀疑的地方,排查完后我们还可以继续正向执行调试。这无疑将极大的提高了调试效率。
标准gdb从7.0版本开始支持反向调试(reverse debug)新特性,这个新功能允许用户无需重新启动调试就可对目标代码来回调试,就像我们在学习英语的时候使用复读机一样将听不懂的部分重放和分析。
它的基本原理为:调试器将程序执行的每一条指令细节录制下来,当需要回退时根据记录对每一条指令的操作进行恢复,从而将程序恢复到当时的状态。比如某条指令将寄存器reg1的值加了1那么undo就是将其减1。反向调试过程就象我们熟悉的普通调试过程一样,只是需要使用相应的反向调试控制命令而已。需要说明的是,目前只支持恢复程序对内存和寄存器的操作而对文件或终端的操作则无法恢复。
标准gdb是在同步模式的框架下来实现这种功能的,在这种模式下除非被调程序处于停止状态否则调试器是不能接收和处理用户的任何调试命令。
gdb调试器子***调试器部分按照功能对模块进行分解,然后在每个模块内部细化功能为每个功能单元。模块划分为调试控制模块gdb和调试代理模块gdbserver两部分:
调试控制模块gdb:
gdb主要功能为接收用户输入的调试命令并对目标端进行调试控制,对代理模块返回的调试事件进行解析。
调试代理模块gdbserver:
gdbserver主要功能为接受gdb发送的调试命令,并主动向gdb返回调试事件;gdbserver以同步模型为基础,同时监控gdb调试命令和被跟踪任务的状态事件。
gdb-gdbserver同步框架基本流程:
步骤A.gdb解析用户输入的调试命令然后向gdbserver发送相应的命令让程序运行起来,然后等待gdbserver调试事件上报。由于gdb一直在同步等待gdbserver上报事件,因此在此过程中gdb无法接收用户输入。
步骤B.gdbserver收到gdb的调试命令然后执行完相应调试动作或者触发事件(收到信号或撞断点等)上报gdb。
步骤C.如果被调程序发生事件由gdbserver上报,gdb收到该事件处理后才能再次接收用户输入命令,如果不是停止事件仍然不能接收用户输入。
同步模式下反向调试的录制流程:
步骤A.开始录制,gdb将用户下发的所有调试控制命令比如继续运行命令,源代码单步,返回等全部转换为指令单步。
步骤B.gdbserver控制程序完成一次指令单步后将单步完成事件上报给gdb,gdb对该指令进行反汇编分析看这条指令完成了哪些操作并把这些操作记录到一个log链表中去。
步骤C.完成了录制之后gdb才开始处理事件流程,看当前是否撞断点或当前pc已经满足本次运行的边界条件,如果是的话就停止下发指令单步操作然后上报用户如果不是则继续走单步。在同步模式下,gdb不需要退回到事件处理循环去感知和获取gdbserver上报调试事件。
指令录制帧的结构如图1所示。图中的inst1表示第一条指令的录制帧,该指令对内存和寄存器都进行了操作,因此在本帧分别用mem entry和reg entry记录了这条指令对内存和寄存器的写操作的详细信息,比如被修改内存的地址和值或被修改寄存器的编号和值等,end entry表示这条录制帧的结束。同理,inst2表示第二条指令录制帧,它也对内存和寄存器都有操作;而inst3表示第三条指令录制帧,这条指令只对寄存器有操作因此没有mem enrty;而那些对内存或寄存器没有写操作的指令,比如分支延迟槽指令,其录制帧只有end entry;以此类推,调试器将录制范围内的所有指令都按照这种格式记录下来并用每个指令的录制帧为节点的双向链表保存,在指令回放时使用这些数据。
同步模式下的录制流程如图2所示。其中,从步骤203到步骤211的箭头表示gdb处于发送单步命令的状态时向gdbserver发送指令单步,使得gdbserver从命令等待步骤进入处理命令发送事件步骤来处理该指令单步。从步骤212到步骤204的箭头表示gdbserver处于处理命令发送事件步骤时,将处理完成该指令单步的事件上报给gdb。
同步模式下反向调试的回放流程:
步骤A.用户输入反向执行命令(如反向执行,返回,单步)gdb从录制log链表中读取上一条指令记录信息并解析然后通知代理模块对寄存器或内存执行反向操作。
步骤B.每执行一条反向操作gdb将其视为一个调试事件发生,进入事件处理流程,如果当前pc已经满足本次操作边界条件gdb就停止反向运行操作,并上报用户。
由于同步模式的调试不允许调试器在程序运行时处理用户命令,用户体验较差,因此有些调试器采用异步模式框架。异步框架的基本流程:
步骤A.控制模块命令代理模块让程序运行起来,然后等待代理模块上报程序调试事件上报,在这个过程中控制模块退回到事件/命令等待流程因此仍然可以接收和处理用户命令。
步骤B.代理模块收到命令完成相应调试工作后通知控制模块当前有事件发生。
步骤C.控制模块得知有调试事件发生向代理模块查询事件然后代理模块将事件上报给控制模块。
步骤D.控制模块处理事件。
在目前的调试器中还没有在异步模式下可进行反向调试的实现。
发明内容
本发明实施例的目的是提供一种反向调试方法、装置及调试器,使得反向调试在异步调试模式下也能够实现。
为解决上述技术问题,本发明实施例提供方案如下:
本发明实施例提供一种反向调试方法,用于一控制模块,包括:
在向一代理模块发送一单步指令之后,接收一事件或命令发生通知,所述单步指令由所述控制模块根据用户输入的调试控制命令确定;
判断所述事件或命令发生通知是针对事件还是命令,获取一第一判断结果;
当所述第一判断结果为所述事件或命令发生通知针对命令时,解析所述用户命令,获得所述事件或命令发生通知针对的第一命令;以及处理所述第一命令;
当所述第一判断结果为所述事件或命令发生通知针对事件时,从所述代理模块获取所述事件或命令发生通知针对的所述单步指令的完成事件;以及处理所述完成事件。
优选地,所述处理所述第一命令包括:
判断所述第一命令是否是指令单步,获取一第二判断结果;
当所述第二判断结果为所述第一命令是指令单步时,向所述代理模块发送所述第一命令,使得所述代理模块能够对所述第一命令进行处理;
当所述第二判断结果为所述第一命令不是指令单步时,将所述第一命令转换为指令单步命令,以及向所述代理模块发送所述指令单步命令,使得所述代理模块能够对所述指令单步命令进行处理。
优选地,所述从所述代理模块获取所述事件或命令发生通知针对的所述单步指令的完成事件包括:
向所述代理模块查询所述事件或命令发生通知针对的事件;
接收所述代理模块响应的所述所述单步指令的完成事件;
所述处理所述完成事件包括:
获取所述代理模块对所述单步指令进行处理的程序运行状态信息;
将所述程序运行状态信息记录到一逻辑存储空间中,所述逻辑存储空间用于所述控制模块根据所述逻辑存储空间记录的所述程序运行状态信息进行指令回放。
优选地,所述程序运行状态信息包括:用于记录所述代理模块根据所述单步指令对内存进行的操作的内存操作记录帧、用于记录所述代理模块根据所述单步指令对寄存器进行的操作的寄存器操作记录帧和所述代理模块完成所述内存操作记录帧和所述寄存器操作记录帧时创建的结束帧。
优选地,所述逻辑存储空间包括链表。
本发明实施例还提供一种反向调试装置,用于一控制模块,包括:
接收模块,用于在向一代理模块发送一单步指令之后,接收一事件或命令发生通知,所述单步指令由所述控制模块根据用户输入的调试控制命令确定;
判断模块,用于判断所述事件或命令发生通知是针对事件还是命令,获取一第一判断结果;
解析及处理模块,用于当所述第一判断结果为所述事件或命令发生通知针对命令时,解析所述用户命令,获得所述事件或命令发生通知针对的第一命令;以及处理所述第一命令;
获取及处理模块,用于当所述第一判断结果为所述事件或命令发生通知针对事件时,从所述代理模块获取所述事件或命令发生通知针对的所述单步指令的完成事件;以及处理所述完成事件。
优选地,所述解析及处理模块包括:
解析单元,用于当所述第一判断结果为所述事件或命令发生通知针对命令时,解析所述用户命令,获得所述事件或命令发生通知针对的第一命令;
判断单元,用于判断所述第一命令是否是指令单步,获取一第二判断结果;
发送单元,用于当所述第二判断结果为所述第一命令是指令单步时,向所述代理模块发送所述第一命令,使得所述代理模块能够对所述第一命令进行处理;
转换及发送单元,用于当所述第二判断结果为所述第一命令不是指令单步时,将所述第一命令转换为指令单步命令,以及向所述代理模块发送所述指令单步命令,使得所述代理模块能够对所述指令单步命令进行处理。
优选地,所述获取及处理模块包括:
查询单元,用于向所述代理模块查询所述事件或命令发生通知针对的事件;
接收单元,用于接收所述代理模块响应的所述所述单步指令的完成事件;
获取单元,用于获取所述代理模块对所述单步指令进行处理的程序运行状态信息;
记录单元,用于将所述程序运行状态信息记录到一逻辑存储空间中,所述逻辑存储空间用于所述控制模块根据所述逻辑存储空间记录的所述程序运行状态信息进行指令回放。
优选地,所述程序运行状态信息包括:用于记录所述代理模块根据所述单步指令对内存进行的操作的内存操作记录帧、用于记录所述代理模块根据所述单步指令对寄存器进行的操作的寄存器操作记录帧和所述代理模块完成所述内存操作记录帧和所述寄存器操作记录帧时创建的结束帧。
优选地,所述逻辑存储空间包括链表。
本发明实施例还提供一种包括以上所述的反向调试装置的调试器。
从以上所述可以看出,本发明实施例至少具有如下有益效果:
通过接收一事件或命令发生通知,判断所述事件或命令发生通知是针对事件还是命令,根据判断结果的不同做不同处理,从而实现了异步调试模式下的反向调试。
附图说明
图1表示指令录制帧的结构图;
图2表示同步模式下的录制流程图;
图3表示本发明实施例提供的一种反向调试方法的步骤流程图;
图4表示异步模式下的录制流程图;
图5表示回放过程流程图;
图6表示本发明实施例提供的一种反向调试装置的结构框图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明实施例进行详细描述。
图3表示本发明实施例提供的一种反向调试方法的步骤流程图,参照图3,发明实施例提供一种反向调试方法,包括如下步骤:
步骤301,在向一代理模块发送一单步指令之后,接收一事件或命令发生通知,所述单步指令由所述控制模块根据用户输入的调试控制命令确定;
步骤302,判断所述事件或命令发生通知是针对事件还是命令,获取一第一判断结果;
步骤303,当所述第一判断结果为所述事件或命令发生通知针对命令时,解析所述用户命令,获得所述事件或命令发生通知针对的第一命令;以及处理所述第一命令;
步骤304,当所述第一判断结果为所述事件或命令发生通知针对事件时,从所述代理模块获取所述事件或命令发生通知针对的所述单步指令的完成事件;以及处理所述完成事件。
所述方法用于一控制模块。
可见,通过上述方式,通过接收一事件或命令发生通知,判断所述事件或命令发生通知是针对事件还是命令,根据判断结果的不同做不同处理,从而实现了异步调试模式下的反向调试。
其中,所述逻辑存储空间例如:包括链表。
本发明实施例中,所述处理所述第一命令可以包括:
判断所述第一命令是否是指令单步,获取一第二判断结果;
当所述第二判断结果为所述第一命令是指令单步时,向所述代理模块发送所述第一命令,使得所述代理模块能够对所述第一命令进行处理;
当所述第二判断结果为所述第一命令不是指令单步时,将所述第一命令转换为指令单步命令,以及向所述代理模块发送所述指令单步命令,使得所述代理模块能够对所述指令单步命令进行处理。
本发明实施例中,所述从所述代理模块获取所述事件或命令发生通知针对的所述单步指令的完成事件可以包括:
向所述代理模块查询所述事件或命令发生通知针对的事件;
接收所述代理模块响应的所述所述单步指令的完成事件;
所述处理所述完成事件包括:
获取所述代理模块对所述单步指令进行处理的程序运行状态信息;
将所述程序运行状态信息记录到一逻辑存储空间中,所述逻辑存储空间用于所述控制模块根据所述逻辑存储空间记录的所述程序运行状态信息进行指令回放。
其中,所述程序运行状态信息可包括:用于记录所述代理模块根据所述单步指令对内存进行的操作的内存操作记录帧、用于记录所述代理模块根据所述单步指令对寄存器进行的操作的寄存器操作记录帧和所述代理模块完成所述内存操作记录帧和所述寄存器操作记录帧时创建的结束帧。
本较佳实施方式提供一种异步调试模式下的反向调试方法。本较佳实施方式涉及调试器的实现技术,尤其调试器在异步模式下实现反向调试的方法。具体的说,就是提供一种手段,让调试器能够在异步模式下对被调程序的指令进行录制然后反向执行。如果要在异步模式下实现反向调试,则需要对反向调试模块与异步调试框架进行相应的调整与整合。
本较佳实施方式的目的在于,整合调试器的反向调试模块和异步框架,提供一种反向调试方法。
为达到这一目的,本较佳实施方式涉及以下几方面内容。
(1)运行调试控制
反向调试的前提就是调试器对程序执行的每一条指令进行录制,在录制模式下用户的任何一个运行控制命令最终都是以指令单步的形式来完成的。参照图3,其流程如下:
1.步骤A.用户输入调试控制命令,控制模块解析该命令,如果是继续运行、源代码单步或返回等操作则全部转换为指令单步命令通知代理模块完成一次指令单步操作,然后控制模块进入事件等待和处理循环。
2.步骤B.代理模块完成一次单步后通知控制模块有事件发生。
3.步骤C.控制模块获知有事件发生后查询并获取事件,在处理事件之前对该指令进行录制。
4.步骤D.控制模块处理该单步事件,如果有断点或达到本次操作的边界条件则停止下发单步命令并上报用户,如果没有达到上述调试则继续走单步。
(2)指令录制
由于反向调试无法对文件和终端(如屏幕显示等)进行反向操作,因此指令录制只记录对内存和寄存器的操作。指令录制的功能由控制模块完成,参照图3,基本流程如下:
1.步骤A.如果是第一条指令单步则在恢复程序运行的流程中记录,如果不是就在事件等待流程中记录。和同步模式下不同的是,同步模式可以在事件等待流程的循环中连续走单步并录制而异步模式下必须每录制一条指令就返回事件处理循环否则控制模块将无法收到单步完成事件。
2.步骤B.进入opcode模块对指令进行分析。
3.步骤C.如果该指令有对内存的操作则建立一个内存操作记录帧记录其对内存的操作;如果该指令有对寄存器的操作则建立一个寄存器操作记录帧记录其对寄存器的操作;完成对这条指令的记录后创建一个结束帧。这些记录帧都被加入到控制模块的log链表中。
(3)回放
指令回放,控制模块将从log链表读取每一条指令的记录然后逐条回放。需要说明的是,如果是正向执行且执行范围在已录制的指令范围之内则也将采用回放模式执行。参照图4,基本流程如下:
1.步骤A:检查log链表,如果是反向执行而当前链表指针的前一帧为空则表示已经没有向前的指令记录直接退出回放流程并上报用户;同理如果是正向执行而当前链表指针的后一帧为空则表示没有向后的记录直接退出回放流程且上报。
2.步骤B:从log链表获取一条记录帧,如果是内存记录帧则恢复内存,如果是寄存器记录帧则恢复寄存器。
3.步骤C:如果是反向执行且当帧是本条指令回放的第一个结束帧表示这个结束帧是当前指令的一部分从log链表读取前一帧继续步骤B,如果不是第一个结束帧表示已经是上一条指令的结束帧说明已经完成对当前指令的回放。
4.步骤D:如果是正向执行且当帧是结束帧就结束这条指令回放,否则从log链表去读后一帧继续步骤B。
5.步骤E:结束一条指令的回放并标记一条SIGTRAP事件,然后对这个事件进行处理,在事件处理流程中控制模块如果发现当前pc存在断点或达到本次运行的边界条件就停止回放并上报用户。
图4中,从步骤421向左侧延伸的箭头表示代理模块处于通知事件步骤时,向控制模块发送指令单步处理完成的通知事件,使控制模块来进行关于感知到的是事件还是命令的判断。从步骤402到步骤422的箭头表示控制模块处于事件查询步骤时向代理模块发送查询请求,查询代理模块刚才发送的通知事件所针对的事件。从步骤413到步骤424的箭头表示控制模块处于发送命令步骤时向代理模块发送指令单步,使得代理模块从等待命令步骤进入处理命令状态来处理该指令单步。
<具体实施例>
下面将以中兴通讯中心研究院成都研究所研发的local_zdb用户态命令行调试器为例对这种异步模式调试器支持反向调试进行简要说明。
(1)指令录制
每次执行一条指令控制模块便将关于该指令的操作录制下来,这些信息可以完整地描述一条指令执行的效果,包括两类:对寄存器的操作信息和对内存的操作信息。
一条机器指令如果它修改了内存,那么便记录下被修改内存的地址和值;如果它修改了寄存器,便记录下寄存器的序号和值。这些修改记录由structrecord_entry表示和存储:
多个record_entry通过prev和next连接成record_list链表。一条机器指令可能既修改内存也修改寄存器,因此一条指令的执行效果由record_list中的多个entry组成。有三种entry,表示寄存器的entry,表示memory的entry和标志指令结束的entry。顾名思义,register entry用来记录寄存器的修改情况;memory entry用来记录内存的修改;endentry表示指令结束。
指令记录帧结构由图1表示。
log链表头和链表当前指针分别由该结构体定义的两个全局record_full_list和record_full_first表示。
指令录制和回放都由record_target层来完成,在record模式下它位于target栈的顶层,运行控制流程所有对调试程序的控制首先调用它并在其中完成录制或回放,然后由它来调用async_target异步层对应的运行控制函数对程序作实际上的操作,以下为两层target之间重要的运行控制函数之间的调用对应关系:
record_full_resume->remote_async_resume
record_wait->remote_async_wait
record_full_resume是record_target层的目标恢复运行函数,在录制过程中因为当他执行完成以后pc已经停在下一条指令处因此第一条指针的录制必须在这里完成:
此后的指令录制都在事件等待函数record_full_wait中完成。
(2)指令回放
指令回放也是在record_full_wait函数中完成:
(3)运行控制
所有的正反向的恢复运行,单步,返回等操作都会调用控制模块的proceed函数,由它来调用resume函数并最终由record层的record_full_resume,record_full_wait和异步层的remote_async_resume完成录制和回放,对应的运行控制也在这个流程中完成。
录制时resume函数调用remote_async_resume函数,由他来判断当前是否是录制状态,如果是的话向代理模块下发的所有运行命令都是指令单步:
指令回放时在proceed函数中进入wait_for_inferior(),控制模块在非录制模式下是不会进入这个函数的。这个函数的每一次循环都调用record_full_wait来完成一条指令回放然后调用handle_inferior_event函数处理事件并控制运行:
图6表示本发明实施例提供的一种反向调试装置的结构框图,参照图6,本发明实施例还提供一种反向调试装置,包括:
接收模块601,用于在向一代理模块发送一单步指令之后,接收一事件或命令发生通知,所述单步指令由所述控制模块根据用户输入的调试控制命令确定;
判断模块602,用于判断所述事件或命令发生通知是针对事件还是命令,获取一第一判断结果;
解析及处理模块603,用于当所述第一判断结果为所述事件或命令发生通知针对命令时,解析所述用户命令,获得所述事件或命令发生通知针对的第一命令;以及处理所述第一命令;
获取及处理模块604,用于当所述第一判断结果为所述事件或命令发生通知针对事件时,从所述代理模块获取所述事件或命令发生通知针对的所述单步指令的完成事件;以及处理所述完成事件。
所述装置用于一控制模块。
可见,通过上述方式,通过接收一事件或命令发生通知,判断所述事件或命令发生通知是针对事件还是命令,根据判断结果的不同做不同处理,从而实现了异步调试模式下的反向调试。
其中,所述解析及处理模块603可包括:
解析单元,用于当所述第一判断结果为所述事件或命令发生通知针对命令时,解析所述用户命令,获得所述事件或命令发生通知针对的第一命令;
判断单元,用于判断所述第一命令是否是指令单步,获取一第二判断结果;
发送单元,用于当所述第二判断结果为所述第一命令是指令单步时,向所述代理模块发送所述第一命令,使得所述代理模块能够对所述第一命令进行处理;
转换及发送单元,用于当所述第二判断结果为所述第一命令不是指令单步时,将所述第一命令转换为指令单步命令,以及向所述代理模块发送所述指令单步命令,使得所述代理模块能够对所述指令单步命令进行处理。
所述获取及处理模块604可包括:
查询单元,用于向所述代理模块查询所述事件或命令发生通知针对的事件;
接收单元,用于接收所述代理模块响应的所述所述单步指令的完成事件;
获取单元,用于获取所述代理模块对所述单步指令进行处理的程序运行状态信息;
记录单元,用于将所述程序运行状态信息记录到一逻辑存储空间中,所述逻辑存储空间用于所述控制模块根据所述逻辑存储空间记录的所述程序运行状态信息进行指令回放。
所述程序运行状态信息可包括:用于记录所述代理模块根据所述单步指令对内存进行的操作的内存操作记录帧、用于记录所述代理模块根据所述单步指令对寄存器进行的操作的寄存器操作记录帧和所述代理模块完成所述内存操作记录帧和所述寄存器操作记录帧时创建的结束帧。
所述逻辑存储空间可包括链表。
本发明实施例还提供一种调试器,所述调试器包括以上所述的反向调试装置。
以上所述仅是本发明实施例的实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明实施例原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明实施例的保护范围。
Claims (11)
1.一种反向调试方法,用于一控制模块,其特征在于,包括:
在向一代理模块发送一单步指令之后,接收一事件或命令发生通知,所述单步指令由所述控制模块根据用户输入的调试控制命令确定;
判断所述事件或命令发生通知是针对事件还是命令,获取一第一判断结果;
当所述第一判断结果为所述事件或命令发生通知针对命令时,解析所述用户命令,获得所述事件或命令发生通知针对的第一命令;以及处理所述第一命令;
当所述第一判断结果为所述事件或命令发生通知针对事件时,从所述代理模块获取所述事件或命令发生通知针对的所述单步指令的完成事件;以及处理所述完成事件。
2.根据权利要求1所述的反向调试方法,其特征在于,所述处理所述第一命令包括:
判断所述第一命令是否是指令单步,获取一第二判断结果;
当所述第二判断结果为所述第一命令是指令单步时,向所述代理模块发送所述第一命令,使得所述代理模块能够对所述第一命令进行处理;
当所述第二判断结果为所述第一命令不是指令单步时,将所述第一命令转换为指令单步命令,以及向所述代理模块发送所述指令单步命令,使得所述代理模块能够对所述指令单步命令进行处理。
3.根据权利要求1所述的反向调试方法,其特征在于,所述从所述代理模块获取所述事件或命令发生通知针对的所述单步指令的完成事件包括:
向所述代理模块查询所述事件或命令发生通知针对的事件;
接收所述代理模块响应的所述单步指令的完成事件;
所述处理所述完成事件包括:
获取所述代理模块对所述单步指令进行处理的程序运行状态信息;
将所述程序运行状态信息记录到一逻辑存储空间中,所述逻辑存储空间用于所述控制模块根据所述逻辑存储空间记录的所述程序运行状态信息进行指令回放。
4.根据权利要求3所述的反向调试方法,其特征在于,所述程序运行状态信息包括:用于记录所述代理模块根据所述单步指令对内存进行的操作的内存操作记录帧、用于记录所述代理模块根据所述单步指令对寄存器进行的操作的寄存器操作记录帧和所述代理模块完成所述内存操作记录帧和所述寄存器操作记录帧时创建的结束帧。
5.根据权利要求3所述的反向调试方法,其特征在于,所述逻辑存储空间包括链表。
6.一种反向调试装置,用于一控制模块,其特征在于,包括:
接收模块,用于在向一代理模块发送一单步指令之后,接收一事件或命令发生通知,所述单步指令由所述控制模块根据用户输入的调试控制命令确定;
判断模块,用于判断所述事件或命令发生通知是针对事件还是命令,获取一第一判断结果;
解析及处理模块,用于当所述第一判断结果为所述事件或命令发生通知针对命令时,解析所述用户命令,获得所述事件或命令发生通知针对的第一命令;以及处理所述第一命令;
获取及处理模块,用于当所述第一判断结果为所述事件或命令发生通知针对事件时,从所述代理模块获取所述事件或命令发生通知针对的所述单步指令的完成事件;以及处理所述完成事件。
7.根据权利要求6所述的反向调试装置,其特征在于,所述解析及处理模块包括:
解析单元,用于当所述第一判断结果为所述事件或命令发生通知针对命令时,解析所述用户命令,获得所述事件或命令发生通知针对的第一命令;
判断单元,用于判断所述第一命令是否是指令单步,获取一第二判断结果;
发送单元,用于当所述第二判断结果为所述第一命令是指令单步时,向所述代理模块发送所述第一命令,使得所述代理模块能够对所述第一命令进行处理;
转换及发送单元,用于当所述第二判断结果为所述第一命令不是指令单步时,将所述第一命令转换为指令单步命令,以及向所述代理模块发送所述指令单步命令,使得所述代理模块能够对所述指令单步命令进行处理。
8.根据权利要求6所述的反向调试装置,其特征在于,所述获取及处理模块包括:
查询单元,用于向所述代理模块查询所述事件或命令发生通知针对的事件;
接收单元,用于接收所述代理模块响应的所述单步指令的完成事件;
获取单元,用于获取所述代理模块对所述单步指令进行处理的程序运行状态信息;
记录单元,用于将所述程序运行状态信息记录到一逻辑存储空间中,所述逻辑存储空间用于所述控制模块根据所述逻辑存储空间记录的所述程序运行状态信息进行指令回放。
9.根据权利要求8所述的反向调试装置,其特征在于,所述程序运行状态信息包括:用于记录所述代理模块根据所述单步指令对内存进行的操作的内存操作记录帧、用于记录所述代理模块根据所述单步指令对寄存器进行的操作的寄存器操作记录帧和所述代理模块完成所述内存操作记录帧和所述寄存器操作记录帧时创建的结束帧。
10.根据权利要求8所述的反向调试装置,其特征在于,所述逻辑存储空间包括链表。
11.一种调试器,其特征在于,包括如权利要求6至10中任一项所述的反向调试装置。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410621460.6A CN105630664B (zh) | 2014-11-06 | 2014-11-06 | 一种反向调试方法、装置及调试器 |
PCT/CN2015/074971 WO2015184908A1 (zh) | 2014-11-06 | 2015-03-24 | 一种反向调试方法、装置及调试器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410621460.6A CN105630664B (zh) | 2014-11-06 | 2014-11-06 | 一种反向调试方法、装置及调试器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105630664A CN105630664A (zh) | 2016-06-01 |
CN105630664B true CN105630664B (zh) | 2020-03-13 |
Family
ID=54766130
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410621460.6A Active CN105630664B (zh) | 2014-11-06 | 2014-11-06 | 一种反向调试方法、装置及调试器 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN105630664B (zh) |
WO (1) | WO2015184908A1 (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106897213A (zh) * | 2017-01-04 | 2017-06-27 | 浙江大学 | 一种轻量级的测试平台***的逆向调试实现方法 |
CN110674368B (zh) * | 2019-09-11 | 2023-10-10 | 深圳创维-Rgb电子有限公司 | 一种***调试结果信息的处理方法及装置 |
CN112416790B (zh) * | 2020-11-30 | 2023-04-14 | 中国航空工业集团公司西安航空计算技术研究所 | 一种嵌入式软件离线重放调试方法和装置 |
CN114691486A (zh) * | 2020-12-30 | 2022-07-01 | 腾讯科技(深圳)有限公司 | 程序调试方法、装置及计算机设备 |
CN113179227B (zh) * | 2021-04-26 | 2023-05-19 | 哈尔滨铁路科研所科技有限公司 | 基于队列的at指令控制方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102129408A (zh) * | 2011-04-14 | 2011-07-20 | 电子科技大学 | 一种基于记录回放技术的嵌入式软件调试装置和方法 |
CN102346708A (zh) * | 2010-08-03 | 2012-02-08 | 中兴通讯股份有限公司 | 一种调试器及其调试方法 |
CN103268283A (zh) * | 2013-05-10 | 2013-08-28 | 华为技术有限公司 | 反向调试方法、反向调试***、主机及单板 |
CN104133763A (zh) * | 2013-05-03 | 2014-11-05 | 富泰华工业(深圳)有限公司 | 程序调试***及方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8448139B2 (en) * | 2009-10-05 | 2013-05-21 | International Business Machines Corporation | Automatic correction of application based on runtime behavior |
US9459989B2 (en) * | 2012-07-26 | 2016-10-04 | Adobe Systems Incorporated | Method and apparatus for reverse debugging source code using causal analysis |
CN103577315B (zh) * | 2012-07-30 | 2017-02-22 | 国际商业机器公司 | 反向调试器和反向调试方法 |
-
2014
- 2014-11-06 CN CN201410621460.6A patent/CN105630664B/zh active Active
-
2015
- 2015-03-24 WO PCT/CN2015/074971 patent/WO2015184908A1/zh active Application Filing
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102346708A (zh) * | 2010-08-03 | 2012-02-08 | 中兴通讯股份有限公司 | 一种调试器及其调试方法 |
CN102129408A (zh) * | 2011-04-14 | 2011-07-20 | 电子科技大学 | 一种基于记录回放技术的嵌入式软件调试装置和方法 |
CN104133763A (zh) * | 2013-05-03 | 2014-11-05 | 富泰华工业(深圳)有限公司 | 程序调试***及方法 |
CN103268283A (zh) * | 2013-05-10 | 2013-08-28 | 华为技术有限公司 | 反向调试方法、反向调试***、主机及单板 |
Non-Patent Citations (1)
Title |
---|
"An Effective Reversible Debugger of Cross Platform Based on Virtualization";Liming Wang等;《2009 International Conference on Embedded Software and Systems》;20090605;第448-453页 * |
Also Published As
Publication number | Publication date |
---|---|
WO2015184908A1 (zh) | 2015-12-10 |
CN105630664A (zh) | 2016-06-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105630664B (zh) | 一种反向调试方法、装置及调试器 | |
US8572578B2 (en) | Script debugging | |
US10545807B2 (en) | Method and system for acquiring parameter sets at a preset time interval and matching parameters to obtain a fault scenario type | |
CN108197032B (zh) | Ios应用的主线程卡顿监测方法、介质、设备及*** | |
CN103729288A (zh) | 一种嵌入式多核环境下应用程序的调试方法 | |
CN102521098B (zh) | Cpu死机监控的处理方法和装置 | |
US9355003B2 (en) | Capturing trace information using annotated trace output | |
CN107577593B (zh) | 使用执行单一步骤来诊断编码 | |
US7818620B2 (en) | Program failure analysis system, failure analysis method, and emulator device | |
CN108762886B (zh) | 虚拟机的故障检测恢复方法及*** | |
CN111124792A (zh) | 一种多核调试方法、装置及存储介质 | |
CN104077220A (zh) | Mips架构操作***内核的调试方法和装置 | |
US8521765B2 (en) | Method and system for post processing trace data | |
US10108474B2 (en) | Trace capture of successfully completed transactions for trace debugging of failed transactions | |
CN104572428A (zh) | 基于windows操作***下的复杂控件测试方法 | |
CN110955598A (zh) | 一种内核态程序的断点处理方法及装置 | |
CN116775442A (zh) | 一种软件调试*** | |
CN102063366A (zh) | 调试进程的方法和*** | |
CN101706752B (zh) | 一种软件错误现场定位的方法及装置 | |
CN108241543B (zh) | 业务操作断点执行的方法、业务服务器及*** | |
CN101237350B (zh) | 用于多任务环境单板机的全局变量异常改写定位方法 | |
CN114510429B (zh) | 一种基于动态符号执行的调试方法、***和介质 | |
CN100481093C (zh) | 验证目标***的验证***及其验证方法 | |
CN103150222B (zh) | 嵌入式***异常恢复的方法和装置 | |
CN105260257A (zh) | 解决程序运行期间停止响应的方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |