CN105701006B - 用于程序调试中的变量跟踪的方法和系统 - Google Patents
用于程序调试中的变量跟踪的方法和系统 Download PDFInfo
- Publication number
- CN105701006B CN105701006B CN201410710926.XA CN201410710926A CN105701006B CN 105701006 B CN105701006 B CN 105701006B CN 201410710926 A CN201410710926 A CN 201410710926A CN 105701006 B CN105701006 B CN 105701006B
- Authority
- CN
- China
- Prior art keywords
- variable
- expression
- assignment
- expression formula
- formula
- 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
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
- G06F11/3636—Software debugging by tracing the execution of the program
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
技术领域
本发明的实施例总体上涉及程序开发领域,并且特别涉及用于程序调试中的变量跟踪的方法和装置。
背景技术
在程序开发过程中,程序员需要对所编制的程序进行调试(debugging),以发现程序源代码中的语法和/或逻辑错误。调试器(debugger)是用于执行调试的常见工具。例如,在集成开发环境(IDE)中通常提供专门的调试器。在调试过程中经常需要执行变量跟踪(variable tracking)。
具体而言,在调试过程中,程序员往往需要确认给定变量的值是否处在合理范围内。目前,可以使用监测点(watch point)来跟踪变量的值。以C或者C++语言为例,程序员可以使用assert之类的语句使程序的运行中止于指定位置。继而,调试器可以获取分配给待检查变量的存储地址中实际存储的值,以供用户查看。监测点实质上是一种内存断点。这样,程序员可以查看变量的值以及其他相关信息。
然而,在这种传统解决方案中,为了跟踪变量值的变化,程序员必须针对程序中所有可能改变变量值的赋值表达式而设置监测点。而且,可能影响变量值的赋值表达式通常作用于不同变量和/或位于不同的函数中。这不仅增加了程序员的负担,而且不利于变量跟踪过程的自动化。而且,在找到导致变量值的异常改变的根源之前,程序的执行可能被多次中断。
发明内容
总体上,本发明的实施例提出一种用于程序调试中的变量跟踪的技术方案。
在本发明的一个方面,提供一种用于程序调试中的变量跟踪的方法。所述方法包括:确定待跟踪的第一变量以及与所述第一变量相关联的待监测的第一表达式;对所调试的程序代码执行逆向扫描以搜索对所述第一变量进行赋值的赋值表达式;以及响应于找到所述赋值表达式,在包含所述赋值表达式的赋值语句之后,设置与所述第一表达式相关联的监测点以便检查所述第一表达式是否成立。
在另一方面,提供一种用于程序调试中的变量跟踪的系统。所述系统包括:目标确定单元,被配置为确定待跟踪的第一变量以及与所述第一变量相关联的待监测的第一表达式;扫描单元,被配置为对所调试的程序代码执行逆向扫描以搜索对所述第一变量进行赋值的赋值表达式;以及监测点设置单元,被配置为响应于找到所述赋值表达式,在包含所述赋值表达式的赋值语句之后,设置与所述第一表达式相关联的监测点以便检查所述第一表达式是否成立。
根据本发明的实施例,调试器能够自动地添加监测点,从而以有效且高效的方式发现导致变量值异常的根源。本发明的其他特征和优点将通过下文描述而变得容易理解。
附图说明
通过结合附图对本发明示例性实施方式进行更详细的描述,本发明的上述以及其它目的、特征和优势将变得更加明显其中:
图1示出了适于用来实现本发明实施例的示例性计算机系统/服务器的示意性框图;
图2示出了包含待跟踪变量的程序代码片段的示意图;
图3示出了根据本发明实施例的用于程序调试中的变量跟踪的方法的示意性流程图;
图4示出了根据本发明实施例的用于程序调试中的变量跟踪的方法的示意性流程图;
图5示出了利用根据本发明的实施例进行处理的程序代码片段的示意图;
图6示出了包含循环结构的程序代码片段的示意图;以及
图7示出了根据本发明实施例的用于程序调试中的变量跟踪的系统的示意性框图。
在附图中,相同或相似的标号被用来表示相同或相似的元素。
具体实施方式
下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
图1示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的方框图。图1显示的计算机系统/服务器12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图1所示,计算机系统/服务器12以通用计算设备的形式表现。计算机系统/服务器12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。
总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。
计算机系统/服务器12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机系统/服务器12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30和/或高速缓存存储器32。计算机系统/服务器12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图1未显示,通常称为“硬盘驱动器”)。尽管图1中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如CD-ROM,DVD-ROM或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。
具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括-但不限于-操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。
计算机系统/服务器12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机系统/服务器12交互的设备通信,和/或与使得该计算机系统/服务器12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并且,计算机系统/服务器12还可以通过网络适配器20与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与计算机系统/服务器12的其它模块通信。应当明白,尽管图中未示出,可以结合计算机系统/服务器12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
下面将详细描述本发明实施例的机制和原理。除非特别声明,在下文和权利要求中使用的术语“基于”表示“至少部分地基于”。术语“包括,,表示开放性包括,即“包括但不限于”。术语“多个”表示“两个或更多”。术语“一个实施例”表示“至少一个实施例”。术语“另一实施例,,表示“至少一个另外的实施例”。其他术语的定义将在下文描述中给出。
此外,在此使用的“第一”、“第二”等术语仅仅是为了区分所指代的对象,并未意在施加顺序、时间、空间或者任何其他方面的限制。例如,代码中的“第一表达式”并非必须是代码中的首个表达式,也未必位于“第二表达式”之前。而且,除非特别声明,这样的术语并非一定指代不同的对象。例如,“第一表达式”和“第二表达式”可以是不同的表达式,也可以是相同的表达式。
为了更清楚地阐释本发明的机制和原理,下面将首先描述在传统方案中如何实现对变量的跟踪。参见图2,以C++语言编写的程序代码片段200包含函数police_chase 210、sentence 220和find_suspect 230。函数sentence以两个整型(int)变量guy和year为参数。在函数police_chase 210中,以整型变量suspect为参数调用函数sentence 220。
在函数sentence 220中,在语句225处设置监测点以便检查变量guy的值大于或者等于0。在此例中,断言语句“assert”被插入程序代码中。由此,程序的执行将在此中断,使得调试器可以获取分配给待检查变量的存储地址中实际存储的值。断言语句的工作原理是本领域已知的,在此不再赘述。换言之,如果变量guy的值在语句225处小于0,则认为变量值发生异常。
如果调试器在语句225的监测点发现异常,在传统方案中,需要在所有可能改变guy值的位置以及能够影响guy值的赋值语句处设置监测点,以便找到异常的根源。例如,在函数police_chase 210中,在语句212、214和216处,均有可能改变或者影响变量suspect的值,从而影响函数sentence 220中变量guy的值。因此,需要设置多个监测点来跟踪变量suspect。
而且,可以看到,语句212调用另一函数find_suspect 230来给变量suspect赋值。在函数find_suspect 230中,整型变量candidate的值是该函数的返回值。因此,在函数find_suspect230中,需要在给变量candidate赋值的语句235以及任何其他可能改变变量candidate值的赋值语句处设置监测点。
在这种传统方案中,程序员必须以人工方式添加这些监测点。这是因为,目前已知的任何调试器或者调试脚本均无法跨函数确定变量guy、suspect和candidate之间的关联关系。因此,监测点无法被自动添加到正确的位置。而且,假设导致变量suspect的值发生异常的根源是语句216。此时,在该语句之前的各个位置处(例如语句212和214处)设置的监测点所导致的程序执行的中断都将增加程序员在调试过程中的负担,使得调试过程非常繁琐。
为了解决上述以及其他潜在问题,本发明的实施例提供了一种用于程序调试中的变量跟踪方法。参考图3,其示出了根据本发明的一个示例性实施例的用于程序调试中的变量跟踪的方法300的示例性流程图。在一个实施例中,方法300可以由调试器调用和执行。方法300从较高的抽象级别给出了本发明所提出的变量跟踪的机制的概况。
方法300开始于步骤S310,在此对包含待跟踪变量的程序代码片段进行正向处理,以便收集与变量的别名(Alias)和/或用于赋值语句的控制流有关的运行时信息。以此方式,可以避免在监测点的自动设置过程中可能出现的、由变量别名和/或控制流(例如,循环)而引起的错误或漏检。步骤S310的具体实现将在下文详细描述。
将会理解,步骤S310是可选的,并且因此在图中以虚线示出。例如,在待跟踪的变量不存在别名和/或程序片段中不包括循环之类的控制流时,步骤S310可被省略。
在步骤S320,在程序代码中进行逆向扫描,以便在所有改变待跟踪变量的值的位置处,自动地设置针对有关表达式的监测点。根据本发明的实施例,用于收集运行时信息的步骤S310是按照程序的执行顺序执行的。在某些情况下,也可以找代码顺序执行。与此相反,根据本发明的实施例,步骤S320按照程序的执行顺序或者代码顺序的逆序执行。
根据本发明的实施例,在一个函数的函数体内,逆向扫描按照从最后一行代码到第一行代码的顺序执行扫描。在不同的函数之间,按照函数调用顺序的逆序来执行扫描。例如,如已知的,当程序执行时,将会创建运行栈。程序执行过程中所涉及到的函数按照调用顺序被压入堆栈中。在一个实施例中,可以按照从函数运行栈的栈顶到栈底的顺序,依次在相关函数中执行扫描。
根据本发明的实施例,通过对代码的逆向扫描,可以基于代码中与待跟踪变量有关的赋值表达式,在合适的位置插入针对适当表达式的监测点。特别地,通过根据赋值表达式自适应地更新作为扫描目标的表达式和/或变量,能够及时而准确地发现导致变量值异常的根源。
下面将结合图4详细描述方法300中的步骤S320。换言之,参考图4描述的方法400是步骤S320的具体实现。如图所示,方法400开始于步骤S410,在此确定待跟踪的变量(称为“第一变量”)以及与该第一变量相关联的待监测的表达式(称为“第一表达式”)。
根据本发明的实施例,在方法400被初次执行时,第一表达式例如可以由用户指定。在一个实施例中,第一表达式可以是与调试过程中被发现的变量值异常有关的表达式。例如,如果程序员在程序调试过程中发现某个表达式导致变量的值出现异常,他/她可以向调试器提供能够唯一地标识第一变量和第一表达式的信息。作为示例,用户可以通过鼠标之类的指点设备在IDE中选中第一表达式和第一变量。备选地或附加地,用户也可以在调试器提供的指定输入域中,以人工方式录入第一变量和第一表达式。其他任何方式均是可行的。
参考图2所示的示例,用户可以向调试器指示:待跟踪的第一变量是suspect,与该变量相关联的待监测的第一表达式是“suspect>=0”。用户还可以输入第一表达式在函数police_chase中的位置,例如行号,以便唯一地定位第一表达式。由此,第一变量suspect是待跟踪的目标变量,第一表达式“suspect>=0”是待监测的目标表达式。
方法400进行到步骤S420,在此对所调试的程序执行逆向扫描。如上所述,在一个实施例中,逆向扫描按照程序的执行顺序的逆序对代码进行扫描。备选地,也可以按照代码顺序的逆序执行扫描。逆向扫描的目的是搜索对第一变量进行赋值的表达式,称为“赋值表达式”。
作为示例,在C/C++之类的高级程序语言中,赋值表达式可以包括运算公式。一般而言,在一个程序语句中,如果待跟踪的目标变量(即,第一变量)处于等号的左边,则可以认为等号右边的表达式是赋值表达式。例如,在赋值语句“A=B+C”中,表达式“B+C”是用于变量A的赋值表达式。特别地,赋值表达式可以是一个单独的变量。例如,在赋值语句“A=B”中,变量B可被视作用于变量A的赋值表达式。备选地或附加地,赋值表达式可以包括函数调用或者能够改变第一变量的值的任何其他表达式。这方面的实施例将在下文讨论。在程序运行过程中,赋值表达式可被转换为类似于“r3=r1+r2”、“mv r3,r2”之类的汇编语言表示。这是本领域中已知的,在此不再赘述。
为讨论之目的,仍然参考图2所示的示例。在对函数police_chase的逆向扫描中,可以确定语句216是一个涉及第一变量suspect的赋值语句。在赋值语句216中,表达式“suspect+2”是赋值表达式。
方法400继而进行到步骤S430,在此响应于找到赋值表达式,在包含赋值表达式的赋值语句之后,设置与第一表达式相关联的监测点。如已知的,设置监测点的目的是为了检查在该位置处,待监测的第一表达式是否成立。在图2所示的示例中,可以在语句216之后,插入与第一表达式“suspect>=0”相关联的监视点。以C/C++语言为例,可以在语句216之后插入断言语句“assert(suspect>=0)”,从而完成监视点的设置。
将会理解,监测点的设置并非一定依赖于assert语句,而是可以随着不同的程序而改变。本发明的范围在此方面不受限制。另外,监测点的插入位置并非一定要紧邻赋值语句之后。例如,在一个实施例之间,所设置的监测点与赋值语句可以间隔一个或多个其他语句,只要这些语句不会改变第一变量的值即可。本发明的范围在此方面亦不受限制。
通过设置该监测点,调试器可以在语句216之后、语句218之前确定表达式“suspect>=0”是否成立。如果该表达式不成立,则函数sentence函数中的表达式“guy>=0”必然不会成立。因此,赋值语句216可以被确定为导致变量guy的值异常的根源。
继续参考图4,在某些情况下,例如当搜索到的赋值语句被确定为变量值异常的根源时,方法400可以就此结束。在另一些情况中,可能需要对程序代码继续执行逆向扫描,称为“后续逆向扫描”。此时,方法400可以进行到可选的步骤S440(在图中以虚线示出),在此基于第一表达式和赋值表达式来确定第二表达式。该第二表达式将在接下来进行的后续逆向扫描中作为监测目标。特别地,根据本发明的实施例,所获得的第二表达式在语义上与第一表达式是相关的。更具体地说,第二表达式在包含赋值表达式的赋值语句之前的语义,与第一表达式在该赋值语句之后的语义相同。
考虑图2所述的具体示例。如上所述,第一变量是“suspect”,第一表达式是“suspect>=0”,并且赋值表达式是“suspect+2”。可以看到,赋值表达式中包含的变量只有第一变量。换言之,赋值表达式不包含除第一变量之外的其他变量。在这种情况下,在一个实施例中,可以利用赋值表达式来替换第一表达式中的第一变量,以获得第二表达式。更具体地,在此例中,第一表达式“suspect>=0”中的第一变量“suspect”被替换为赋值表达式“suspect+2”。由此,获得的第二表达式是“suspect+2>=0”。
在此示例中,包含赋值表达式“suspect+2”的赋值语句是语句216。第二表达式“suspect+2>=0”在赋值语句216之前的语义等同于第一表达式“suspect>=0”在该赋值语句216之后的语义。换言之,如果表达式“suspect+2>=0”在语句216之前成立,则表达式“suspect>=0”在语句216之后也成立;反之亦然。这种语义的等效性保证了表达式监测的正确性和有效性。
特别地,在一个实施例中,调试器可以通过对赋值表达式进行代码外提(outline)技术,来实现所监测表达式的变化。另外,在某些情况下,在确定第二表达式时可能需要更新待跟踪的变量,这方面的实施例将在下文结合具体示例描述。
可以理解,在某些情况下,在对程序代码的逆向扫描中,方法400可被迭代地执行一次或多次。例如,在图2所示的示例,方法400可以从语句216开始,继续向上执行逆向扫描。此时,在当前的步骤S440处确定的第二表达式,将在后续逆向搜索中被用作的监测目标。
仍然讨论图2所示的示例,其中方法400从语句216开始继续向上执行逆向扫描。换言之,方法400被第二次执行。此时,可以在步骤S410处确定:第一变量仍然是“suspect”(先前的执行过程并未更新待跟踪的变量),与之关联的第一表达式是方法400的上一轮执行中在步骤S440处确定的第二表达式“suspect+2>=0”。
在步骤S420,从语句216向上搜索对变量“suspect”赋值的语句。响应于找到赋值语句214中所包含的赋值表达式“show”,在步骤S430,在赋值语句214之后设置与第一表达式“suspect+2>=0”相关联的监测点。例如,在一个实施例中,可以在赋值语句214之后插入语句“assert(suspect+2>=0)”。
在步骤S440,基于第一表达式“suspect+2>=0”和赋值表达式“show”来确定将在后续扫描中使用的第二表达式。此时,赋值表达式涉及不同于第一变量“suspect”的第二变量“show”。根据本发明的实施例,在这种情况下,将会触发对待跟踪变量的更新。具体而言,在后续扫描中的待跟踪目标从当前的第一变量“suspect”被更新为第二变量“show”。也就是说,在方法400的下一轮执行中,在步骤S410处确定的第一变量将是当前轮次中的第二变量“show”。
相应地,第一表达式中先前的第一变量将被赋值表达式中包括的第二变量所取代,从而生成在后续扫描中作为监测目标的第二表达式。在此例中,第一表达式“suspect+2>=0”中的第一变量“suspect”被替换为第二变量“show”。由此,得到的第二表达式是“show+2>=0”。
可以理解,在某些情况下,在当前轮次的逆向扫描中找到的赋值表达式可能同时涉及当前所跟踪的第一变量以及不同于第一变量的第二变量。此时,在一个实施例中,可以在后续逆向扫描中跟踪第一变量和第二变量二者。
作为跟踪目标的第一变量的更新不仅可以由语句214所包含的简单赋值表达式所触发,还可以由赋值函数触发。例如,在图2所示的示例中,在后续扫描中可以确定下一赋值语句是语句212。在赋值语句212中,用于对第一变量“suspect”赋值的赋值表达式是赋值函数“find_suspect()”,而且函数find_suspect230所返回的是不同于suspect的变量candidate。
此时,在一个实施例中,赋值表达式被认定为涉及了不同的变量。换言之,此时,赋值函数所返回的变量是第二变量。该第二变量将被设置为在下一轮中待跟踪的目标变量。相应地,在步骤S440处,可以利用第二变量替换第一表达式中的第一变量,从而获得在后续扫描中待监测的第二表达式。具体而言,在图2的示例中,第一表达式“suspect+2>=0”中的第一变量“suspect”被替换为第二变量“candidate”,以得到第二表达式“candidate+2>=0”。
另外,根据本发明的实施例,响应于赋值表达式包含赋值函数,逆向扫描的目标函数将发生更新。具体而言,该赋值函数将被确定为用于后续逆向扫描的目标函数。作为示例,在图2的示例中,逆向扫描原本在函数police_chase中执行。也即,函数police_chase是目标函数。响应于找到赋值语句212中的第二表达式“find_suspect()”,目标函数从函数police_chase 210被更新为函数find_suspect 230。
由此,在方法400的下一轮执行中,将在函数find_suspect中执行逆向扫描,其中作为跟踪目标的第一变量是candidate,与之关联的第一表达式是“candidate+2>=0”。这样,响应于在函数find_suspect中的语句235处搜索到对变量candidate进行赋值的赋值表达式,在赋值语句235之后插入与第一表达式相关联的断点,例如,断言语句“assert(candidate+2>=0)”。
方法400可以被迭代地执行,直到完成对所调试的程序代码的扫描。以此方式,可以自动地在程序代码中的适当位置设置监测点。在调试过程中,可以有效而高效地实现变量的动态跟踪,找到变量值异常的根源。
作为示例,通过使用方法400来处理图2所示的代码片段200,可以得到图5所示的代码片段500。在代码片段500中,断言语句510、520、530和540是自动设置的监测点。
下面讨论用于方法400的若干可选的预处理,即,方法300中的步骤S310。在一个实施例中,预处理可以包括别名(alias)处理。可以理解,在程序代码中,一个变量可能存在一个或多个变量别名,也即,这些名称不同的变量共享相同的存储空间地址。别名的存在可能导致跟踪的错误。例如,如果没有对别名变量进行识别和跟踪,可能无法准确地找到导致变量值异常的根源。
为此,在一个实施例中,可以在逆向扫描之前,在程序代码中确定步骤S410处确定的第一变量的别名变量。可以通过任何适当的技术手段来确定程序代码中的第一变量的别名变量。例如,可以确定在程序代码中是否存在对第一变量的地址引用。作为示例,假设第一变量是整型变量a。如果存在另一整型变量b被声明为“int&b=a”,则b是a的地址引用,并且因此是a的别名变量。也就是说,修改变量b的值将会引起变量a的值改变。
备选地或附加地,还可以检查在程序代码中是否存在与第一变量相关联的指针、联合(union)、以传指针的方式进行的函数调用、对全局变量的局部修改,等等。如果存在上述情况中的一个或多个,则可以认为程序代码中存在第一变量的别名变量。
响应于存在别名变量,在逆向扫描中,除了第一变量本身之外,还可以确定是否存在对别名变量进行赋值的赋值表达式。例如,在一个实施例中,可以维护与第一变量相关联的别名变量表。别名变量表可以记录每个别名变量的变量名及其有效命名空间。这样,在逆向扫描中,可以基于别名变量表将别名变量纳入考虑。具体而言,如果找到对别名变量进行赋值的赋值表达式,则可以在该赋值表达式之后插入相应的监测点,以及可选地更新跟踪目标变量和监测目标表示。以此方式,可以避免在扫描过程中漏检导致变量值异常的根源。
备选地或附加地,在一个实施例中,步骤S310处的预处理还可以包括对控制流(control flow)的处理。可以理解,在程序代码中,某些控制流语句可能导致特定的赋值语句被跳过和/或执行多次。此时,可能无法在静态分析中准确地确定赋值语句是否被执行以及被执行多少次。这不利于变量的跟踪。
为此,在一个实施例中,例如可以在调试过程中实际地执行程序代码。在程序代码的执行中,可以收集与对第一变量进行赋值的赋值表达式相关联的控制流的运行时(runtime)信息。继而,在基于第一表达式和赋值表达式确定第二表达式中(步骤S440),可以将所收集的运行时控制流信息纳入考虑。
仅仅出于说明之目的,参考图6讨论一个循环控制流的示例。在图6所示的程序代码600中,存在while循环块610。在循环块610中,当变量cond为真时,执行赋值语句“val=val+1”,其中val是待跟踪的变量。在这种情况下,无法通过静态分析确定赋值语句是否被执行以及被执行多少次。
根据本发明的实施例,可以实际执行程序代码600,以确定赋值表达式被实际执行的循环轮次。由此,在确定第二表达式中,可以根据所确定的循环轮次来确定第二表达式。
考虑具体示例,假设通过运行时信息收集发现:变量cond在第3次和第5次迭代时为真(true),其他情况下为假(false)。由此,可以确定:当迭代次数小于3次时,在后续逆向扫描中待监测的表达式(即,第二表达式)应当是“(val+1)+1>0”。这是因为此后val还将被执行两次,即,变量val还将两次递增1。类似地,可以确定当迭代次数在3次到5次之间时,第二表达式是“val+1>0”;当迭代次数大于或者等于5次时,第二表达式是“val>0”。
可以理解,上文描述的while循环仅仅是示例性的,本发明的范围不限于此。相反,可以收集与任何循环有关的控制流的运行时信息,并且利用这样的运行时信息来确定第二表达式。
图7示出了根据本发明实施例的用于程序调试中的变量跟踪的系统700的示意性框图。如图所述,系统700包括:目标确定单元710,被配置为确定待跟踪的第一变量以及与所述第一变量相关联的待监测的第一表达式;扫描单元720,被配置为对所调试的程序代码执行逆向扫描以搜索对所述第一变量进行赋值的赋值表达式;监测点设置单元730,被配置为响应于找到所述赋值表达式,在包含所述赋值表达式的赋值语句之后,设置与所述第一表达式相关联的监测点以便检查所述第一表达式是否成立。
在一个实施例中,系统700可以包括目标表达式更新单元,被配置为基于所述第一表达式和所述赋值表达式来确定第二表达式,并且将所述第二表达式输入所述目标确定单元以作为所述后续逆向扫描中待监测的所述第一表达式,所述第二表达式在所述赋值语句之前的语义与所述第一表达式在所述赋值语句之后的语义相同。
在一个实施例中,所述目标表达式更新单元可以包括:第一替换单元,被配置为响应于在当前的所述逆向扫描中搜索到的所述赋值表达式中所包含的变量只有所述第一变量,利用所述赋值表达式替换所述第一表达式中的所述第一变量,以确定所述第二表达式。
在一个实施例中,系统700还可以包括:目标变量更新单元,被配置为响应于在当前的所述逆向扫描中搜索到的所述赋值表达式涉及不同于所述第一变量的第二变量,将所述第二变量输入所述目标确定单元以作为所述后续逆向扫描中待跟踪的所述第一变量。在一个实施例中,所述第二变量可以是由所述赋值表达式所包含的赋值函数返回的变量。在一个实施例中,所述目标表达式更新单元可以包括:第二替换单元,被配置为利用所述第二变量替换当前的所述逆向扫描中的所述第一表达式中的第一变量以确定所述第二表达式。
在一个实施例中,当前执行的所述逆向扫描在所述程序代码的当前函数中执行,并且所述赋值表达式包含赋值函数。在这样的实施例中,所述系统700还可以包括:目标函数更新单元,被配置为从所述当前函数跳转到所述赋值函数,以便执行对所述程序代码的后续逆向扫描。
在一个实施例中,所述系统700还可以包括:别名变量确定单元,被配置为在所述逆向扫描之前,在所述程序代码中确定所述第一变量的别名变量,所述第一变量和所述别名变量与相同的存储地址相关联。在这样的实施例中,所述扫描单元720可以包括:别名变量扫描单元,被配置为搜索对所述别名变量进行赋值的赋值表达式。在一个实施例中,所述别名变量确定单元被配置为基于与所述第一变量相关联的以下至少一项来确定所述别名变量:地址引用,指针,联合,以及对全局变量的修改。
在一个实施例中,所述系统700还可以包括:控制流信息收集单元,被配置为在所述逆向搜索之前,收集与所述赋值表达式相关联的控制流的运行时信息。在这样的实施例中,所述目标表达式更新单元可以包括:第一更新单元,被配置为进一步基于所述运行时信息来确定所述第二表达式。
在一个实施例中,所述控制流信息收集单元可以包括:循环轮次确定单元,被配置为响应于所述赋值表达式被包含在循环控制流中,确定所述赋值表达式被执行的循环轮次。在这样的实施例中,所述第一更新单元包括:第二更新单元,被配置为基于所述循环轮次来确定所述第二表达式。
为清晰起见,图7中没有示出系统700所包括的可选单元或者子单元。上文所描述的所有特征和操作分别适用于系统700,故在此不再赘述。而且,系统700中的单元或子单元的划分不是限制性的而是示例性的,旨在从逻辑上描述其主要功能或操作。一个单元的功能可以由多个单元来实现;反之,多个单元亦可由一个单元来实现。本发明的范围在此方面不受限制。
而且,系统700所包含的单元可以利用各种方式来实现,包括软件、硬件、固件或其任意组合。例如,在某些实施方式中,系统700可以利用软件和/或固件来实现。备选地或附加地,系统700可以部分地或者完全地基于硬件来实现。例如,系统700中的一个或多个单元可以实现为集成电路(IC)芯片、专用集成电路(ASIC)、片上系统(SOC)、现场可编程门阵列(FPGA),等等。本发明的范围在此方面不受限制。
本发明可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本发明的各个方面的计算机可读程序指令。
计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是-但不限于-电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
用于执行本发明操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言-诸如Java、Smalltalk、C++等,以及常规的过程式编程语言-诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络-包括局域网(LAN)或广域网(WAN)-连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本发明的各个方面。
这里参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
计算机可读程序指令也可加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中技术的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
Claims (18)
1.一种用于程序调试中的变量跟踪的方法,包括:
确定待跟踪的第一变量以及与所述第一变量相关联的待监测的第一表达式;
对所调试的程序代码执行逆向扫描以搜索对所述第一变量进行赋值的赋值表达式;以及
响应于找到所述赋值表达式,在包含所述赋值表达式的赋值语句之后,设置与所述第一表达式相关联的监测点以便检查所述第一表达式是否成立,
其中所述方法被迭代地执行,并且其中在所述方法的下一轮次执行中,确定待跟踪的第一变量以及与所述第一变量相关联的待监测的第一表达式包括:
基于所述方法的当前轮次执行中的所述第一表达式和所述赋值表达式来确定第二表达式,以作为在所述方法的下一轮次执行中待监测的所述第一表达式,其中在所述当前轮次执行中,所述第二表达式在所述赋值语句之前的语义与所述第一表达式在所述赋值语句之后的语义相同。
2.根据权利要求1所述的方法,其中基于所述方法的当前轮次执行中的所述第一表达式和所述赋值表达式来确定第二表达式包括:
响应于在所述当前轮次执行中所述赋值表达式中所包含的变量只有所述第一变量,利用所述当前轮次中的所述赋值表达式替换所述第一表达式中的所述第一变量,以确定所述第二表达式。
3.根据权利要求1所述的方法,其中在所述方法的下一轮次执行中,确定待跟踪的第一变量以及与所述第一变量相关联的待监测的第一表达式还包括:
响应于所述当前轮次执行中的所述赋值表达式涉及不同于所述第一变量的第二变量,在所述方法的下一轮次执行中将所述第二变量确定为待跟踪的所述第一变量;
并且其中基于所述方法的当前轮次执行中的所述第一表达式和所述赋值表达式来确定第二表达式包括:利用所述第二变量替换所述当前轮次执行中的所述第一表达式中的所述第一变量以确定所述第二表达式。
4.根据权利要求3所述的方法,其中所述第二变量是由所述赋值表达式所包含的赋值函数返回的变量。
5.根据权利要求1所述的方法,其中所述逆向扫描在所述程序代码的当前函数中执行,并且其中所述赋值表达式包含赋值函数,所述方法还包括:
从所述当前函数跳转到所述赋值函数,以便执行对所述程序代码的后续逆向扫描。
6.根据权利要求1所述的方法,还包括:
在所述逆向扫描之前,在所述程序代码中确定所述第一变量的别名变量,所述第一变量和所述别名变量与相同的存储地址相关联,
其中对所调试的程序代码执行逆向扫描以搜索对所述第一变量进行赋值的赋值表达式包括:搜索对所述别名变量进行赋值的赋值表达式。
7.根据权利要求6所述的方法,其中在所述程序代码中确定所述第一变量的别名变量包括:
基于与所述第一变量相关联的以下至少一项来确定所述别名变量:地址引用,指针,联合,以及对全局变量的修改。
8.根据权利要求1所述的方法,还包括:
在所述逆向搜索之前,收集与所述赋值表达式相关联的控制流的运行时信息,
其中基于所述方法的当前轮次执行中的所述第一表达式和所述赋值表达式来确定第二表达式包括:进一步基于所述运行时信息来确定所述第二表达式。
9.根据权利要求8所述的方法,其中收集与所述赋值表达式相关联的控制流的运行时信息包括:响应于所述赋值表达式被包含在循环控制流中,确定所述赋值表达式被执行的循环轮次,
并且其中进一步基于所述运行时信息来确定所述第二表达式包括:基于所述循环轮次来确定所述第二表达式。
10.一种用于程序调试中的变量跟踪的系统,包括:
目标确定单元,被配置为确定待跟踪的第一变量以及与所述第一变量相关联的待监测的第一表达式;
扫描单元,被配置为对所调试的程序代码执行逆向扫描以搜索对所述第一变量进行赋值的赋值表达式;以及
监测点设置单元,被配置为响应于找到所述赋值表达式,在包含所述赋值表达式的赋值语句之后,设置与所述第一表达式相关联的监测点以便检查所述第一表达式是否成立,
还包括:
目标表达式更新单元,被配置为基于所述第一表达式和所述赋值表达式来确定第二表达式,并且将所述第二表达式输入所述目标确定单元以作为后续逆向扫描中待监测的所述第一表达式,所述第二表达式在所述赋值语句之前的语义与所述第一表达式在所述赋值语句之后的语义相同。
11.根据权利要求10所述的系统,其中所述目标表达式更新单元包括:
第一替换单元,被配置为响应于在当前的所述逆向扫描中搜索到的所述赋值表达式中所包含的变量只有所述第一变量,利用所述赋值表达式替换所述第一表达式中的所述第一变量,以确定所述第二表达式。
12.根据权利要求10所述的系统,还包括:
目标变量更新单元,被配置为响应于在当前的所述逆向扫描中搜索到的所述赋值表达式涉及不同于所述第一变量的第二变量,将所述第二变量输入所述目标确定单元以作为所述后续逆向扫描中待跟踪的所述第一变量,
其中所述目标表达式更新单元包括第二替换单元,被配置为利用所述第二变量替换当前的所述逆向扫描中的所述第一表达式中的所述第一变量以确定所述第二表达式。
13.根据权利要求12所述的系统,其中所述第二变量是由所述赋值表达式所包含的赋值函数返回的变量。
14.根据权利要求10所述的系统,其中所述逆向扫描在所述程序代码的当前函数中执行,并且其中所述赋值表达式包含赋值函数,所述系统还包括:
目标函数更新单元,被配置为从所述当前函数跳转到所述赋值函数,以便执行对所述程序代码的后续逆向扫描。
15.根据权利要求10所述的系统,还包括:
别名变量确定单元,被配置为在所述逆向扫描之前,在所述程序代码中确定所述第一变量的别名变量,所述第一变量和所述别名变量与相同的存储地址相关联,
其中所述扫描单元包括:别名变量扫描单元,被配置为搜索对所述别名变量进行赋值的赋值表达式。
16.根据权利要求15所述的系统,其中所述别名变量确定单元被配置为基于与所述第一变量相关联的以下至少一项来确定所述别名变量:地址引用,指针,联合,以及对全局变量的修改。
17.根据权利要求10所述的系统,还包括:
控制流信息收集单元,被配置为在所述逆向搜索之前,收集与所述赋值表达式相关联的控制流的运行时信息,
其中所述目标表达式更新单元包括:第一更新单元,被配置为进一步基于所述运行时信息来确定所述第二表达式。
18.根据权利要求17所述的系统,其中所述控制流信息收集单元包括:循环轮次确定单元,被配置为响应于所述赋值表达式被包含在循环控制流中,确定所述赋值表达式被执行的循环轮次,
并且其中所述第一更新单元包括:第二更新单元,被配置为基于所述循环轮次来确定所述第二表达式。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410710926.XA CN105701006B (zh) | 2014-11-28 | 2014-11-28 | 用于程序调试中的变量跟踪的方法和系统 |
US14/919,938 US9870309B2 (en) | 2014-11-28 | 2015-10-22 | Variable tracking in program debugging |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410710926.XA CN105701006B (zh) | 2014-11-28 | 2014-11-28 | 用于程序调试中的变量跟踪的方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105701006A CN105701006A (zh) | 2016-06-22 |
CN105701006B true CN105701006B (zh) | 2018-04-27 |
Family
ID=56079292
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410710926.XA Active CN105701006B (zh) | 2014-11-28 | 2014-11-28 | 用于程序调试中的变量跟踪的方法和系统 |
Country Status (2)
Country | Link |
---|---|
US (1) | US9870309B2 (zh) |
CN (1) | CN105701006B (zh) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10176077B2 (en) * | 2017-02-16 | 2019-01-08 | International Business Machines Corporation | Generating breakpoints for cross-layer debugging |
CN107273264B (zh) * | 2017-06-08 | 2020-09-11 | 携程旅游网络技术(上海)有限公司 | 对象实例关键属性及其关联属性的跟踪方法及装置 |
US10713145B2 (en) * | 2018-01-05 | 2020-07-14 | International Business Machines Corporation | Automated debugging with combined static and dynamic analysis |
CN108763815B (zh) * | 2018-06-08 | 2022-12-02 | 上海华虹宏力半导体制造有限公司 | 程序语法检查的方法及芯片验证的方法 |
CN109032946B (zh) * | 2018-07-27 | 2022-03-18 | 厦门集微科技有限公司 | 一种测试方法和装置、计算机可读存储介质 |
CN109634574B (zh) * | 2018-12-20 | 2022-03-15 | 武汉精立电子技术有限公司 | 基于微内核架构的变量实时监视方法及系统 |
CN110764745B (zh) * | 2019-09-16 | 2024-02-02 | 平安科技(深圳)有限公司 | 变量的传输和收集方法、装置及计算机可读存储介质 |
GB2593858B (en) | 2020-01-30 | 2023-03-22 | Retrace Software Ltd | Methods and systems for recreating a program state. |
CN112506806B (zh) * | 2021-02-02 | 2021-10-15 | 芯华章科技股份有限公司 | 用于调试程序的方法、电子设备及存储介质 |
CN115543330A (zh) * | 2021-06-30 | 2022-12-30 | 华为技术有限公司 | 程序编译方法和装置 |
CN113934626A (zh) * | 2021-09-26 | 2022-01-14 | 中国汽车技术研究中心有限公司 | 模型过程调试方法、设备和存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102063368A (zh) * | 2010-12-16 | 2011-05-18 | 国网电力科学研究院 | 基于命名变量的全景数据在线实时调试方法 |
CN103729288A (zh) * | 2013-11-01 | 2014-04-16 | 华中科技大学 | 一种嵌入式多核环境下应用程序的调试方法 |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2347647A1 (en) * | 2001-05-15 | 2002-11-15 | Ibm Canada Limited-Ibm Canada Limitee | Storing and restoring snapshots of a computer process |
US20030041315A1 (en) | 2001-08-21 | 2003-02-27 | International Business Machines Corporation | Debugger with automatic detection of control points influencing program behavior |
US6993749B2 (en) | 2002-03-28 | 2006-01-31 | International Business Machines Corporation | Conditional debug monitors |
US7603659B2 (en) | 2003-09-09 | 2009-10-13 | Sap Aktiengesellschaft | Activating assertions and breakpoints |
CN101192193A (zh) * | 2006-11-27 | 2008-06-04 | 国际商业机器公司 | 用于实现观察点的方法和系统 |
US20120278791A1 (en) | 2010-01-08 | 2012-11-01 | Daniel Geist | Utilizing temporal assertions in a debugger |
US8645761B2 (en) | 2011-01-13 | 2014-02-04 | International Business Machines Corporation | Precise fault localization |
US8881116B2 (en) * | 2011-06-08 | 2014-11-04 | The Mathworks, Inc. | Identifying and triaging software bugs through backward propagation of under-approximated values and empiric techniques |
US20130339929A1 (en) | 2012-06-14 | 2013-12-19 | Microsoft Corporation | Program repair |
-
2014
- 2014-11-28 CN CN201410710926.XA patent/CN105701006B/zh active Active
-
2015
- 2015-10-22 US US14/919,938 patent/US9870309B2/en active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102063368A (zh) * | 2010-12-16 | 2011-05-18 | 国网电力科学研究院 | 基于命名变量的全景数据在线实时调试方法 |
CN103729288A (zh) * | 2013-11-01 | 2014-04-16 | 华中科技大学 | 一种嵌入式多核环境下应用程序的调试方法 |
Also Published As
Publication number | Publication date |
---|---|
US20160154726A1 (en) | 2016-06-02 |
CN105701006A (zh) | 2016-06-22 |
US9870309B2 (en) | 2018-01-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105701006B (zh) | 用于程序调试中的变量跟踪的方法和系统 | |
US9898387B2 (en) | Development tools for logging and analyzing software bugs | |
US10761963B2 (en) | Object monitoring in code debugging | |
CN101739339B (zh) | 一种基于程序动态依赖关系的软件故障定位方法 | |
US9658907B2 (en) | Development tools for refactoring computer code | |
US7530056B1 (en) | Method and system for detecting runtime defects in a program by comparing correct and incorrect runs | |
Kirbas et al. | The relationship between evolutionary coupling and defects in large industrial software | |
US10176077B2 (en) | Generating breakpoints for cross-layer debugging | |
JP6342129B2 (ja) | 混合モードプログラムのソースコードエラー位置検出装置及び方法 | |
US20160154727A1 (en) | System, method, and computer program to improve the productivity of unit testing | |
CN110058861B (zh) | 源码处理方法及装置、存储介质、电子设备 | |
US11030074B2 (en) | Code update based on detection of change in runtime code during debugging | |
CN112100072A (zh) | 应用程序代码的静态检测方法、装置、设备及介质 | |
CN105630661B (zh) | 用于自动化跨系统程序调试的方法和装置 | |
CN102722438B (zh) | 一种内核调试的方法和设备 | |
Trubiani et al. | Performance issues? Hey DevOps, mind the uncertainty | |
CN107272441B (zh) | 用于监控错误的方法和用于监控错误的数据处理装置 | |
US9047403B2 (en) | Debugger with previous version feature | |
US20130152049A1 (en) | Warning of register and storage area assignment errors | |
US9934006B2 (en) | Scalable code division and workflow chart | |
US10546080B1 (en) | Method and system for identifying potential causes of failure in simulation runs using machine learning | |
US20140189656A1 (en) | Flow Analysis in Program Execution | |
US11182272B2 (en) | Application state monitoring | |
CN115705250A (zh) | 监测堆栈使用量以优化程序 | |
US20170192878A1 (en) | Separating Test Coverage In Software Processes Using Shared Memory |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |