一种代码调试方法及装置与流程

文档序号:11918180阅读:247来源:国知局
一种代码调试方法及装置与流程

本发明涉及计算机软件编程技术领域,尤其涉及一种代码调试方法及装置。



背景技术:

IronPython是Python语言的.NET实现。有了IronPython,.NET开发人员可以在自己的软件产品中通过集成IronPython向用户提供Python代码的运行功能,对于某些业务功能需要用户自己通过Python代码定制的场景,IronPython的出现可谓是给.NET开发人员提供了强有力的技术支撑。

但是,.NET开发人员在自己的软件产品中通过集成IronPython向用户提供Python代码的运行功能会遇到一个问题:用户编写完处理具体业务的Python代码提交到软件中运行的时候可能会因编写的Python代码错误导致用户预期的业务功能无法实现,此时用户需要查找自己编写的Python代码中的错误并修正它。用户通过检查Python代码发现代码中几个关键位置存在的疑点,希望Python代码的几个存在疑点的关键位置能够在执行的时候暂停以方便用户分析错误,从而解决代码存在的问题。在传统方案中,如果用户编写的Python代码存在错误,一般是用户自己通过在代码关键位置插入弹框代码来实现代码运行到关键位置时的暂停效果,然后用户再分析代码及代码的运行效果来判断代码错误的位置及原因。

然而,使用向Python代码关键位置插入弹框代码的方式虽然也可以让Python代码在关键位置执行的时候暂停下来,但是这种做法仍然存在一个问题:当用户向Python代码关键位置插入了弹框代码,Python代码运行到插入了弹框代码的关键位置处暂停下来之后,如果用户通过分析代码行为认为代码关键位置后面的某个位置也存在疑点,想在执行到后面的某个位置也能暂停下来的时候,使用传统的向代码插入弹框代码来实现代码运行暂停效果方案只能让已运行的Python代码先停止运行,然后用户手动修改 代码向新发现的可疑位置插入弹框代码然后再重新运行修改后的Python代码等待代码运行到可疑位置处暂停。这种做法对于用户操作极其不便,需要用户频繁的修改Python代码、停止代码运行、重新让代码运行、等待代码运行暂停。



技术实现要素:

有鉴于此,本发明提供一种代码调试方法及装置,主要目的在于简化Python代码的调试过程,通过在调试过程中实时调整代码中的断点位置来快速确定问题代码的位置,从而提升Python代码的调试效率。

为达到上述目的,本发明主要提供如下技术方案:

一方面,本发明提供了一种代码调试方法,该方法包括:

获取用户在代码中设置的断点行号,得到断点集合;

根据所述代码执行的当前行号,判断所述当前行号是否在所述断点集合中;

若存在,则执行中断事件函数,以中断所述代码的执行。

另一方面,本发明还提供了一种代码调试装置,该装置包括:

获取单元,用于获取用户在代码中设置的断点行号,得到断点集合;

判断单元,用于根据所述代码执行的当前行号,判断所述当前行号是否在所述获取单元得到的断点集合中;

执行单元,用于当所述判断单元判断所述当前行号为所述断点行号时,执行中断事件函数,以中断所述代码的执行。

依据上述本发明所提出的代码调试方法及装置,只需要用户确定需要暂停调试的代码行位置,代码程序在执行时就能够自动的识别出用户所选择的暂停位置,并将代码程序停止在该位置上,等待用户的下一步指示,在接收到用户取消暂停的指令后,恢复代码程序的执行,直至运行至下一个调试断点代码行。由于本发明所采用的方法是实时地更新断点集合中的断点行号,因此,能够在代码程序的执行过程中随时的添加或删除用户所需的断点,为代码程序的调试提供了更加灵活的调试方式。相对于现有的代码程序调试方式,本发明不需要用户进行频繁的修改代码,设置插入弹 框来暂停代码程序的执行,而是由用户在代码的调试过程中动态的选择需要暂停的位置,并在用户的控制下恢复代码的运行状态。因此,本发明所采用的代码调试方法及装置能够更快速的确定问题代码的位置,从而提升Python代码的调试效率。

附图说明

通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:

图1示出了本发明实施例提出的一种代码调试方法的流程图;

图2示出了本发明实施例提出的另一种代码调试方法的流程图;

图3示出了本发明实施例提出的一种代码调试装置的组成框图;

图4示出了本发明实施例提出的另一种代码调试装置的组成框图。

具体实施方式

下面将参照附图更详细地描述本发明的示例性实施例。虽然附图中显示了本发明的示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。

本发明实施例提供了一种代码调试的方法,如图1所示,该方法应用于中断停代码执行的代码调试过程,具体步骤包括:

101、获取用户在代码中设置的断点行号,得到断点集合。

针对现有的调试方式的不足,本发明实施例通过获取用户设置的断点位置来确定代码在执行时需要暂停的代码行,并将这些代码行号组成断点集合。对于用户设置的断点位置,是由用户通过鼠标或者是通过触屏在代码编辑器中选择代码中需要暂停的位置,该位置可以是一个,也可以为多个。并且,用户在选择断点位置时,对于代码的当前状态没有限定,可以 是在执行前,提前确定所有断点的位置,也可以是在代码的执行过程中,实时地确定断点的位置。需要说明的是,在代码执行过程中,用户只能设置在当前执行行号之后的代码行行号为断点位置。

不仅如此,用户在设置断点位置的过程中,还包括对代码中增加断点和删除已有断点两种设置,增加断点如上所述,可以在代码中的任意位置设置断点,而删除断点则是在当前标有断点的代码中再次选择标有断点的代码行来取消在该代码行的中断标记。

断点集合中记录了针对该代码的所有用户标记中断的代码行号,并且该集合中的断点行号是实时更新的。根据用户的选择,集合会对其中的断点行号时刻更新,增加新的断点或删除已有的断点。

102、根据代码执行的当前行号,判断该行号是否在断点集合中。

在创建了断点集合后,在进行代码调试时,该代码在每执行一行代码时,都会将该代码行的行号与断点集合中的断点行号进行比对,以判断该行代码在执行后是否需要暂停。对于代码在执行过程中获取代码执行的当前行号的方式本实施例不做具体限定,较简单的方式是在每一行原代码后增加一句调用中断事件函数代码,通过在该调用函数中内置计数器来统计代码执行的行数,将计数器的初始值设置为1,每调用一次该函数就在该计数器中加1,通过读取计算器的值就可确定代码执行的当前行号。

在确定了代码执行的当前行号后,将该当前行号带入到断点集合中遍历进行匹配,如果该行号存在与该集合中,就执行该中断事件函数,将代码的执行状态暂停在当前行;而如果该行号不存在与该集合中,就跳过该中断事件函数继续执行代码的下一行。

103、若当前行号为断点行号,则执行中断事件函数。

当确定代码的当前行号为断点行号后,代码程序将执行所调用的中断事件函数,将代码的执行状态暂停在当前行。该中断事件函数的具体实现方式可以是一个有条件的循环函数,也可以是一个脚本函数,通过编辑脚本来实现暂停状态,本实施例对于该函数的表现方式不做具体限定。

需要说明的是,代码在执行过程中暂停运行的目的在于可以让调试人员能够对已执行的程序所得到的结果进行判断,查看执行的代码中是否按 照预计的结果在执行,如果有问题,则可以退出执行进行代码的修改,在修改后继续调试;而如果没有问题,则应该可以恢复代码程序的执行,继续调试后面的代码。而要恢复代码的执行状态就需要跳出正在运行中的中断事件函数,根据上述的中断事件函数实现方式,可以由用户在中断事件函数中给出停止运行的指令,来跳出循环函数的循环执行过程或跳出脚本函数的暂停状态。从而恢复代码的执行状态。

结合上述的实现方式可以看出,本发明实施例所采用的代码调试方法,只需要用户确定需要暂停调试的代码行位置,代码程序在执行时就能够自动的识别出用户所选择的暂停位置,并将代码程序停止在该位置上,等待用户的下一步指示,在接收到用户取消暂停的指令后,恢复代码程序的执行,直至运行至下一个调试断点代码行。由于本发明实施例所采用的方法是实时地更新断点集合中的断点行号,因此,能够在代码程序的执行过程中随时的添加或删除用户所需的断点,为代码程序的调试提供了更加灵活的调试方式。相对于现有的代码程序调试方式,本发明实施例不需要用户进行频繁的修改代码,设置插入弹框来暂停代码程序的执行,而是由用户在代码的调试过程中动态的选择需要暂停的位置,并在用户的控制下恢复代码的运行状态。因此,本发明实施例所采用的代码调试方法能够更快速的确定问题代码的位置,从而提升Python代码的调试效率。

为了更加详细地说明本发明提出的一种代码调试方法,本发明实施例以使用Python语言编辑代码程序,利用C#语言创建断点集合以及上述的中断事件函数为例进行具体说明,如图2所示,该方法在对代码调试时所包括步骤为:

201、获取用户在Python代码中设置的断点行号,得到断点集合。

断点行号的设置方式有两种:一种是在调试Python代码前选择好需要中断位置的行号,另一种是在调试过程中,在代码执行当前行的后面选择需要中断位置的行号。在具体操作上,可以是用户通过鼠标左键在Python代码中的行号位置进行点击来设置断点,该断点的选择可以是一个或多个,例如,一个100行的Python代码,用户可以在代码编辑器中使用鼠标左键点击第30、60、90行代码,则该代码中的第30、60、90行的行号就被确 定为断点行,代码在执行到该行时会暂定执行。

此外,这些断点行号还会被添加到由C#语言创建的断点集合中。该集合是一个整型数据的集合,记录有代码的行号。将用户选择的代码行号添加到断点集合中还存在两种情况:一种是断点集合中没有该行号,则可以将该行号直接加入集合中,这种定义为断点行号的添加操作;另一种是断点集合中已经存在该行号,则将该行号从断点集合中清除掉,这种定义为断点行号的删除操作。

202、根据Python代码执行的当前行号,判断该行号是否在断点集合中。

要判断代码的执行行号是否为断点行号,还需要进行一系列的前期设置。其中,除了上述的获取断点集合外,还需要在调试之前再创建一个C#脚本调试类的实例scriptDebug,并且给该实例的脚本运行中断事件添加事件处理函数ScriptBreak,其中,C#脚本调试类scriptDebug的代码如下:

之后创建该类的实例scriptDebug,并定义一个C#函数ScriptBreak,将实例scriptDebug的脚本运行中断事件处理函数设置为ScriptBreak,其代码如下:

scriptDebug.ExecuteBreak=ScriptBreak

如此,当实例scriptDebug被调用时,就会调用C#函数ScriptBreak。

之后,在原Python代码的每一行代码后添加代码“scriptDebug.Break()”,从而在Python代码在每运行一行时都会执行所添加的“scriptDebug.Break()”代码,进而调用上述的C#函数ScriptBreak,以实现Python代码的中断机制。

此外,除了上述的设置还需要在C#函数ScriptBreak内部定义一个静态 局部变量currentLine=1,代表正在运行的Python代码行号,初始值为1。由于该Python代码的每行代码后面都被添加了代码“scirptDebug.Break()”,所以Python代码每执行一行,C#函数ScriptBreak都会被调用一次,每次ScriptBreak被调用时记录Python代码执行行号的变量currentLine值都会增加1。因此,Python代码执行的当前行号就是变量currentLine的值,要判断当前行号是否在断点集合中,只需要遍历断点集合中的是否有变量currentLine的值。

203、利用IronPython作用域接口将中断事件函数添加到Python代码的作用域中。

由于scriptDebug是C#实例,如果要在IronPython中调用该scriptDebug的方法Break,则需要将C#实例scriptDebug通过IronPython作用域接口SetVariable(name,value)添加到Python代码运行的作用域中。

204、若当前行号为断点行号,则执行中断事件函数。

当正在运行的Python代码行号存在于由C#创建的断点集合中时,就说明Python代码运行到了断点位置,需要暂停Python代码的运行,即行中断事件函数ScriptBreak。因为Python代码是在IronPython对象中执行的,而IronPython对象在C#程序的当前线程中运行,所以只需编写阻塞C#当前线程运行的代码让其运行即可,相关代码如下:

while(!continue)

{

}

上述代码中变量continue初始值为false,所以循环while会一直执行下去,这样C#当前线程便被阻塞了,相应的运行在当前C#线程中的IronPython对象中的Python代码的运行也将被暂停。

205、根据用户的指令终止中断事件函数的运行,恢复Python代码的执行。

当需要继续执行暂停中的Python代码时,只需要将C#函数内的变量continue值设置为true,则while(!continue){}循环条件便不再成立,循环会退出,这样C#当前线程将解除阻塞,运行在C#当前线程中的IronPython 对象中的Python代码便可以继续运行。

进一步的,作为对上述方法的实现,本发明实施例提供了一种代码调试装置,该装置实施例与前述方法实施例对应,为便于阅读,本装置实施例不再对前述方法实施例中的细节内容进行逐一赘述,但应当明确,本实施例中的装置能够对应实现前述方法实施例中的全部内容。该装置可设置在带有调试功能的代码编辑器中,如图3所示,该装置包括:

获取单元31,用于获取用户在代码中设置的断点行号,得到断点集合;

判断单元32,用于根据所述代码执行的当前行号,判断所述当前行号是否在所述获取单元31得到的断点集合中;

执行单元33,用于当所述判断单元32判断所述当前行号为所述断点行号时,执行中断事件函数,以中断所述代码的执行。

进一步的,如图4所示,所述获取单元31包括:

创建模块311,用于创建断点集合,所述断点集合中记录有用户在代码中设置的断点行号;

获取模块312,用于获取用户选择设置断点位置所在的代码行号;

添加模块313,用于将所述获取模块312获取的代码行号添加到所述创建模块311创建的断点集合中;

删除模块314,用于当所述获取模块312所获取的代码行号已存在于所述断点集合中时,在所述创建模块311创建的断点集合中删除所述代码行号。

进一步的,如图4所示,所述判断单元32包括:

调用模块321,用于根据在所述代码每一行之后添加的中断代码调用所述中断代码中的中断事件函数;

判断模块322,用于在执行所述调用模块321调用的中断事件函数时,判断所述代码执行的当前行号是否在所述断点集合中。

进一步的,所述判断模块322还包括:

设置子模块,用于设置行号计数器,设置初始值为1;

计算子所述,用于在所述代码执行时,每调用一次所述中断事件函数,则为所述设置子模块设置的计数器的值加1,得到所述代码执行的当前行 号;

判断子模块,用于遍历所述断点集合中的断点行号,判断所述计算模块得到的当前行号是否为断点行号。

进一步的,如图4所示,所述执行单元33包括:

第一执行模块331,用于当所述代码调用所述创建模块331设置的中断事件函数,且所述代码执行的当前行号为断点行号时,执行所述中断事件函数;

第二执行模块332,用于根据所述第一执行模块331执行的中断事件函数所调用的调试中断脚本,执行所述调试中断脚本,以中断所述代码的继续执行。

进一步的,如图4所示,所述装置还包括:

终止单元34,用于根据用户的指令终止所述执行单元33所执行的中断事件函数的运行,恢复所述代码的执行。

进一步的,如图4所示,所述终止单元34包括:

获取模块341,用于获取用户的终止指令;

停止模块342,用于根据所述获取模块获取的终止指令停止所述中断事件函数的运行,以便所述代码继续执行。

进一步的,所述装置使用Python代码编辑所述代码,使用C#函数编辑所述中断事件函数。

进一步的,如图4所示,所述装置还包括:

添加单元35,用于在执行中断事件函数之前,利用IronPython作用域接口将所述中断事件函数添加到所述代码的作用域中,所述作用域用于确定函数名在所述代码中的作用范围。

综上所述,本发明实施例所采用的代码调试方法及装置,只需要用户确定需要暂停调试的代码行位置,代码程序在执行时就能够自动的识别出用户所选择的暂停位置,并将代码程序停止在该位置上,等待用户的下一步指示,在接收到用户取消暂停的指令后,恢复代码程序的执行,直至运行至下一个调试断点代码行。由于本发明实施例所采用的方法是实时地更新断点集合中的断点行号,因此,能够在代码程序的执行过程中随时的添 加或删除用户所需的断点,为代码程序的调试提供了更加灵活的调试方式。相对于现有的代码程序调试方式,本发明实施例不需要用户进行频繁的修改代码,设置插入弹框来暂停代码程序的执行,而是由用户在代码的调试过程中动态的选择需要暂停的位置,并在用户的控制下恢复代码的运行状态。因此,本发明实施例所采用的代码调试方法及装置能够更快速的确定问题代码的位置,从而提升Python代码的调试效率。

所述代码调试装置包括处理器和存储器,上述获取单元、判断单元、执行单元和终止单元等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。

处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来简化Python代码的调试过程,通过在调试过程中实时调整代码中的断点位置来快速确定问题代码的位置,从而提升Python代码的调试效率。

存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM),存储器包括至少一个存储芯片。

本申请还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化有如下方法步骤的程序代码:获取用户在代码中设置的断点行号,得到断点集合;根据所述代码执行的当前行号,判断所述当前行号是否在所述断点集合中;若存在,则执行中断事件函数,以中断所述代码的执行;根据用户的指令终止所述中断事件函数的运行,恢复所述代码的执行。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序 产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。

存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。存储器是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质, 可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。

本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1