CN103577315B - 反向调试器和反向调试方法 - Google Patents
反向调试器和反向调试方法 Download PDFInfo
- Publication number
- CN103577315B CN103577315B CN201210267108.8A CN201210267108A CN103577315B CN 103577315 B CN103577315 B CN 103577315B CN 201210267108 A CN201210267108 A CN 201210267108A CN 103577315 B CN103577315 B CN 103577315B
- Authority
- CN
- China
- Prior art keywords
- reverse
- debugging
- check point
- program
- target breakpoint
- 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.)
- Expired - Fee Related
Links
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
- G06F11/362—Software debugging
-
- 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
- G06F11/362—Software debugging
- G06F11/3644—Software debugging by instrumenting at runtime
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
技术领域
本发明涉及程序调试器,更具体地,涉及一种反向调试器和反向调试方法。
背景技术
常用调试器(debugger)的基本功能包括:通过使目标程序触发一个异常将一个运行的程序中断下来,并且使其按照用户的意愿执行;查看软件运行中信息,这些信息包含但不限于当前线程的寄存器信息和内存信息等;以及修改软件执行流程,包括:修改内存信息、寄存器信息等等。
调试器的工作原理是基于中央处理器的异常机制,由操作系统的异常分发(或者事件分发)子系统负责将其封装处理后,以比较友好的方式与调试器进行实时交互。当调试器捕获到一个异常(或事件)之后,将会根据调试器的自身逻辑来判定是否需要接管这个异常(或事件),并决定由调试器的哪个函数来接管。当调试器接管下来这个异常(或事件)后,将根据用户的需求对其进行进一步的处理,处理完毕后再通知系统已经处理完毕,再开始新一轮的异常(或事件)捕获、分发循环。
调试程序的过程中,程序员经常需要知道自己对于程序的调试是否走得太远,先前步骤的执行结果是否正确等,这需要用到反向调试技术。反向调试是调试器中的一种调试方法,该方法允许程序回到程序已经执行过的历史点。目前提供反向调试功能的调试器包括TotalView Technologies公司的TotalView Debugger,以及开源社区的GDB。
理论上讲,一个程序如果想要回到已经执行过的历史点,必须记录该历史点的状态,包括该历史点的和该程序相关的内存值和寄存器值。现有的反向调试功能实现方法要么需要的存储空间太多,要么运行到反向目标断点的时间过长。
发明内容
为了解决现有技术中存在的问题,需要提供一种反向调试器及反向调试方法,使得需要的存储空间合理,并且运行到反向调试目标断点的时间也不太长。
根据本发明的一个方面,提供了一种反向调试程序的方法,包括:
获取编译器输出的该程序的调试信息,所述调试信息中包含该程序的扩展的基本块相关的信息;
响应于该程序进入反向调试,在至少一个扩展的基本块的入口地址设定反向调试检查点;
响应于程序运行到设定的反向调试检查点,存储该反向调试检查点对应的调试需要存储的信息;
响应于接收到设定的反向调试目标断点,
将程序回退到该反向调试目标断点之前的、距离该反向调试目标断点最近的反向调试检查点,并获得该反向调试检查点存储的调试需要存储的信息,并继续执行该程序,直至执行到该反向调试目标断点。
根据本发明的另一个方面,提供了一种反向调试器,包括:
获取装置,被配置为获取编译器输出的该程序的调试信息,所述调试信息中包含该程序的扩展的基本块相关的信息;
设定装置,被配置为响应于该程序进入反向调试,在至少一个扩展的基本块的入口地址设定反向调试检查点;
存储装置,被配置为响应于程序运行到设定的反向调试检查点,存储该反向调试检查点对应的调试需要存储的信息;
回退装置,被配置为响应于接收到设定的反向调试目标断点,将程序回退到该反向调试目标断点之前的、距离该反向调试目标断点最近的反向调试检查点,并获得该反向调试检查点存储的调试需要存储的信息,并继续执行该程序,直至执行到该反向调试目标断点。
附图说明
通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。
图1示出了适于用来实现本发明实施方式的示例性计算系统的框图;
图2示出了根据本发明一种实施方式的反向调试程序的方法的流程图;
图3给出了基本块和扩展的基本块术语模型图;
图4a示出了Dwarf调试信息中的调试信息入口,图4b示出了编译器产生的Dwarf格式的信息的例子;
图5示意性地示出了根据本发明的一种实施方式在调试信息中加入的扩展的基本块的信息;
图6示出了在反向调试检查点调试器需要存储的信息的一种实施方式;
图7示出了在图3所示的程序中被执行的基本块BB和扩展的基本块EBB以及被加入的目标调试断点;
图8示出了图2所示的调试方法的使用场景;以及
图9示出了反向调试器900的结构框图。
具体实施方式
下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了适于用来实现本发明实施方式的示例性计算系统100的框图。如图1所示,计算机系统100可以包括:CPU(中央处理单元)101、RAM(随机存取存储器)102、ROM(只读存储器)103、系统总线104、硬盘控制器105、键盘控制器106、串行接口控制器107、并行接口控制器108、显示控制器109、硬盘110、键盘111、串行外部设备112、并行外部设备113和显示器114。在这些设备中,与系统总线104耦合的有CPU 101、RAM 102、ROM 103、硬盘控制器105、键盘控制器106、串行控制器107、并行控制器108和显示控制器109。硬盘110与硬盘控制器105耦合,键盘111与键盘控制器106耦合,串行外部设备112与串行接口控制器107耦合,并行外部设备113与并行接口控制器108耦合,以及显示器114与显示控制器109耦合。应当理解,图1所述的结构框图仅仅是为了示例的目的,而不是对本发明范围的限制。在某些情况下,可以根据具体情况增加或减少某些设备。
所属技术领域的技术人员知道,本发明可以实现为系统、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:可以是完全的硬件、也可以是完全的软件(包括固件、驻留软件、微代码等),还可以是硬件和软件结合的形式,本文一般称为“电路”、“模块”或“系统”。此外,在一些实施例中,本发明还可以实现为在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可读的程序代码。
可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如”C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
下面将参照本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述本发明。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,这些计算机程序指令通过计算机或其它可编程数据处理装置执行,产生了实现流程图和/或框图中的方框中规定的功能/操作的装置。
也可以把这些计算机程序指令存储在能使得计算机或其它可编程数据处理装置以特定方式工作的计算机可读介质中,这样,存储在计算机可读介质中的指令就产生出一个包括实现流程图和/或框图中的方框中规定的功能/操作的指令装置(instructionmeans)的制造品(manufacture)。
也可以把计算机程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机或其它可编程装置上执行的指令能够提供实现流程图和/或框图中的方框中规定的功能/操作的过程。
首先介绍本发明中使用的常用背景技术术语:
断点(breakpoint):在程序调试过程中,断点是指程序内部停止的位置,目的是为了用户调试的作用,比如在程序内部某个位置,打印变量值和内存,查看系统内部信息。一般由用户手工设定,对用户可见。具体实现是在程序中调试器中使用trap指令替换设定断点的指令,将设定断点的指令存储起来,当程序执行到trap指令时,产生异常,程序控制权交给操作系统。
检查点(checkpoint):是一种特殊的断点,实现的原理与断点一样,它的主要目的是记录下列各项之一:内存改变和寄存器改变。一般由调试器自动设定,可以对用户不可见。
反向调试检查点(reverse checkpoint):反向调试中调试器设定的需要存储程序中间状态的点。
反向调试目标断点(reverse object breakpoint):反向调试中调试人员在程序执行路径上设定的、程序需要回退到的点。
目前的反向调试已经提供了一些方法,例如包括一步一停法,目标断点法。在一步一停法中,调试器需要在当前指令的下一条指令设一个反向调试检查点,当程序停在当前指令时,调试器需要记录本指令所修改的寄存器值和相关内存改变的值,把这些值记录到存储介质中,需要恢复的时候再反向逐条指令地恢复。这种方法每一条指令都需要停止运行,执行的速度非常慢,另外,每一条指令的所修改的寄存器值和相关内存改变的值需要大量的存储空间。
目标断点法就是程序自动或人工设定一定数量的反向调试检查点,如果程序要反向调试到一个反向调试目标断点,一般需要以下步骤:
a)调试器插入一定数量的反向调试检查点.插入的方法分为动态的插入和静态的插入,所谓静态插入是指在程序运行前,把反向调试检查点插入到程序中;动态插入是指在程序运行过程中插入反向调试检查点。
b)恢复程序到离若干反向调试目标断点最近的、并且在反向调试目标断点前面的反向调试检查点,恢复到所述反向调试检查点也分为自动恢复和人工恢复.人工恢复需要用户指定程序恢复到哪个反向调试检查点。
c)从恢复的检查点正向执行到反向调试目标断点.
断点的插入方法包括:指定函数入口设定法,即在指定的函数入口或每个函数入口插入反向调试检查点,该方法对于任意目标点来说反向调试检查点的数量太少,很难快速到达任意反向调试目标断点;设定一定数量的指令间隔,比如每隔n条指令插入一个反向调试检查点,这种方法的指令间隔很难确定;在每个基本块的入口插入反向调试检查点,很多基本块的指令条数小于五条,这种方法插入的反向调试检查点数量过多,存储空间要求大。
因此,插入反向调试检查点要解决的问题是插入的粒度,因为如果插入反向调试检查点的粒度太小,运行到目标断点的空间的代价太大;而如果插入反向调试检查点的粒度太大,运行到目标点的时间的代价太大。
本发明提出使用扩展的基本块作为反向调试的断点插入粒度。图2示出了根据本发明一种实施方式的反向调试程序的方法的流程图,根据图2,在步骤S201,获取编译器输出的该程序的调试信息,所述调试信息中包含该程序的扩展的基本块相关的信息。
图3给出了基本块和扩展的基本块术语模型图,参考图3,基本块BB(basic block)是指只能从程序的第一条指令进入,并且从最后一条指令离开的最长线性指令序列,基本块BB的指令序列是线性的,也就是顺序执行的一系列指令;例如,图3中BB1-BB7都是基本块。程序代码的整体就是若干基本块连接成的一个树状结构,其中,在该树状结构中,包含分支基本块(branch basic block),是具有多个后继基本块的基本块,例如图3中的基本块BB1和基本块BB4。还包含汇合基本块(join basic block):具有多个前驱基本块的基本块,例如图3中的基本块BB4。扩展的基本块EBB(Extended Basic Block)是指从入口指令开始的最长指令序列,在这个指令序列中,除了程序的第一个基本块之外不含其它汇合基本块。由于扩展的基本块EBB只有一个入口基本块,并且可能有多个出口基本块,所以它可以看成以入口基本快为根的树,图3中包含3个EBB,分别是EBB1{BB1,BB2,BB3},EBB2{BB5,BB7},EBB3{BB4,BB6}。EBB划分是由算法决定的,划分的算法是现有技术,这里不在赘述。
一般来说,扩展的基本块EBB是由编译器在优化阶段构造的结构,大部分编译器,如gcc,open64等在程序优化阶段都能够构造扩展的基本块EBB。EBB的构造算法有若干种,其并不是本发明的发明点,这里不再详述。编译器还生成调试信息,调试信息格式有很多种,如Dwarf、Stab、COFF、OMF等。以下本发明以调试信息的标准Dwarf(Debugging WithAttributed Record Formats)格式为例陈述本发明的实现,使用其它调试信息格式的程序的反向调试方法类似,就不再赘述。
Dwarf格式的调试信息包含了行号信息,符号表,基本块信息,基本数据类型,源文件目录和名称等信息,可以被调试器使用。例如,调试信息记录了变量和函数所对应的内存地址。调试器可以获得需要的信息、打印变量的值等。图4a和图4b示出了一个Dwarf的例子。其中,图4a示出了Dwarf调试信息中的调试信息入口。调试信息入口是dwarf的基本单位;图4b示出了编译器产生的Dwarf格式的信息的例子,其中,第一列<source>的ed_scoped/tests/ac.C表示程序的源代码的目录路径位置及程序名;第二列[row,col]中的row,col分别表明源代码的行和列;第三列<PC>的数值表示指令地址,第四列<BB entry>的数值表示基本块的入口地址,入口地址就是该基本块的第一条指令的地址,具有相同基本块入口地址的指令属于相同的基本块,例如图4b第4列中,有6行0x10e,表明这6句程序代码属于一个基本块,其中0x10e为该基本块的入口地址,图4b第4列中,有7行0x156,表明这7句程序代码属于一个基本块,其中0x156为该基本块的入口地址等等;第5列<new statement or basicblock>中//后面的文字是注释语句。由此可见,现有的编译器输出的调试信息已经包含了基本块的信息,虽然扩展的基本块EBB也是由编译器在优化阶段构造的结构,但是其并没有包含在编译器输出的调试信息中。
步骤S201的实现中需要编译器将其构造的EBB结构存储在该编译器输出的调试信息里面,图5示意性地示出了根据本发明的一种实施方式在调试信息中加入的扩展的基本块的信息,图5中的信息实际是在图4b当前的第4列和第5列之间加入一个新列,表明扩展的基本块的信息。根据图5,0x100和0x362为两个扩展的基本块的入口地址,扩展的基本块的入口地址是该扩展的基本块的第一条指令的地址,也就是该扩展的基本块包含的第一个基本块的入口地址,其中0x100,0x156,0x184,0x272…为基本块的入口地址。
在步骤S202,响应于该程序进入反向调试,在至少一个扩展的基本块的入口地址设定反向调试检查点。程序进入反向调试可以由用户通过命令行进行设定,对于图形用户界面的调试器,也可以提供特别的按钮,使程序进入反向调试。设定反向调试检查点的步骤可以由调试器自动设定的,也就是在扩展的基本块的入口地址加入一条trap指令,与现有技术中加入检查点的实现是一样的,不同之处在于加检查点的位置不同。调试器可以通过搜索编译器输出的包含扩展基本块入口地址的调试信息来得到该程序的所有扩展基本块的入口地址,在这些入口地址加入反向调试检查点。例如,可以从图4b和图5相结合中搜索出[247,5]为扩展的基本块的入口地址,就在该地指出加入反向调试检查点。在另外一种实施方式中,只在程序动态执行到一个函数时,才把这个函数中的所有EBB的入口插入检查点。
在EBB的入口地址加入反向调试检查点的方法从理论上讲有很多有优点:首先,因为程序可以从EBB的入口指令到达EBB中的每一条指令,这样就不用担心从反向调试检查点无法回退到反向调试目标断点;其次,可以实现基本块的可达性,因为扩展的基本块EBB包含了一组基本块BB,从扩展的基本块EBB的入口基本块BB,可以到达扩展的基本块EBB中的每个基本块BB;最后扩展的基本块EBB扩展了基本块BB,每个扩展的基本块EBB包含至少一个基本块BB,这样大大地减少了反向调试检查点的插入量,减少了存储空间,相应也减少了时间和空间复杂性。
在步骤S203,响应于程序运行到设定的反向调试检查点,存储该检查点对应的调试需要存储的信息。调试需要存储的信息包括但不限于寄存器的值和相关内存空间的值,可以保留全部寄存器的值,及部分变化的值,全部内存的值,也可以只保留部分内存的值。在一种实施方式中,寄存器的值为在当前法向调试检查点的寄存器的原始值,相关内存的值为在当前反向调试检查点和下一个反向调试检查点之间发生变化的内存空间的原始值,图6示出了在反向调试检查点调试器需要存储的信息的一种实施方式。在检查点1,存储全部寄存器r1-r32在反向调试检查点1的原始值,并且在执行到第3条指令时,内存1的值要发生改变,调试器通过系统调用把当前被调试进程的内存设成不可写,这样当有指令写内存时,系统发生中断,这时可以在反向调试检查点调试器需要存储的信息中存储内存1的原始值,也就是反向调试检查点1和反向调试检查点2之间在反向调试检查点1时内存1的原始值。同样,在检查点2,存储全部寄存器r1-r32在反向调试检查点2的原始值,并且在第12条指令内存4发生了变化,记录反向调试检查点2和反向调试检查点3之间的内存4在反向调试检查点2的原始值12。
这里调试需要存储的信息可以以多种方式存储,例如,如果需要存储的信息所占的存储空间不大,可以单独开辟一块保护内存来存储,之所以要保护起来,就是要防止其他程序对该块内存进行操作,从而修改了这些信息;如果需要的存储空间很大,也可以采用非易失性存储器,例如,硬盘、光盘、电子盘等存储介质进行存储。
在步骤S204,响应于接收到设定的反向调试目标断点,将程序回退到该反向调试目标断点之前的,距离该反向调试目标断点最近的反向调试检查点,并获得该反向调试检查点存储的调试需要存储的信息,继续执行该程序,直至执行到该反向调试目标断点。该反向调试检查点存储的调试需要存储的信息主要包括在该反向调试检查点存储的内存值和寄存器值,这些值是与调试器存储了哪些值相关的,如果存储了所有的寄存器原始值和相关内存原始值,只要恢复在该反向调试检查点存储的内存值和寄存器值即可;如果采用上述图6所述的存储方式存储,则在恢复法向调试检查点k的调试需要存储的信息时,需要将在反向调试检查点n,n-1,……k+1,k存储的调试需要存储的信息都恢复出来,才能从检查点n开始反向一步一步恢复出相关内存和全部寄存器在反向调试检查点k的原始值,这里k和n都是正整数,并且n>k。这里的相关是指和该程序有关的内存空间。
在一种优选的实施方式中,响应于接收到设定的反向调试目标断点,将反向调试目标断点对应的指令替换成中断指令,并且把原有指令保存,当程序继续执行时,在把原有指令替换回来,这样不会造成指令序列变化,即改变指令的地址,并且可以在执行到该指令时发生中断,程序停止执行,用户可以观察相关的信息,例如寄存器和内存等的信息。
在一种优选的实施方式中,响应于接收到的设定的反向调试目标断点为多个,获得该多个反向调试目标断点的最晚执行的反向调试目标断点,然后再将程序回退到该最晚执行的反向调试目标断点之前的,距离该最晚执行的反向调试的目标反向调试断点最近的反向调试检查点,并恢复该检查点存储的初始内存值和寄存器值,继续反向执行该程序,直至执行到该最早执行的反向调试目标断点。最晚执行的反向调试目标断点不能通过将所有的反向调试目标断点的指令地址进行比较,因为指令中存在跳转指令,所以并非指令地址小的指令就一定先执行,指令地址大的指令就一定后执行。基于一个BB是由一组指令序列组成的,BB中指令地址小的一定比同一BB中指令地址大的先执行,在EBB中的两个BB,父BB中的指令一定比子BB中的指令先执行,可以通过这样的方法判断:获得并存储EBB的执行顺序以及EBB中包含的BB的关系;通过对于任意两个反向调试目标断点,如果属于不同的EBB,根据它们所在的EBB的执行顺序获得其执行顺序,如果属于相同的EBB,并且属于同一BB,根据其地址大小获得其执行顺序,如果属于相同的EBB,但是属于不同BB,根据它们所在BB在EBB的父子关系决定它们的执行顺序,即属于父BB的断点比子BB早执行,从而获得最晚执行的反向调试目标断点。EBB的执行顺序可以通过已经执行过的EBB链存储。上述的技术方案主要是因为:一个函数内包含多个扩展的基本块EBB,一个扩展的基本块EBB内包含多个基本块BB,在执行路径上,并不是所有基本块BB都被执行,例如,图7示出了在图3所示的程序中被执行的基本块BB和扩展的基本块EBB以及被加入的目标调试断点,在该图中,有7个基本块BB,只有BB1,BB2,BB4,BB6被执行(灰色框),而且并不是所有EBB被执行,图7有3个EBB,只有EBB1,EBB3被执行。程序入口点肯定是EBB入口点。在另一种实施方式中,记录EBB的执行顺序以及EBB中执行的BB,可以响应于接收到设定的反向调试目标断点根据存储的EBB的执行顺序以及EBB中执行的BB,被判别为不可以被反向调试,发出警告。具体来说通过反向调试目标断点的指令地址和已经执行的EBB的指令地址范围来判别该目标断点是不是可以被反向执行到的,如果不能被反向执行到,可以提醒用户。图7示出的程序中被设定了3个反向调试的断点,分别在基本块BB1,BB2,以及BB3中。其中图7中反向调试目标断点3就是不能被反向调试执行到的断点。
由于程序员经常遇到的情况是真正有问题的程序就一小段,程序员需要在该一小段程序中反复设置反向目标调试断点进行反向调试;另外,如果用户只是反向执行一步,调试器也需要首先恢复到设定的反向调试检查点,这样程序执行效率很低,因此,在步骤S204的一种优选实施方式中,继续执行该程序,直至执行到该反向调试目标断点时,可以对从回退到的该反向调试目标断点之前的,距离该反向调试目标断点最近的反向检查点到该目标调试断点之间的每一条指令使用现有技术中的一步一停法中的技术,在每条指令设定反向调试检查点,并存储该反向调试检查点对应的调试需要存储的信息。这样,程序员在这部分程序中反复设置反向调试的目标断点时,响应于接收到设定的另一反向调试目标断点,并且该设定的反向调试目标断点位于从回退到的该反向调试目标断点之前的,距离该反向调试目标断点最近的反向调试检查点到该反向调试目标断点之间,将程序回退到该另一反向调试目标断点前一条指令对应的另一反向调试检查点,并获得该另一反向调试检查点存储的调试需要存储的信息。这样可以提高调试效率。
现有支持反向调试的调试器已经提供了一些反向调试命令,例如命令setreverse=1表示设定反向调试,命令Reverse-next表示反向执行到前一条语句;命令Reverse-continue表示反向继续执行命令,应用的场景包括设置一个反向调试目标断点,用户希望以后程序可以回到这个点,设置完这个反向调试目标断点以后用户可以正向执行;当用户想回到以前设定的反向调试目标断点,可以执行reverse-continue指令,这样程序可以返回到最后执行的反向调试目标断点上。
使用本发明的方法,可以在调试器中另外设置几个反向调试命令,例如:设定命令Show checkpoints用来显示调试器自动设置了哪些反向调试检查点,该命令的结果可能显示为:
1)checkpoint 1:address 1,source line 1
2)checkpoint 2:address 2,source line 2
3)checkpoint 3:address 3,source line 3
还可以设定命令find Checkpoint for[breakpoint]:,用来表示寻找离反向调试目标断点[breakpoint]最近的反向调试检查点,其中[breakpoint]为反向调试目标断点。
上述添加的命令可以是命令行命令,如果调试器有图形用户界面,也可以设计相应的图形用户界面的按钮来实现上述命令,等等。
图8示出了图2所示的调试方法的使用场景。在图8中,用户通过执行命令“setreverse=1”决定进入反向调试模式,该程序包含6个扩展的基本块,调试器自动在每个扩展的基本块入口地址设置6个反向调试检查点,用户继续执行程序,执行过程中在每个反向调试检查点都存储调试需要存储的信息,当执行到当前执行点时,决定回到一些前面的执行点。如果用户设置两个反向调试目标断点,该调试方法发现对反向调试目标断点2,反向调试检查点4是距离反向调试目标断点2最近的,并且在其之前的反向调试检查点,该调试方法会恢复出反向调试检查点4存储的调试需要存储的信息,并继续执行,直至执行到反向调试目标断点2。其中,用户可以使用调试命令。然后,对反向调试行目标断点1的执行场景类似,这里不再赘述。
在同一个发明构思下,本发明还公开了一种反向调试器,图9示出了反向调试器900的结构框图,根据图9,该包括:获取装置901,被配置为获取编译器输出的该程序的调试信息,所述调试信息中包含该程序的扩展的基本块相关的信息;设定装置902,被配置为响应于该程序进入反向调试,在至少一个扩展的基本块的入口地址设定反向调试检查点;存储装置903,被配置为响应于程序运行到设定的反向调试检查点,存储该检查点对应的调试需要存储的信息;回退装置904,被配置为响应于接收到设定的反向调试目标断点,将程序回退到该反向调试目标断点之前的、距离该反向调试目标断点最近的反响检查点,并获得在该反向调试检查点存储的调试需要存储的信息,并继续执行该程序,直至执行到该反向调试目标断点。
在一种实施方式中,扩展的基本块相关的信息由该编译器构造,存储在该编译器输出的调试信息中。
在一种实施方式中,调试需要存储的信息至少包括寄存器的始值,内存空间的值。在优选的实施方式中,寄存器的值为在当前检查点的寄存器的原始值,内存空间的值为在当前检查点和下一个检查点之间发生变化的内存空间的原始值。并且,在该优选的实施方式中,回退装置的获得该检查点存储的调试需要存储的信息包括:响应于要恢复在反向调试检查点k的调试需要存储的信息,将在反向调试检查点n,n-1,……k+1,k存储的调试需要存储的信息恢复出来,从发向调试检查点n开始反向一步一步恢复出相关内存和全部寄存器在检查点k的原始值,其中k和n为正整数,并且n>k。
在一种实施方式中,回退装置还被配置为:响应于接收到的设定的反向调试目标断点为多个,获得最晚执行的反向调试目标断点;将程序回退到该最晚执行的反向调试目标断点之前的,距离该最晚执行的反向调试的目标断点最近的反向调试检查点;恢复该反向调试检查点存储的初始内存值和寄存器值;继续反向执行该程序,直至执行到该最早执行的反向调试目标断点。
在一种实施方式中,回退装置被配置为通过以下步骤获得该多个反向调试目标断点的最晚执行的反向调试目标断点:获得并存储EBB的执行顺序EBB中包含的BB的关系;通过对于任意两个反向调试目标断点,如果属于不同的EBB,根据它们所在的EBB的执行顺序获得其执行顺序,如果属于相同的EBB,并且属于同一BB,根据其地址大小获得其执行顺序,如果属于相同的EBB,但是属于不同BB,根据其所在BB在EBB的父子关系决定其执行顺序,从而获得最晚执行的反向调试目标断点。
在一种实时方式中,回退装置还被配置为:获得并存储EBB的执行顺序以及EBB中执行的BB;以及响应于接收到设定的反向调试目标断点根据存储的EBB的执行顺序以及EBB中执行的BB,被判别为不可以被反向调试,发出警告。
在一种实施方式中,回退装置的继续执行该程序,直至执行到该反向调试目标断点被配置为:对从回退到的该反向调试目标断点之前的,距离该反向调试目标断点最近的反向调试检查点到该目标调试断点之间的每一条指令设定反向调试检查点;响应于程序运行到设定的反向调试检查点,存储该检查点对应的调试需要存储的信息;响应于接收到设定的另一反向调试目标断点,并且该设定的反向调试目标断点位于从回退到的该反向调试目标断点之前的,距离该反向调试目标断点最近的反向调试检查点到该反向调试目标断点之间,将程序回退到该另一反向调试目标断点前一条指令对应的另一反向调试检查点,并获得该另一反向调试检查点存储的调试需要存储的信息。
附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
Claims (18)
1.一种反向调试程序的方法,包括:
获取编译器输出的该程序的调试信息,所述调试信息中包含该程序的扩展的基本块EBB相关的信息;
响应于该程序进入反向调试,在至少一个扩展的基本块的入口地址设定反向调试检查点;
响应于程序运行到设定的反向调试检查点,存储该反向调试检查点对应的调试需要存储的信息;
响应于接收到设定的反向调试目标断点,将程序回退到该反向调试目标断点之前的、距离该反向调试目标断点最近的反向调试检查点,并获得该反向调试检查点存储的调试需要存储的信息,并继续执行该程序,直至执行到该反向调试目标断点。
2.根据权利要求1所述的方法,其中所述扩展的基本块相关的信息由该编译器构造,并且存储在该编译器输出的调试信息中。
3.根据权利要求1所述的方法,其中调试需要存储的信息至少包括寄存器的值,相关内存空间的值。
4.根据权利要求3所述的方法,其中寄存器的值为在当前反向调试检查点的寄存器的原始值,相关内存空间的值为在当前反向调试检查点和下一个反向调试检查点之间发生变化的内存空间的原始值。
5.根据权利要求4所述的方法,其中所述获得该反向调试检查点存储的调试需要存储的信息包括:
响应于要恢复在反向调试检查点k的调试需要存储的信息,将在反向调试检查点n,n-1,……k+1,k存储的调试需要存储的信息恢复出来,从反向调试检查点n开始反向一步一步恢复出相关内存和全部寄存器在反向调试检查点k的原始值,其中k和n为正整数,并且n>k。
6.根据权利要求1所述的方法,其中还包括响应于接收到的设定的反向调试目标断点为多个:
获得最晚执行的反向调试目标断点,
将程序回退到该最晚执行的反向调试目标断点之前的,距离该最晚执行的反向调试的目标断点最近的反向调试检查点,
恢复该反向调试检查点存储的初始内存值和寄存器值,
继续反向执行该程序,直至执行到最早执行的该反向调试目标断点。
7.根据权利要求6所述的方法,其中所述获得该多个反向调试目标断点中最晚执行的反向调试目标断点包括:
获得并存储EBB的执行顺序以及EBB中包含的基本块BB的关系;
对于任意两个反向调试目标断点,根据下列各项之一获得目标断点的执行顺序:
1)该两个反向调试目标断点属于不同的EBB,根据它们所在的EBB的执行顺序获得其执行顺序;
2)该两个反向调试目标断点属于相同的EBB并且属于同一基本块BB,根据其地址大小获得其执行顺序;
3)该两个反向调试目标断点属于相同的EBB,但是属于不同基本块BB,根据其所在基本块BB在EBB的父子关系获得其执行顺序。
8.根据权利要求1所述的方法,其中还包括:
获得并存储EBB的执行顺序以及EBB中执行的基本块BB;
响应于设定的反向调试目标断点根据存储的EBB的执行顺序以及EBB中执行的基本块BB,被判别为不可以被反向调试,发出警告。
9.根据权利要求1所述的方法,其中所述继续执行该程序,直至执行到该反向调试目标断点包括:
对从回退到的该反向调试目标断点之前的,距离该反向调试目标断点最近的反向调试检查点到该反向调试目标断点之间的每一条指令设定反向调试检查点;
响应于程序运行到设定的反向调试检查点,存储该反向调试检查点对应的调试需要存储的信息;
响应于接收到设定的另一反向调试目标断点,并且该设定的反向调试目标断点位于从回退到的该反向调试目标断点之前的,距离该反向调试目标断点最近的反向调试检查点到该反向调试目标断点之间,将程序回退到该另一反向调试目标断点前一条指令对应的另一反向调试检查点,并获得该另一反向调试检查点存储的调试需要存储的信息。
10.一种反向调试的系统,包括:
用于获取编译器输出的程序的调试信息的装置,所述调试信息中包含该程序的扩展的基本块EBB相关的信息;
用于响应于该程序进入反向调试,在至少一个扩展的基本块的入口地址设定反向调试检查点的装置;
用于响应于程序运行到设定的反向调试检查点,存储该反向调试检查点对应的调试需要存储的信息的装置;
用于响应于接收到设定的反向调试目标断点,将程序回退到该反向调试目标断点之前的、距离该反向调试目标断点最近的反向调试检查点,并获得该反向调试检查点存储的调试需要存储的信息,并继续执行该程序,直至执行到该反向调试目标断点的装置。
11.根据权利要求10所述的系统,其中所述扩展的基本块相关的信息由该编译器构造,并且存储在该编译器输出的调试信息中。
12.根据权利要求10所述的系统,其中调试需要存储的信息至少包括寄存器的值,相关内存空间的值。
13.根据权利要求12所述的系统,其中寄存器的值为在当前反向调试检查点的寄存器的原始值,相关内存空间的值为在当前反向调试检查点和下一个反向调试检查点之间发生变化的内存空间的原始值。
14.根据权利要求13所述的系统,其中所述用于响应于接收到设定的反向调试目标断点,将程序回退到该反向调试目标断点之前的、距离该反向调试目标断点最近的反向调试检查点,并获得该反向调试检查点存储的调试需要存储的信息,并继续执行该程序,直至执行到该反向调试目标断点的装置的获得该反向调试检查点存储的调试需要存储的信息包括:
响应于要恢复在反向调试检查点k的调试需要存储的信息,将在反向调试检查点n,n-1,……k+1,k存储的调试需要存储的信息恢复出来,从反向调试检查点n开始反向一步一步恢复出相关内存和全部寄存器在反向调试检查点k的原始值,其中k和n为正整数,并且n>k。
15.根据权利要求10所述的系统,其中所述用于响应于接收到设定的反向调试目标断点,将程序回退到该反向调试目标断点之前的、距离该反向调试目标断点最近的反向调试检查点,并获得该反向调试检查点存储的调试需要存储的信息,并继续执行该程序,直至执行到该反向调试目标断点的装置还包括:用于响应于接收到的设定的反向调试目标断点为多个:
获得最晚执行的反向调试目标断点,
将程序回退到该最晚执行的反向调试目标断点之前的,距离该最晚执行的反向调试的目标断点最近的反向调试检查点,
恢复该反向调试检查点存储的初始内存值和寄存器值,
继续反向执行该程序,直至执行到最早执行的该反向调试目标断点的装置。
16.根据权利要求15所述的系统,其中所述用于响应于接收到设定的反向调试目标断点,将程序回退到该反向调试目标断点之前的、距离该反向调试目标断点最近的反向调试检查点,并获得该反向调试检查点存储的调试需要存储的信息,并继续执行该程序,直至执行到该反向调试目标断点的装置包括:用于通过以下步骤获得该多个反向调试目标断点的最晚执行的反向调试目标断点的装置:
获得并存储EBB的执行顺序以及EBB中包含的基本块BB的关系;
对于任意两个反向调试目标断点,根据下列各项之一获得目标断点的执行顺序:
4)该两个反向调试目标断点属于不同的EBB,根据它们所在的EBB的执行顺序获得其执行顺序;
5)该两个反向调试目标断点属于相同的EBB并且属于同一基本块BB,根据其地址大小获得其执行顺序;
6)该两个反向调试目标断点属于相同的EBB,但是属于不同基本块BB,根据其所在基本块BB在EBB的父子关系获得其执行顺序。
17.根据权利要求10所述的系统,其中用于响应于接收到设定的反向调试目标断点,将程序回退到该反向调试目标断点之前的、距离该反向调试目标断点最近的反向调试检查点,并获得该反向调试检查点存储的调试需要存储的信息,并继续执行该程序,直至执行到该反向调试目标断点的装置还包括:
用于获得并存储EBB的执行顺序以及EBB中执行的基本块BB的装置;
用于响应于设定的反向调试目标断点根据存储的EBB的执行顺序以及EBB中执行的基本块BB,被判别为不可以被反向调试,发出警告的装置。
18.根据权利要求10所述的系统,其中所述用于响应于接收到设定的反向调试目标断点,将程序回退到该反向调试目标断点之前的、距离该反向调试目标断点最近的反向调试检查点,并获得该反向调试检查点存储的调试需要存储的信息,并继续执行该程序,直至执行到该反向调试目标断点的装置的继续执行该程序,直至执行到该反向调试目标断点包括:
对从回退到的该反向调试目标断点之前的,距离该反向调试目标断点最近的反向调试检查点到该反向调试目标断点之间的每一条指令设定反向调试检查点;
响应于程序运行到设定的反向调试检查点,存储该反向调试检查点对应的调试需要存储的信息;
响应于接收到设定的另一反向调试目标断点,并且该设定的反向调试目标断点位于从回退到的该反向调试目标断点之前的,距离该反向调试目标断点最近的反向调试检查点到该反向调试目标断点之间,将程序回退到该另一反向调试目标断点前一条指令对应的另一反向调试检查点,并获得该另一反向调试检查点存储的调试需要存储的信息。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210267108.8A CN103577315B (zh) | 2012-07-30 | 2012-07-30 | 反向调试器和反向调试方法 |
US13/952,751 US8997059B2 (en) | 2012-07-30 | 2013-07-29 | Reverse debugging |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210267108.8A CN103577315B (zh) | 2012-07-30 | 2012-07-30 | 反向调试器和反向调试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103577315A CN103577315A (zh) | 2014-02-12 |
CN103577315B true CN103577315B (zh) | 2017-02-22 |
Family
ID=49996287
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210267108.8A Expired - Fee Related CN103577315B (zh) | 2012-07-30 | 2012-07-30 | 反向调试器和反向调试方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US8997059B2 (zh) |
CN (1) | CN103577315B (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9304863B2 (en) * | 2013-03-15 | 2016-04-05 | International Business Machines Corporation | Transactions for checkpointing and reverse execution |
US9195567B1 (en) * | 2014-05-16 | 2015-11-24 | International Business Machines Corporation | Debugging data format conversion |
CN105630664B (zh) * | 2014-11-06 | 2020-03-13 | 中兴通讯股份有限公司 | 一种反向调试方法、装置及调试器 |
US10521329B2 (en) | 2015-05-08 | 2019-12-31 | Intergral GmbH | Debugging system |
US10120887B1 (en) * | 2015-09-28 | 2018-11-06 | EMC IP Holding Company LLC | Demand-driven initialization of data storage structures |
US9983986B2 (en) | 2015-09-28 | 2018-05-29 | International Business Machines Corporation | Testing code response to injected processing errors |
CN106897213A (zh) * | 2017-01-04 | 2017-06-27 | 浙江大学 | 一种轻量级的测试平台系统的逆向调试实现方法 |
CN107102940A (zh) * | 2017-03-16 | 2017-08-29 | 浙江大学 | 一种结合全量型检查点与增量型重做的目标程序逆向执行实现方法 |
CN111209193B (zh) * | 2019-12-30 | 2023-09-22 | 北京水滴科技集团有限公司 | 程序的调试方法及装置 |
US11288170B1 (en) | 2020-12-10 | 2022-03-29 | International Business Machines Corporation | Log analysis debugging without running on real production environment |
US11693759B2 (en) | 2021-05-14 | 2023-07-04 | International Business Machines Corporation | Providing for multi-process log debug without running on a production environment |
CN114625572B (zh) * | 2022-03-22 | 2023-01-31 | 北京云枢创新软件技术有限公司 | 逆向调试内存备份方法、电子设备和介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101482846A (zh) * | 2008-12-25 | 2009-07-15 | 上海交通大学 | 基于可执行代码逆向分析的漏洞挖掘方法 |
CN102129408A (zh) * | 2011-04-14 | 2011-07-20 | 电子科技大学 | 一种基于记录回放技术的嵌入式软件调试装置和方法 |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5167012A (en) * | 1990-01-26 | 1992-11-24 | International Business Machines Corporation | Method for performing consistency checks |
US7185320B2 (en) * | 2003-06-27 | 2007-02-27 | Hewlett-Packard Development Company, L.P. | System and method for processing breakpoint events in a child process generated by a parent process |
US8136096B1 (en) | 2004-07-23 | 2012-03-13 | Green Hills Software, Inc. | Backward post-execution software debugger |
US7849450B1 (en) * | 2005-01-28 | 2010-12-07 | Intel Corporation | Devices, methods and computer program products for reverse execution of a simulation |
GB0521465D0 (en) | 2005-10-21 | 2005-11-30 | Law Gregory E W | System and method for debugging of computer programs |
CN100485636C (zh) * | 2006-04-24 | 2009-05-06 | 华为技术有限公司 | 一种基于模型驱动进行电信级业务开发的调试方法及装置 |
US7870536B2 (en) * | 2006-06-15 | 2011-01-11 | International Business Machines Corporation | Computer implemented method and system for sharing resources among hierarchical containers of resources |
US7836430B2 (en) | 2006-07-21 | 2010-11-16 | Apple Inc. | Reversing execution of instructions in a debugger |
CN101295279B (zh) * | 2007-04-29 | 2012-05-09 | 国际商业机器公司 | 多线程环境下的调试程序的方法和系统 |
FR2921172B1 (fr) * | 2007-09-14 | 2015-09-04 | Airbus France | Procede de debogage d'un logiciel de fonctionnement d'un systeme embarque a bord d'un aeronef et dispositif de mise en oeuvre |
US8756577B2 (en) * | 2011-06-28 | 2014-06-17 | International Business Machines Corporation | Collaborative software debugging in a distributed system with private debug sessions |
US9459989B2 (en) * | 2012-07-26 | 2016-10-04 | Adobe Systems Incorporated | Method and apparatus for reverse debugging source code using causal analysis |
-
2012
- 2012-07-30 CN CN201210267108.8A patent/CN103577315B/zh not_active Expired - Fee Related
-
2013
- 2013-07-29 US US13/952,751 patent/US8997059B2/en not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101482846A (zh) * | 2008-12-25 | 2009-07-15 | 上海交通大学 | 基于可执行代码逆向分析的漏洞挖掘方法 |
CN102129408A (zh) * | 2011-04-14 | 2011-07-20 | 电子科技大学 | 一种基于记录回放技术的嵌入式软件调试装置和方法 |
Also Published As
Publication number | Publication date |
---|---|
US8997059B2 (en) | 2015-03-31 |
CN103577315A (zh) | 2014-02-12 |
US20140033181A1 (en) | 2014-01-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103577315B (zh) | 反向调试器和反向调试方法 | |
US8024297B2 (en) | Data logging system and method thereof for heterogeneous data | |
CN102096629B (zh) | 经过性断点设置、调试方法和装置 | |
CN101794224B (zh) | 一种基于性质规约模式的软件运行时性质监测方法 | |
CN106598871A (zh) | Linux下的崩溃文件自动化分析方法及系统 | |
CN104252402B (zh) | 一种程序调试方法及装置 | |
CN107665167B (zh) | 程序调试方法、装置及程序开发设备 | |
CN110245190A (zh) | 一种区块数据分段存储方法、终端及介质 | |
JP2008233086A (ja) | 試験装置及び電子デバイス | |
CN110442752A (zh) | 组织架构图生成方法、装置、计算机设备和存储介质 | |
CN109934507A (zh) | 一种业务流程调度的方法及装置 | |
CN108319559A (zh) | 用于控制矢量内存存取的数据处理装置及方法 | |
CN103399775A (zh) | 一种热补丁方法及设备 | |
CN106611084A (zh) | 集成电路的设计方法及装置 | |
CN103473190A (zh) | 一种视频监控系统的控制软件远程升级系统 | |
CN109542444A (zh) | Java应用的监控方法、装置、服务器和存储介质 | |
CN111695238A (zh) | 一种用于将电力系统暂态仿真数据可视化的系统及方法 | |
CN104536878B (zh) | 一种验证并发程序中违反原子性错误是否被正确修复的方法 | |
WO2020073200A1 (zh) | 调试程序的方法和系统 | |
CN104145249B (zh) | 用于调试计算机程序的方法和系统 | |
CN109359093A (zh) | 一种规则文件更新方法和系统 | |
CN107248952A (zh) | 一种业务替代路由确定方法及系统 | |
CN108763039B (zh) | 一种业务故障模拟方法、装置及设备 | |
JP4481783B2 (ja) | シミュレーションモデル作成装置及びシミュレーション装置とシステム並びに方法とプログラム | |
CN108205490B (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 | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170222 Termination date: 20200730 |
|
CF01 | Termination of patent right due to non-payment of annual fee |