CN101561779A - 一种调试方法和调试器 - Google Patents
一种调试方法和调试器 Download PDFInfo
- Publication number
- CN101561779A CN101561779A CNA2008100916953A CN200810091695A CN101561779A CN 101561779 A CN101561779 A CN 101561779A CN A2008100916953 A CNA2008100916953 A CN A2008100916953A CN 200810091695 A CN200810091695 A CN 200810091695A CN 101561779 A CN101561779 A CN 101561779A
- Authority
- CN
- China
- Prior art keywords
- branch
- variable
- user
- appointment
- debugger
- 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.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明提供了一种调试方法和一种调试器。所述调试方法包括:在调试过程中接收强制执行分支的用户命令;和响应于所述用户命令,自动地强制执行用户指定的分支。在本发明的一个实施例中,通过直接修改控制分支的处理器状态字,来自动地强制进入用户指定的分支。在本发明的另一实施例中,通过间接修改处理器状态字,来自动地强制进入用户指定的分支。通过自动地强制执行用户指定的分支,本发明的方法使得无需用户反复改变条件表达式中的变量的值,从而显著地降低了调试的任务量,为用户带来了更好的体验,并且减少了调试时间。
Description
技术领域
本发明涉及计算机应用开发领域,更具体地,本发明涉及一种调试方法和调试器。
背景技术
在整个应用程序开发周期中,调试是一项繁琐但却必不可少的任务。在调试过程中,编程人员借助于调试器来跟踪程序的执行过程,以便确定有问题代码的位置,进而对程序代码进行修正以消除错误。
在调试时,通常会出现需要强制执行指令的情况。例如,当程序执行到诸如if、while、case、switch等的条件语句时,用户(即编程人员)可能怀疑程序的问题出现在该条件语句中的某个分支,这时用户会期望进入期望的分支来进行调试。在这种情况下,通常用户需要通过改变条件语句的条件表达式中的变量值,来使程序执行进入到期望的分支。
在变量较少且变量之间的逻辑关系较为简单的情况下,用户可以容易地通过改变这些变量的值而进入期望的分支。然而,在很多情况下,条件表达式中有很多变量,并且变量之间的关系也非常复杂,甚至还可能涉及到复杂的函数。这时,想要确定应该如何设置变量就变得非常困难,尤其是对于诸如过程语言/接口指令(Programlanguage/Machine Instruction,PL/MI)一些老旧代码。通常用户花费了大量精力来改变变量,但是却没有进入期望的分支。这时要想进入期望的分支,用户就必须重新运行程序,并再次尝试改变变量的值。
在现有技术中,已经出现一些允许程序执行退回的调试器,这为用户提供了改变变量值的机会,同时无需重新运行程序。但是,由于变量过多且变量关系过于复杂,因此用户仍然需要尝试很多次,这非常麻烦。另外,在进入期望的分支之前,用户可能已经尝试大量的变量,所以重建用户所处的确切状态很困难,这要求用户在每次程序执行退回时,将已经被改变的值恢复到原来的值。
但是,出于系统完整性的原因,现有技术中更多的调试器并不允许上述的退回操作,诸如IBM System i系列机器就不允许这种退回操作。其原因在于,允许退回操作意味着允许存在不为编译器所知的控制流,这可能会导致系统完整性问题。因此在这种情况下,用户只能通过重新运行程序来获得再次改变变量的值的机会,以便进入期望的分支。
因此在现有技术中,在任何情况下,当需要强制执行指令时,只能由用户以手动方式来改变变量,并且需要反复进行很多次。而且,在每次重新改变变量时,通常还需要重新运行程序,这是非常令人烦恼的过程。
为此,非常需要一种改进的调试方法和调试器,以使用户从上述反复进行的操作中解脱出来。
发明内容
有鉴于此,本发明提供了一种改进的调试方法和调试器,使得程序强制进入用户期望的分支而无需用户改变变量的值。
在本发明的第一方面中,提供了一种调试方法,包括:在调试过程中接收强制执行分支的用户命令;和响应于所述用户命令,自动地强制执行用户指定的分支。
在本发明的一个实施例中,所述强制执行步骤包括:直接修改控制分支的处理器状态字,以使得自动地强制执行用户指定的分支。
在本发明的另一实施例中,所述强制执行步骤包括:间接修改控制分支的处理器状态字,以使得自动地强制执行用户指定的分支。
在本发明的又一个实施例中,所述间接修改处理器状态字步骤包括:为所述条件语句添加强制分支变量;和修改所述强制分支变量,以便强制进入用户指定的分支。
在本发明的再一个实施例中,所述间接修改处理器状态字步骤包括:在编译过程中,获取与所述条件表达式所涉及的变量以及它们之间的逻辑关系;对所述变量和逻辑关系进行分析,以得到为进入用户指定的分支而修改变量的方案;和根据所述得到的方案修改所述变量,以使得自动地强制执行用户指定的分支。
在本发明的第二方面中,提供了一种调试器,包括:命令接收单元,配置用于在调试过程中接收强制执行分支的用户命令;和强制分支单元,配置用于响应于所述用户命令,自动地强制执行用户指定的分支。
根据本发明的调试方法和调试器,可以自动地强制执行用户期望的指令,而无需用户反复改变变量的值,从而显著地降低了调试的任务量,为用户带来了更好的体验,并且减少了调试时间。
附图说明
通过结合附图对本发明的具体实施例进行详细的描述,本发明的上述以及其他方面和优势将更加明显。
在本发明的附图中,相同的附图标识表示相同或者类似的部件,在附图中:
图1示意性地示出了根据本发明一个实施例的调试方法的流程图;
图2示意性地示出了根据本发明另一实施例的调试方法的流程图;
图3示意性地示出了根据本发明又一实施例的调试方法的流程图;
图4示意性地示出了根据本发明再一实施例的调试方法的流程图;
图5示出了在根据本发明的调试方法中使用的语法树的一个实例;
图6示意性地示出了根据本发明一个实施例的调试器的结构方框图;
图7示意性地示出了根据本发明另一实施例的调试器的结构方框图;
图8示意性地示出了根据本发明又一实施例的调试器的结构方框图;
图9示意性地示出了根据本发明再一实施例的调试器的结构方框图;和
图10示意性地示出了可以实现根据本发明的实施例的计算设备的结构方框图。
具体实施方式
在下文中,将参考附图通过实施例对本发明提供的调试方法以及调试器进行详细的描述。
首先,将参考图1来描述根据本发明的调试方法。图1示意性地示出了根据本发明一个实施例的调试方法的流程图。
在步骤101,在调试过程中接收强制执行分支的用户命令。
调试时,程序通常会在用户设定的断点处暂停。这时,可以通过诸如Step Over、Step In等单步执行功能来一步一步地执行断点处以及其后的代码,以便跟踪程序的执行。在本发明的实施例中,如果断点所指定的语句是条件语句,诸如像是if语句、while语句的二分支语句或者像是switch语句或case语句的多分支语句,则在用户期望强制执行分支时,用户可以输入用于强制执行分支的命令,以指定其期望执行的分支。
例如,在一个实施例中,在支持命令行调试的调试环境中,可以接收用户以命令行形式发出的用户命令。例如,用户可以在调试环境中以命令行方式键入调试命令,并在调试命令的参数中指定期望执行的分支,诸如True分支、False分支,或者case、switch语句中的特定分支。
在另一实施例中,可以为用户提供更加友好的界面,诸如调试菜单中的菜单项、位于工具条上的图标按钮、组件板上组件等。例如,可以提供诸如StepTrue、StepFalse、StepCase等类似于Step Over、Step In等菜单项,以供用户选择使用。在这种情况下,用户只需点击所提供菜单中的菜单项StepTrue、StepFalse或者StepCase,选择自己期望执行的操作即可。这种方式与通过命令行来发出用户命令不同,该方式简单、方便,无需用户记忆调试命令及其使用方法。
接着,在步骤102,响应于所述用户命令,自动地强制执行用户指定的分支。
在接收到强制执行指令的用户命令之后,调试器强制执行用户指定的分支,而无需用户再进行任何其他操作。
本发明的调试方法通过自动地强制执行用户指定的分支,使得无需用户反复改变变量的值,从而显著地降低了调试的任务量,为用户带来了更好的体验,并且减少了调试时间。
自动地强制执行用户指定的分支可以通过多种方式实现。例如,可以通过直接改变处理器状态字来实现,或者通过添加强制分支变量并改变所述强制分支变量、通过自动地改变条件语句的条件表达式中所涉及的变量而间接地改变处理器状态字来实现。在中央处理器中,状态寄存器通常存储了用于呈现中央处理器运行程序的状态的若干标志位,诸如零标志位、负标志位、溢出标志位、进位或借位标志位、关中断标志位以及其他机器工作状态标志位。尽管在不同机器对于状态位的规定并不完全相同,但所有的中央处理器都将这些标志位统称为处理器状态字或者程序状态字。特别需要说明的是,在汇编级别,这些处理器状态字总是控制分支的执行。因此,可以通过直接或者间接地改变处理器状态字来自动地强制执行用户指定的分支。
下面,将首先描述通过直接改变处理器状态字来实现的本发明调试方法的实施例。
参考图2,图2示意性地示出了根据本发明另一实施例的调试方法的流程图。需要说明的是,为了清楚起见,图2仅仅示出了图1中强制执行用户指定分支的步骤102的流程的一个实施例。
首先,在步骤201,在编译过程中,确定各个分支的偏移量。由于通过为跳转指令提供偏移量,可以在汇编级别控制程序的跳转,因此需要得到条件语句各个分支的偏移量。
接着,在步骤202,将所述处理器状态字修改为与用户指定的分支的偏移量对应的状态。调试器得到各个分支的偏移量后,查找用户指定分支的偏移量,并利用找到的偏移量来设置处理器状态字,以使程序执行进入到用户指定的分支。例如,可以将找到的偏移量提供给跳转指令,并且通过跳转指令来自动修改所述处理器状态字。此外,根据需要,调试器还可以通过CPU提供的其他机器指令来相应地修改处理器状态字中的与该强制执行相关的信息,诸如在跳转过程中需要屏蔽中断时,可以利用机器指令来设置处理器状态字中的中断屏蔽位。
由于处理器状态字控制着分支的执行,因此处理器状态字被修改为与指定分支的偏移量对应的状态之后,程序就可以在步骤203自动地进入用户指定的分支。
图2中示出的实施例直接修改了在汇编级别控制着分支的处理器状态字而在汇编级别实现程序跳转的改变,藉此自动地强制执行用户指定的分支。
接下来,将描述通过间接改变处理器状态字来实现的本发明调试方法的实施例。
参考图3,图3示意性地示出了根据本发明又一实施例的调试方法的流程图。与图2类似,图3仅仅示出了图1中强制执行用户指定分支的步骤102的流程的一个实施例。
在步骤301,为所述条件语句添加强制分支变量。为了能够强制执行用户指定的分支,可以为条件语句添加强制分支变量,以便通过该强制分支变量来控制条件语句中条件表达式的值。
在一个实施例中,可以在编译期间将用于控制条件表达式的值的强制分支变量直接添加到条件语句中的条件表达式中。在这种情况下,由编译器来自动添加强制分支变量,用户并不知道该强制分支变量的添加操作,因此该操作对于用户是透明的。在编译期间,编译器可以根据条件语句中的原始条件表达式生成带有强制分支变量的条件表达式,并利用所生成的条件表达式来替换条件语句中的原始条件表达式,从而实现所述强制分支变量的添加。
例如,对于if、while等二分支条件语句,如果原始表达式用original_condition来表示,则在编译期间,可以生成用于替换原始条件表达式的下列条件表达式:
((original_condition)||ForceTureVar)&&ForceFalseVar其中“||”为逻辑或运算和“&&”为逻辑与运算,ForceTureVar和ForceFalseVar都是布尔变量,ForceTureVar是True强制分支变量,ForceFalseVar是False强制分支变量。优选地,将ForceTureVar的初始值设置为0(即False),并且将ForceFalseVar的初始值设置为1(即True),以使得所述原始条件表达式的逻辑值不受到所添加的强制分支变量的影响。
另外,对于case、switch等多分支条件语句,如果原始条件表达式用original_condition来表示,则生成的用于替换原始条件表达式的条件表达式可以是:
(original_condition)*ForceCtrlVar1+(ForceCaseVar)*ForceCtrlVar2其中“*”为乘法运算,“+”为加法运算,ForceCaseVar是多分支强制分支变量,其数据类型与原始条件表达式original_condition的结果值的数据类型相同;ForceCtrlVar1和ForceCtrlVar1都是布尔变量,它们同样是强制分支变量,用于控制原始表达式original_condition和多分支强制分支变量ForceCaseVar中哪一个起作用。优选地,将ForceCtrlVar1设置的初始值为1,并且将ForceCtrlVar2的初始值设置为0,以使得所述原始条件表达式的值不受所添加的强制分支变量的影响。
在另一个实施例中,如果程序语言支持宏定义,则可以通过宏定义来实现上述的强制分支变量的添加。下面是C语言形式的宏定义的一个实例。
#ifdef DEBUG
#ifndef CONDITIONAL_DEBUG
#def CONDITIONAL_DEBUG
Volatile int ForceTureVar=0 //强制进入true分支的控制变量
Volatile int ForceFalseVar=1 //强制进入false分支的控制变量
Volatile int ForceCtrlVar1=1 //进入默认case分支的控制变量
Volatile int ForceCtrlVar2=0 //进入指定case分支的控制变量
Volatile int ForceCaseVar //指定case分支的控制变量
#define if(x)(((x)||ForceTureVar)&&ForceFalseVar)
#define while(x)(((x)||ForceTureVar)&&ForceFalseVar)
#define switch(x)((original_condition)*ForceCtrlVar1+(ForceCaseVar)*ForceCtrlVar2)
#endif
#endif
通过上述宏定义,编译器在进行编译时通过文本替换将原始条件表达式替换为带有强制分支变量的条件表达式。通过在加入该宏定义,可以在编译时自动完成强制分支变量的添加,而无需修改编译器和调试器。
该宏定义也可以过代码编辑器添加到源代码中。可以在代码编写的过程中,自动将该宏定义包含在文件中,特别是头文件中。此外,还可以通过手工键入上述代码来实现强制分支变量的添加。
然后,在步骤302,修改所述强制分支变量,以便强制进入用户指定的分支。
当从用户接收到强制执行分支的命令时,调试器根据用户命令来修改所述强制分支变量。例如,对于if、while等二分支条件语句,当用户命令指示要求执行True分支时,调试器则将ForceTureVar设置为1;相反,当用户命令指示要求执行False分支时,调试器则将ForceFalseVar设置为0。而对于多分支条件语句,诸如switch、case等,调试器可以将ForceCaseVar设置为用户指定分支的常量表达式,将ForceCtrlVar1设置为0,并且ForceCtrlVar2设置为1,从而不论原始条件表达式的值如何都使得ForceCaseVar决定多分支语句中条件表达式的值。
在设置了所述强制分支变量之后,条件表达式的值将为成为用户期望的值,于是程序执行进入用户指定的分支。
接着,优选地在步骤303,在强制进入用户指定的分支后,将所设置的强制分支变量设置回所述初始值,以便不使随后的程序执行受到所述强制分支变量的影响。需要说明的是,可以在程序执行进入用户指定的分支之后的任何适当时刻,将所设置的强制分支变量设置回所述初始值,例如在进入所述用户指定的分支时、在要离开用户指定的分支时、或者前述两个时刻中间的任何时刻。
图3中示出的实施例通过为条件语句添加强制分支变量以及修改所述强制变量而改变了条件表达式的值,从而自动地强制执行用户指定的分支。
需要理解的是,虽然在上述的实施例中,并未直接改变处理器状态字,然而对强制分支变量的改变,却间接地在汇编级别改变了处理器状态字,从而使得自动地强制执行用户指定的分支。因此这是一种间接改变处理器状态字的方式。
此外,图4还示意性地示出了根据本发明的再一实施例的调试方法的流程图。与图2和图3类似,图4仅仅示出了图1中强制执行用户指定分支的步骤102的流程的一个实施例。
首先在步骤401,在编译过程中,获取与所述条件表达式所涉及的变量以及它们之间的逻辑关系相关的信息。
在编译过程中,可以根据条件语句的条件表达式获取其中的变量以及这些变量之间的关系。例如,可以形成表示变量以及这些变量之间的关系的语法树。为了便于理解,下面将通过一个简单的实例来描述。
举例来讲,对于条件表达式“x>y||z”,在编译器期间,可以生成如图5所示的代表该条件表达式的语法树。如图5所示,语法树包括5个节点,即节点501-505,其中节点501和502是代表变量之间的关系的运算符“||”和“>”;节点503、504和505是条件表达式所涉及的变量x、y和z。从图5可以看出,所示的语法树可以是二叉树,节点501是根节点,并且根节点501包括两个子树,即由节点502、503和504构成的左子树以及由节点505构成的右子树。
接着,在步骤402,对所述变量和逻辑关系进行分析,以得到为进入用户指定的分支而修改变量的方案。
在条件表达式运算时,各个运算符都具有一定的优先级,例如逻辑运算符“||”和“&&”的优先级低于“>”、“<”、“==”等关系运算符,而“!”高于算术运算符。例如,对于图5所示的语法树,其中“>”是关系运算符,其运算优先级高于逻辑运算符“||”,即运算时首先进行关系运算“>”,然后才进行逻辑运算“||”。因此,在执行分析时,可以基于这种性质采用适当的策略进行分析,诸如可以以与优先级相反的顺序进行分析。例如,对于图5所示的语法树,可以从运算优先级低的逻辑运算符“||”开始。
下面,将以图5的语法树为例来描述变量分析的过程。需要理解的是,图5描述的仅仅是一个简单的实例,而实际应用中,条件表达式所涉及变量及其变量之间的关系可能要比该实例复杂得多。
参考图5,对于图5中的语法树,如果用户期望进入True分支,则首先从根节点501对逻辑运算符“||”进行分析,根据逻辑运算符“||”的性质,要使结果为1,则需要使由节点502、503和504构成的左子树或者由节点505构成的右子树中任何一个的运算值为1。因此,可以设法使左子树的运算值为1,或者使右子树的运算值为1。为此,可以选择左子树进行进一步的分析。对于左子树,节点503和节点504所表示的变量x和y之间的关系是“>”,因此要使其运算值为1,则需要满足x>y,藉此得到一种变量设置方案,即分别设置x、y使其满足x大于y。同样,可以选择右子树来进行进一步的分析。对于右子树,只有一个代表变量z的节点505,因此要使其运算值为1,只需使z为1即可,这样也可以得到一种变量设置方案。
优选地,在可以对两个子树中的任何一个进行进一步分析的情况下,在进一步分析之前,可以对分析左子树、右子树的工作量进行估计,并选择工作量较小的子树进行分析。例如,统计左子树、右子树的节点数目,并选择节点数目较少的子树来分析。或者,可以根据其中是否涉及函数,或者是否包含有能够决定整体或者局部逻辑值的变量来进行选择。备选地,在这种情况下,还可以指定总是对左子树或者右子树其中一个进行分析。
另一方面,如果用户期望进入False分支,则首先分析逻辑运算符“||”,根据逻辑运算符“||”的性质,要使结果为0,则需要左子树或者右子树中任何一个的运算值都为0。然后,分别对左子树和右子树进行进一步的分析。对于左子树,要使其运算值为0,则需要满足x<=y。而对于右子树,要使其运算值为0,只需使z为0。因此,可以得到变量设置的方案,即设置x、y使其满足x<=y,并且将z设置为0。
接着,在步骤403,根据所述得到的方案修改条件语句中所涉及的变量,以使得自动地强制执行用户指定的分支。
在强制进入用户指定的分支后,可以将已被设置的变量设置回原来的值,以便变量的设置不会影响后续程序的执行。
图4中示出的实施例的方法通过对条件表达式所涉及的变量及这些变量之间的关系进行分析来得到修改所述变量的方案以及根据所得的方案自动修改变量,来自动地强制执行用户指定的分支。
虽然在上述的实施例中,并未直接改变处理器状态字,然而改变条件表达式所涉及的变量,以间接的方式在汇编级别改变处理器状态字,从而使得自动地强制执行用户指定的分支。因此这是一种间接改变处理器状态字的方式。
需要指出的是,在与图4相关的实施例的描述中,通过语法树来描述变量及其之间的关系,但是并发明并不限于此,本发明还可以利用其他任何适当的结构来描述这些变量及其之间的关系。另外,还需要指出的是,本发明中给出的变量分析的策略仅仅是一种示例,本发明并不局限于此,还可以使用其他任何适当的策略来分析变量。
下面,将参考图6-9对本发明提供的调试器进行详细的描述。需要说明的是,根据本发明的调试器可以是专用的调试工具。根据本发明的调试器还可以是集成开发环境,包括编译器、编辑器以及调试器。
参考图6,图6示出了根据本发明一个实施例的调试器的结构方框图。图6中示出的调试器600包括命令接收单元601和强制分支单元602,其中命令接收单元601配置用于在调试过程中接收强制执行分支的用户命令,强制分支单元602,配置用于响应于所述用户命令,自动地强制执行用户指定的分支。
本发明的调试器通过强制分支单元602自动地强制执行用户指定的分支,使得无需用户反复改变变量的值,从而显著地降低了调试的任务量,为用户带来了更好的体验,并且减少了调试时间。
接着参考图7,图7示出了根据本发明另一实施例的调试器700的结构方框图。图7中示出的调试器700包括命令接收单元701和强制分支单元702,其中命令接收单元701与图6中的命令接收单元601相同,其配置用于在调试过程中接收强制执行分支的用户命令。而与图6的调试器600不同的是,强制分支单元702包括偏移量确定单元703、处理器状态字修改单元704和分支执行单元705。在该实施例中,偏移量确定单元703配置用于在编译过程中,确定各个分支的偏移量;处理器状态字修改单元704配置用于将所述处理器状态字修改为与用户指定的分支的偏移量对应的状态。该实施例的偏移量确定单元703和处理器状态字修改单元704的具体操作可以参考与图2相关的描述。
图7中示出的调试器700通过直接改变在汇编级别控制分支的处理器状态字,使得自动地强制执行用户指定的分支。
下面,将描述通过间接修改处理器状态字来自动强制执行用户指定分支的调试器的实施例。
参考图8,图8示出了根据本发明的另一实施例的调试器800的结构方框图。图8中示出的调试器800包括命令接收单元801和强制分支单元802,其中命令接收单元801与图6中的命令接收单元601相同,其配置用于在调试过程中接收强制执行分支的用户命令。而与图6所示的调试器600不同的是,强制分支单元802包括强制分支变量添加单元803和强制分支变量修改单元804。在该实施例中,强制分支变量添加单元803配置用于为所述条件语句添加强制分支变量,强制分支变量修改单元804配置用于修改所述强制分支变量,以便强制进入用户指定的分支。
在一个实施例中,强制分支变量添加单元803在编译器间将所述强制分支变量添加到条件语句的条件表达式中。
在另一实施例中,强制分支变量添加单元803通过宏定义来实现强制分支变量的添加。因此在该实施例中,强制分支变量添加单元803可以在代码编辑器中实现。
优选地,强制分支变量添加单元803将所述强制分支变量的初始值设置成使得所述条件表达式的值不受影响。优选地,在进入所述用户指定的分支后,可以由强制分支变量修改单元804将所述强制分支变量设置回所述初始值,以使随后的程序执行不受影响。
该实施例的强制分支变量添加单元803和强制分支变量修改单元804的具体操作可以参考与图3相关的描述。
图8中示出的调试器800通过为条件语句添加强制分支变量并修改所述强制分支变量而间接地改变在汇编级别控制分支的处理器状态字,从而使得自动地强制执行用户指定的分支。
下面将参考图9,图9示出了根据本发明的另一实施例的调试器900的结构方框图。图9中示出的调试器900包括命令接收单元901和强制分支单元902,其中命令接收单元901与图6中的命令接收单元601相同,其配置用于在调试过程中接收强制执行分支的用户命令。而与图6所示的调试器600不同的是,强制分支单元902包括变量信息获取单元903、变量分析单元904和变量修改单元905。在该实施例中,变量信息获取单元903配置用于在编译过程中,获取与所述条件表达式所涉及的变量以及它们之间的逻辑关系;变量分析单元904配置用于对所述变量和逻辑关系进行分析,以得到为进入用户指定的分支而修改变量的方案;变量修改单元905配置用于根据所述得到的方案修改所述变量,以使得自动地强制执行用户指定的分支。该实施例的变量信息获取单元903、变量分析单元904和变量修改单元905的具体操作可以参考与图4相关的描述。
图9中示出的实施例通过对条件表达式所涉及的变量及这些变量之间的关系进行分析来得到修改所述变量的方案以及根据所得的方案自动修改变量,来自动地强制执行用户指定的分支。
下面,将参考图10来描述可以实现本发明的计算机设备。图10示意性示出了可以实现根据本发明的实施例的计算设备的结构方框图。
图10中所示的计算机系统包括CPU(中央处理单元)1001、RAM(随机存取存储器)1002、ROM(只读存储器)1003、系统总线1004、硬盘控制器1005、键盘控制器1006、串行接口控制器1007、并行接口控制器1008、显示器控制器1009、硬盘1010、键盘1011、串行外部设备1012、并行外部设备1013和显示器1014。在这些部件中,与系统总线1004相连的有CPU 1001、RAM 1002、ROM 1003、硬盘控制器1005、键盘控制器1006、串行接口控制器1007、并行接口控制器1008和显示器控制器1009。硬盘1010与硬盘控制器1005相连,键盘1011与键盘控制器1006相连,串行外部设备1012与串行接口控制器1007相连,并行外部设备1013与并行接口控制器1008相连,以及显示器1014与显示器控制器1009相连。
图10所述的结构方框图仅仅为了示例的目的而示出的,并非是对本发明的限制。在一些情况下,可以根据需要添加或者减少其中的一些设备。
此外,本发明的实施例可以以软件、硬件或者软件和硬件的结合来实现。硬件部分可以利用专用逻辑来实现;软件部分可以存储在存储器中,由适当的指令执行系统,例如微处理器或者专用设计硬件来执行。
虽然已经参考目前考虑到的实施例描述了本发明,但是应该理解本发明不限于所公开的实施例。相反,本发明旨在涵盖所附权利要求的精神和范围之内所包括的各种修改和等同布置。以下权利要求的范围符合最广泛解释,以便包含所有这样的修改及等同结构和功能。
Claims (20)
1.一种调试方法,包括:
在调试过程中接收强制执行分支的用户命令;和
响应于所述用户命令,自动地强制执行用户指定的分支。
2.根据权利要求1所述的调试方法,自动地强制执行用户指定的分支的步骤进一步包括直接修改控制分支的处理器状态字,以使得自动地强制执行用户指定的分支。
3.根据权利要求2所述的调试方法,其中所述直接修改处理器状态字包括:
在编译过程中,确定各个分支的偏移量;和
将所述处理器状态字修改为与用户指定的分支的偏移量对应的状态。
4.根据权利要求1所述的调试方法,自动地强制执行用户指定的分支的步骤进一步包括其中间接修改控制分支的处理器状态字,以使得自动地强制执行用户指定的分支。
5.根据权利要求4所述的调试方法,其中所述间接修改处理器状态字包括:
为所述条件语句添加强制分支变量;和
修改所述强制分支变量,以便强制进入用户指定的分支。
6.根据权利要求5所述的调试方法,其中所述添加强制分支变量包括:
在编译期间,将所述强制分支变量添加到所述条件语句中的条件表达式;或利用宏定义将所述强制分支变量添加到所述条件语句中的条件表达式。
7.根据权利要求6所述的调试方法,其中所述宏定义通过代码编辑器添加到源代码中。
8.根据权利要求5至7任一项所述的调试方法,其中设置所述强制分支变量的初始值,以使得所述条件表达式的值不受所述强制分支变量的影响。
9.根据权利要求8所述的调试方法,进一步包括:
在强制进入所述用户指定的分支后,将所述强制分支变量设置回所述初始值。
10.根据权利要求4所述的调试方法,其中所述间接修改包括:
在编译过程中,获取与所述条件表达式所涉及的变量以及它们之间的逻辑关系;
对所述变量和逻辑关系进行分析,以得到为进入用户指定的分支而修改变量的方案;和
根据所述得到的方案修改所述变量,以使得自动地强制执行用户指定的分支。
11.一种调试器,包括:
命令接收单元,配置用于在调试过程中接收强制执行分支的用户命令;和
强制分支单元,配置用于响应于所述用户命令,自动地强制执行用户指定的分支。
12.根据权利要求11所述的调试器,其中所述强制分支单元配置用于直接修改控制分支的处理器状态字,以使得自动地强制执行用户指定的分支。
13.根据权利要求12所述的调试器,其中所述强制分支单元配置包括:
偏移量确定单元,配置用于在编译过程中,确定各个分支的偏移量;和
处理器状态字修改单元,配置用于将所述处理器状态字修改为与用户指定的分支的偏移量对应的状态。
14.根据权利要求11所述的调试器,其中所述强制分支单元配置用于间接修改控制分支的处理器状态字,以使得自动地强制执行用户指定的分支。
15.根据权利要求14所述的调试器,其中所述强制分支单元包括:
强制分支变量添加单元,配置用于为所述条件语句添加强制分支变量;和
强制分支变量修改单元,配置用于修改所述强制分支变量,以便强制进入用户指定的分支。
16.根据权利要求15所述的调试器,其中所述强制分支变量添加单元在编译期间将所述强制分支变量添加到所述条件语句中的条件表达式;或
所述强制分支变量添加单元利用宏定义将所述强制分支变量添加到所述条件语句中的条件表达式。
17.根据权利要求16所述的调试器,其中所述强制分支变量添加单元在代码编辑器中实现。
18.根据权利要求15至17任一项所述的调试器,其中所述强制分支变量的初始值被设置成使得所述条件表达式的值不受所述强制分支变量的影响。
19.根据权利要求18所述的调试器,其中在进入所述用户指定的分支后,所述强制分支变量被设置回所述初始值。
20.根据权利要求14所述的调试器,其中所述强制分支单元包括:
变量信息获取单元,配置用于在编译过程中,获取与所述条件表达式所涉及的变量以及它们之间的逻辑关系;
变量分析单元,配置用于对所述变量和逻辑关系进行分析,以得到为进入用户指定的分支而修改变量的方案;和
变量修改单元,配置用于根据所述得到的方案修改所述变量,以使得自动地强制执行用户指定的分支。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA2008100916953A CN101561779A (zh) | 2008-04-14 | 2008-04-14 | 一种调试方法和调试器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA2008100916953A CN101561779A (zh) | 2008-04-14 | 2008-04-14 | 一种调试方法和调试器 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101561779A true CN101561779A (zh) | 2009-10-21 |
Family
ID=41220592
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNA2008100916953A Pending CN101561779A (zh) | 2008-04-14 | 2008-04-14 | 一种调试方法和调试器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101561779A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102110046A (zh) * | 2009-12-23 | 2011-06-29 | 北京中电华大电子设计有限责任公司 | 一种仿真工具的c语言单步调试实现方法 |
CN102279789A (zh) * | 2010-06-13 | 2011-12-14 | 三星电子(中国)研发中心 | 生产阶段嵌入式系统的调试系统及其调试方法 |
CN102411534A (zh) * | 2011-07-25 | 2012-04-11 | 中国科学院声学研究所 | 一种断点调试方法和调试器 |
CN101794252B (zh) * | 2009-12-23 | 2013-03-13 | 张曙光 | 一种在源程序层次实现运算符单步调试的方法 |
WO2014023069A1 (zh) * | 2012-08-10 | 2014-02-13 | 国网浙江省电力公司电力科学研究院 | 一种反编译数据流分析中的寄存器清除方法及系统 |
-
2008
- 2008-04-14 CN CNA2008100916953A patent/CN101561779A/zh active Pending
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102110046A (zh) * | 2009-12-23 | 2011-06-29 | 北京中电华大电子设计有限责任公司 | 一种仿真工具的c语言单步调试实现方法 |
CN101794252B (zh) * | 2009-12-23 | 2013-03-13 | 张曙光 | 一种在源程序层次实现运算符单步调试的方法 |
CN102279789A (zh) * | 2010-06-13 | 2011-12-14 | 三星电子(中国)研发中心 | 生产阶段嵌入式系统的调试系统及其调试方法 |
CN102279789B (zh) * | 2010-06-13 | 2014-02-05 | 三星电子(中国)研发中心 | 生产阶段嵌入式系统的调试系统及其调试方法 |
CN102411534A (zh) * | 2011-07-25 | 2012-04-11 | 中国科学院声学研究所 | 一种断点调试方法和调试器 |
CN102411534B (zh) * | 2011-07-25 | 2014-12-31 | 中国科学院声学研究所 | 一种断点调试方法和断点调试装置 |
WO2014023069A1 (zh) * | 2012-08-10 | 2014-02-13 | 国网浙江省电力公司电力科学研究院 | 一种反编译数据流分析中的寄存器清除方法及系统 |
US9405519B2 (en) | 2012-08-10 | 2016-08-02 | Electric Power Research Institute Of State Grid Zhejiang Electric Power Company | Method and system for register clearing in data flow analysis in decompilation |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109254776B (zh) | 多语言代码编译方法及编译器 | |
US6243857B1 (en) | Windows-based flowcharting and code generation system | |
US8656352B2 (en) | System and method for synchronized workflow management | |
US6658649B1 (en) | Method, apparatus and article of manufacture for debugging a user defined region of code | |
JPS63181033A (ja) | プログラム自動生成方式 | |
CN101561779A (zh) | 一种调试方法和调试器 | |
WO2018047620A1 (ja) | 実行可能プログラム作成装置、実行可能プログラム作成方法、および、実行可能プログラム作成プログラム | |
Gestwicki et al. | Jive: Java interactive visualization environment | |
CN110554861B (zh) | 具有编译和读取-评估-打印-循环操作的软件开发环境 | |
US20080127061A1 (en) | Method and system for editing code | |
US9612829B2 (en) | System and method for pattern based services extraction | |
CN110442520B (zh) | 一种基于plc编程语言的交叉调试系统及方法 | |
Schubert et al. | Into the woods: Experiences from building a dataflow analysis framework for C/C++ | |
Licata et al. | The feature signatures of evolving programs | |
Samara | A practical approach for detecting logical error in object oriented environment | |
Dorninger et al. | Automated reengineering of industrial HMI screens by static analysis | |
KR101585048B1 (ko) | 다이어그램 기반 알고리즘 시뮬레이션 시스템 | |
KR101303866B1 (ko) | 기판 처리 장치의 모니터링 방법 | |
Huber et al. | A generic approach for static code analysis of PLC-programs | |
JPS62293305A (ja) | Faコントロ−ラのソフトウエア開発装置 | |
Tadonki | Universal Report: a generic reverse engineering tool | |
KR100250484B1 (ko) | 병렬프로그램 성능 감시기에서 사건 표현식에 의한 사건데이터 처리 방법 | |
Frakes | A Software Engineering Methodology for the Unix/C Environment | |
Finsterwalder et al. | A graphical matrix editor to be used in ANDECS/MATLAB computation environments | |
Keum et al. | Integrated environment based on object-oriented methodology for real-time systems |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
AD01 | Patent right deemed abandoned |
Effective date of abandoning: 20091021 |
|
C20 | Patent right or utility model deemed to be abandoned or is abandoned |