CN108959069A - 一种函数运行的追踪方法和装置 - Google Patents
一种函数运行的追踪方法和装置 Download PDFInfo
- Publication number
- CN108959069A CN108959069A CN201810594578.2A CN201810594578A CN108959069A CN 108959069 A CN108959069 A CN 108959069A CN 201810594578 A CN201810594578 A CN 201810594578A CN 108959069 A CN108959069 A CN 108959069A
- Authority
- CN
- China
- Prior art keywords
- function
- code
- outlet
- tracking code
- try
- 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
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
-
- 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/3624—Software debugging by performing operations on the source code, e.g. via a compiler
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
技术领域
本发明涉及程序开发技术领域,特别是涉及一种函数运行的追踪方法和装置。
背景技术
函数,又称方法或子程序,是一个完整程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。函数一般会有输入参数并有返回值,其提供对特定处理过程的封装和细节的隐藏。为便于表达,本申请中将“方法”或“子程序”称统称“函数”。
追踪函数运行是指对函数运行的轨迹进行记录,记录的信息包括函数调用栈、调用每个函数时传递的参数、每个函数运行的时长等。这些信息可以清晰地反映函数运行的具体轨迹,也可以反映函数运行的各个环节的耗时情况。追踪函数运行是软件开发中的一个重要技术,为漏洞解决和性能优化提供重要帮助。目前还没有有效的方法对函数进行追踪。
发明内容
有鉴于此,本发明提供了一种函数运行的追踪方法和装置,以解决在对程序进行调试过程中无法对函数进行有效追踪的问题。
为了解决上述问题,本发明公开了一种函数运行的追踪方法,应用于程序调试系统,所述追踪方法包括步骤:
在被追踪的目标程序在调试为可执行代码前,在所述目标程序中每个函数的入口和出口插入预先编写的追踪代码,所述追踪代码用于向所述程序调试系统的后台发送所述函数的运行时间、函数名和/或函数参数;
在调用所述函数时,执行所述追踪代码;
记录所述追踪代码被执行时所返回的所述运行时间、所述函数名和/或所述函数参数。
可选的,所述在所述目标程序中每个函数的入口和出口插入预先编写的追踪代码,包括:
确定所述入口的位置,并确定所述出口的位置;
将所述追踪代码插入到所述入口的位置和所述出口的位置。
可选的,所述并确定所述出口的位置,包括:
将所述函数的返回指令确定为所述出口的位置;
或者,在所述函数的异常抛出点外部套接一个try…catch块,将所述try…catch块的末尾的异常处理模块作为所述出口的位置。
可选的,所述函数的所有代码外部套接一个try…catch块,包括:
将所述函数的所有指令读入到内存中;
从后向前寻找最后一条返回指令,将所述最后一条至所述最后一条返回指令作为所述try…catch块的try部分,在catch部分直接记录函数出口信息,并利用所述异常处理模块将捕捉到的异常抛出。
可选的,还包括步骤:
以树的方式显示被返回的所述运行时间、所述函数名和/或所述函数参数。
相应的,为了保证上述方法的实施,本发明还提供了一种函数运行的追踪装置,应用于程序调试系统,所述追踪装置包括:
代码插入模块,用于在被追踪的目标程序在调试为可执行代码前,在所述目标程序中每个函数的入口和出口插入预先编写的追踪代码,所述追踪代码用于向所述程序调试系统的后台发送所述函数的运行时间、函数名和/或函数参数;
代码执行模块,在调用所述函数时,执行所述追踪代码;
结果记录模块,用于记录所述追踪代码被执行时所返回的所述运行时间、所述函数名和/或所述函数参数。
可选的,所述代码插入模块包括:
位置确定单元,用于确定所述入口的位置,并确定所述出口的位置;
插入执行单元,用于将所述追踪代码插入到所述入口的位置和所述出口的位置。
可选的,所述位置确定单元包括:
第一确定子单元,用于将所述函数的返回指令确定为所述出口的位置;
第二确定子单元,用于在所述函数的所有代码的外部套接一个try…catch块,将所述try…catch块的末尾的异常处理模块作为所述出口的位置。
可选的,所述第二确定子单元具体用于将所述函数的所有指令读入到内存中;从后向前寻找最后一条返回指令,将第一条指令至所述最后一条返回指令作为所述try...catch块的try部分,在catch部分直接记录函数出口信息,并利用所述异常处理模块将捕捉到的异常抛出。
可选的,还包括:
结果展示模块,用于以树的方式显示被返回的所述运行时间、所述函数名和/或所述函数参数。
从上述技术方案可以看出,本发明提供了一种函数运行的追踪方法和装置,该方法和装置应用于程序调试系统,具体为在被追踪的目标程序在调试为可执行代码前,在所述目标程序中每个函数的入口和出口插入预先编写的追踪代码,所述追踪代码用于向所述程序调试系统的后台发送所述函数的运行时间、函数名和/或函数参数;在调用所述函数时,执行所述追踪代码;记录所述追踪代码被执行时所返回的所述运行时间、所述函数名和/或所述函数参数。通过追踪代码的执行,从而达到了追踪函数运行的目的。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种函数运行的追踪方法的步骤流程图;
图2a为本发明实施例提供的另一种函数运行的追踪方法的步骤流程图;
图2b为本发明实施例提供的一种树的示意图;
图3为本发明实施例提供的一种函数运行的追踪装置的结构框图;
图4为本发明实施例提供的另一种函数运行的追踪装置的结构框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
图1为本发明实施例提供的一种函数运行的追踪方法的步骤流程图。
参照图1所示,本实施例提供的追踪方法应用于程序调试系统,用于对处于允许状态的程序的函数进行追踪,即对函数运行的轨迹进行记录,该追踪方法具体包括如下步骤:
S101:在函数的入口和出口插入预先编写的追踪代码。
即在被追踪的目标程序被调试成可被执行代码前,使用编写好的追踪代码无侵入式地修改所需要跟踪的所有函数的代码,通常我们无法获取源码,只能获取到编译后的字节码或汇编码,具体为在函数的每个入口和每个出口插入该追踪代码,追踪代码的作用是在运行时向后台发送运行时间、函数名和函数参数等信息,后台会记录这些信息,并且维护函数调用栈,即利用堆栈形式记录上述运行时间、函数名和函数参数等信息。
在插入该追踪代码时,关键在于确定相应函数的入口和出口。一般入口都是函数的代码的第一行前部。以Java语言为例我们可以使用工具读入函数的字节码,在函数第一个语句之前直接以字节码形式插入我们需要执行的追踪代码。
函数一般有多个出口,但出口通常分两种。一种是返回指令,对于这种情况,我们可以直接在返回指令前以字节码形式插入需要执行的追踪代码;另一种是异常抛出。
在具体实施时,如下面代码所示:
忽略所有异常抛出点,而在所有代码的外面套一个try…catch块,将try…catch块的异常处理模块的末尾作为出口的位置,即利用throw t这一异常处理模块将异常抛出,这样我们就可以原封不动地抛出异常,并且不改变异常信息以及异常信息里的栈轨迹。然后在我们添加的这个异常抛出点之前以字节码形式插入需要执行的追踪代码。
具体的方法是先读取函数所有的信息(包括指令、局部变量在内的所有信息),读取的时候并不修改,也不写入,而是存入内存。读取完成后,再从后往前寻找最后一条返回指令,将其作为try…catch块的try部分,在catch部分直接记录函数出口信息,并利用异常处理模块throw t将捕捉到的异常抛出。然后我们才开始输出被修改后的函数。
例如,原函数为:
改写后为:
其中,该return f语句是出口,所以在前面要记录出口,如果try部分内出现任何异常,所有的异常都会被catch部分捕捉,这时候就要记录出口,并利用throw t模块将异常t抛出。
修改函数的整个流程如下:
(1)逐条读入函数的所有信息,不作任何修改,直接存入内存。
(2)从后往前寻找最后一个返回指令的位置pos。
(3)开始往类文件里写入修改后的函数内容,首先写入插在函数头部的代码。
(4)注入try…catch块的开头部分(如果用ASM工具,则打上开头的标签)。
(5)将原始函数的所有指令逐条写入,如果原始指令是返回指令,那么先写入插在函数出口的代码,再写入返回指令;如果原始指令是其他情况则直接写入原始指令。逐条写,直至pos的位置停止。
(6)写入catch的信息(如果用ASM工具,则打上catch开始标签)。
(7)写入插在函数出口的代码。
(8)写入异常抛出指令。
(9)写入try…catch块结束的信息(如果用ASM工具,则打上catch结束标签)。
(10)写入插在函数出口的代码。
(11)写入pos处的返回指令。
(12)写入剩下的信息。
通过上述的操作,可以精确地定位所有的入口和出口,具体示例如下:
S102:在调用函数时,执行该追踪代码。
具体为当该程序处于运行阶段时,在执行相应函数的同时,执行插在该函数的入口和出口的追踪代码。
S103:记录上述函数执行时被返回的各种信息。
具体为记录追踪代码被执行时所的运行时间、函数名和/或函数参数。从而使调用函数的时间、函数的每个参数传给后台,让后台记录并维护函数调用栈。这些代码在函数运行时会执行,这样就达到了追踪函数运行的目的。
为了减少对函数运行的线程的影响,本方案在后台开了一个线程,用来记录数据和维护函数调用栈。该线程维护一个队列,所有记录的信息都存在这个队列里。每次函数调用信息传给这个线程,实际上就是把这些信息加入这个队列的队尾。该线程不断地从队列头部取出数据,进行记录,并且维护函数调用栈。
记录函数调用信息所用的数据结构是一棵树,这棵树的每个节点都记录着某个函数的调用信息,这个函数内部调用的所有函数的调用信息是它的子节点。
当然可能存在某些特殊情况。比如某个函数f调用了系统函数,我们无法对系统函数代码进行修改,也就无法对系统进行跟踪。对于这种情况,函数f就没有必要记录这个系统函数的子节点。
还有一种情况比较特殊,和树的根节点有关。通常程序有一个总的入口,一般为main函数,我们可以以这个函数调用信息作为树的根节点。但在很多情况下(比如大多数工程代码都运行在容器中),根节点main函数是系统函数,我们无法建立树的根。对于这种情况,我们可以在初始化的时候直接建立一个默认的根节点。
另外代码实现时,有一个技巧。我们不需要维护函数调用栈,只需维护当前运行的函数的节点指针即可。如果需要获取函数调用栈,只需找到从根节点到当前节点的最短路径即可。
下面展示维护这棵树的算法:
(1)初始化,建立一个根节点,当前节点指针p指向根节点。
(2)从队列头部中获取函数调用信息(如果为空,则等待,直到有信息)。
(3)如果是函数入口传来的信息,新建一个节点q,将系统时间、参数、函数名等记录在节点里,并将其作为p的子节点,然后p指向q,转(2);如果时函数出口传来的信息,转(4)。
(4)在p中记录函数退出的系统时间等信息,p指向p的父节点。
(5)当p为空时,退出;如果不为空,转(2)。
另外,工程中其实不需要维护所有的函数调用信息:
(1)在具体应用时,如果只需要找耗时很长的函数,当发现耗时的时候,立即将信息记录到磁盘,同时根据一些策略删除很早以前的函数调用信息与节点,以减少内存消耗。
(2)维护的树的节点深度也可以有一个限制,如果大于某个阈值,我们就不再记录,直到深度小于等于阈值的时候,我们就继续记录。
从上述技术方案可以看出,本实施例提供了一种函数运行的追踪方法,该方法应用于程序调试系统,具体为在被追踪的目标程序在调试为可执行代码前,在所述目标程序中每个函数的入口和出口插入预先编写的追踪代码,所述追踪代码用于向所述程序调试系统的后台发送所述函数的运行时间、函数名和/或函数参数;在调用所述函数时,执行所述追踪代码;记录所述追踪代码被执行时所返回的所述运行时间、所述函数名和/或所述函数参数。通过追踪代码的执行,从而达到了追踪函数运行的目的。
另外,在得到追踪的结果后,及时向技术人员作出展示也是追踪的目的之一,从而使技术人员能够直观了解追踪的结果。
因此,本实施例还包括如下步骤,如图2a所示:
S104:以树的方式显示被返回的运行结果。
该运行结果包括运行时间、函数名和函数参数中的部分或全部。具体的展示方式如下,如图2b所示:
(1)以类似树的方式展示在运行时维护的树,这个树反映了函数调用轨迹。
(2)树中每个节点对应一个被调用的函数,节点内部的文字显示这个函数的信息。
(3)每个节点的子节点表示该函数调用的每个函数对应的节点。
(4)默认情况下,每个节点不展开显示其子节点。点击节点后,才展开显示其子节点。
(5)对于根节点是系统函数的情况,由于根节点是我们创建的默认节点,所以可以在展现的时候可以把这个节点省略,而把我们能跟踪到的所有最靠近根部的所有节点列为同级节点。
(6)同级节点的排列方式可以根据实际情况待定,可以按耗时占比排列,也可以按调用顺序排列。
(7)如果f函数调用了g函数n次,那么函数f的子节点内,就会存在n个g函数节点。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。
实施例二
图3为本发明实施例提供的一种函数运行的追踪装置的结构框图。
参照图3所示,本实施例提供的追踪装置应用于程序调试系统,用于对处于允许状态的程序的函数进行追踪,即对函数运行的轨迹进行记录,该追踪装置具体包括代码插入模块10、代码执行模块20和结果记录模块30。
代码插入模块用于在函数的入口和出口插入预先编写的追踪代码。
即在被追踪的目标程序被调试成可被执行代码前,使用编写好的追踪代码无侵入式地修改所需要跟踪的所有函数的代码,通常我们无法获取源码,只能获取到编译后的字节码或汇编码,具体为在函数的每个入口和每个出口插入该追踪代码,追踪代码的作用是在运行时向后台发送运行时间、函数名、函数参数等信息,后台会记录这些信息,并且维护函数调用栈。
在插入该追踪代码时,关键在于确定相应函数的入口和出口,因此,该模块具体包括位置确定单元和差值执行单元,位置确定单元用于确定入口和出口,插入执行单元用于插入具体的追踪代码。相对来说,该入口容易确定,都是函数的代码的第一行前部。以Java语言为例,我们拿到的通常是字节码,我们可以使用工具读入函数的字节码,在函数第一个语句之前直接以字节码形式插入我们需要执行的追踪代码。
该位置确定单元具体包括第一确定子单元和第二确定子单元。对于函数的出口来说较难确定,函数一般有多个出口,但出口通常分两种。一种是返回指令,第一确定子单元用于对于这种情况进行确定,可以直接在返回指令前以字节码形式插入需要执行的追踪代码;第二确定子单元用于针对异常抛出。
在具体实施时,例如针对如下代码:
该第二确定子单元忽略所有异常抛出点,而在所有代码的外面套一个try…catch块,将try…catch块的异常处理模块的末尾作为出口的位置,这样我们就可以原封不动地抛出异常,并且不改变异常信息以及异常信息里的栈轨迹。然后在我们添加的这个异常抛出点之前以字节码形式插入需要执行的追踪代码。
具体来说,该第二确定子单元先读取函数所有的信息(包括指令、局部变量在内的所有信息),读取的时候并不修改,也不写入,而是存入内存。读取完成后,再从后往前寻找最后一条返回指令,将其作为try…catch块的try部分,在catch部分直接记录函数出口信息,并将捕捉到的异常抛出。然后我们才开始输出被修改后的函数。
修改函数的整个流程如下:
(1)逐条读入函数的所有信息,不作任何修改,直接存入内存。
(2)从后往前寻找最后一个返回指令的位置pos。
(3)开始往类文件里写入修改后的函数内容,首先写入插在函数头部的代码。
(4)注入try…catch块的开头部分(如果用ASM工具,则打上开头的标签)。
(5)将原始函数的所有指令逐条写入,如果原始指令是返回指令,那么先写入插在函数出口的代码,再写入返回指令;如果原始指令是其他情况则直接写入原始指令指令。逐条写,直至pos的位置停止。
(6)写入catch的信息(如果用ASM工具,则打上catch开始标签)。
(7)写入插在函数出口的代码。
(8)写入异常抛出指令。
(9)写入try…catch块结束的信息(如果用ASM工具,则打上catch结束标签)。
(10)写入插在函数出口的代码。
(11)写入pos处的返回指令。
(12)写入剩下的信息。
通过上述的操作,可以精确地定位所有的入口和出口。
代码执行模块用于在调用函数时,执行该追踪代码。
具体为当该程序处于运行阶段时,在执行相应函数的同时,执行插在该函数的入口和出口的追踪代码。
结果记录模块用于记录上述函数执行时被返回的各种信息。
具体为记录追踪代码被执行时所的运行时间、函数名和/或函数参数。从而使调用函数的时间、函数的每个参数传给后台,让后台记录并维护函数调用栈。这些代码在函数运行时会执行,这样就达到了追踪函数运行的目的。
为了减少对函数运行的线程的影响,本方案在后台开了一个线程,用来记录数据和维护函数调用栈。该线程维护一个队列,所有记录的信息都存在这个队列里。每次函数调用信息传给这个线程,实际上就是把这些信息加入这个队列的队尾。该线程不断地从队列头部取出数据,进行记录,并且维护函数调用栈。
记录函数调用信息所用的数据结构是一棵树,这棵树的每个节点都记录着某个函数的调用信息,这个函数内部调用的所有函数的调用信息是它的子节点。
当然可能存在某些特殊情况。比如某个函数f调用了系统函数,我们无法对系统函数代码进行修改,也就无法对系统进行跟踪。对于这种情况,函数f就没有必要记录这个系统函数的子节点。
还有一种情况比较特殊,和树的根节点有关。通常程序有一个总的入口,一般为main函数,我们可以以这个函数调用信息作为树的根节点。但在很多情况下(比如大多数工程代码都运行在容器中),根节点main函数是系统函数,我们无法建立树的根。对于这种情况,我们可以在初始化的时候直接建立一个默认的根节点。
另外代码实现时,有一个技巧。我们不需要维护函数调用栈,只需维护当前运行的函数的节点指针即可。如果需要获取函数调用栈,只需找到从根节点到当前节点的最短路径即可。
下面展示维护这棵树的算法:
(1)初始化,建立一个根节点,当前节点指针p指向根节点。
(2)从队列头部中获取函数调用信息(如果为空,则等待,直到有信息)。
(3)如果是函数入口传来的信息,新建一个节点q,将系统时间、参数、函数名等记录在节点里,并将其作为p的子节点,然后p指向q,转(2);如果时函数出口传来的信息,转(4)。
(4)在p中记录函数退出的系统时间等信息,p指向p的父节点。
(5)当p为空时,退出;如果不为空,转(2)。
另外,工程中其实不需要维护所有的函数出口信息:
(1)在具体应用时,如果只需要找耗时很长的函数,当发现耗时的时候,立即将信息记录到磁盘,同时根据一些策略删除很早以前的函数调用信息与节点,以减少内存消耗。
(2)维护的树的节点深度也可以有一个限制,如果大于某个阈值,我们就不再记录,直到深度小于等于阈值的时候,我们就继续记录。
从上述技术方案可以看出,本实施例提供了一种函数运行的追踪装置,该装置应用于程序调试系统,具体为在被追踪的目标程序在调试为可执行代码前,在所述目标程序中每个函数的入口和出口插入预先编写的追踪代码,所述追踪代码用于向所述程序调试系统的后台发送所述函数的运行时间、函数名和/或函数参数;在调用所述函数时,执行所述追踪代码;记录所述追踪代码被执行时所返回的所述运行时间、所述函数名和/或所述函数参数。通过追踪代码的执行,从而达到了追踪函数运行的目的。
另外,在得到追踪的结果后,及时向技术人员作出展示也是追踪的目的之一,从而使技术人员能够直观了解追踪的结果。
因此,本实施例还包括结果展示模块40,如图4所示:
该结构展示模块用于以树的方式显示被返回的运行结果。
该运行结果包括运行时间、函数名和函数参数中的部分或全部。具体的展示方式如下:
(1)以类似树的方式展示在运行时维护的树,这个树反映了函数调用轨迹。
(2)树中每个节点对应一个被调用的函数,节点内部的文字显示这个函数的信息。
(3)每个节点的子节点表示该函数调用的每个函数对应的节点。
(4)默认情况下,每个节点不展开显示其子节点。点击节点后,才展开显示其子节点。
(5)对于根节点是系统函数的情况,由于根节点是我们创建的默认节点,所以可以在展现的时候可以把这个节点省略,而把我们能跟踪到的所有最靠近根部的所有节点列为同级节点。
(6)同级节点的排列方式可以根据实际情况待定,可以按耗时占比排列,也可以按调用顺序排列。
(7)如果f函数调用了g函数n次,那么函数f的子节点内,就会存在n个g函数节点。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本发明所提供的技术方案进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (10)
1.一种函数运行的追踪方法,应用于程序调试系统,其特征在于,所述追踪方法包括步骤:
在被追踪的目标程序在调试为可执行代码前,在所述目标程序中每个函数的入口和出口插入预先编写的追踪代码,所述追踪代码用于向所述程序调试系统的后台发送所述函数的运行时间、函数名和/或函数参数;
在调用所述函数时,执行所述追踪代码;
记录所述追踪代码被执行时所返回的所述运行时间、所述函数名和/或所述函数参数。
2.如权利要求1所述的追踪方法,其特征在于,所述在所述目标程序中每个函数的入口和出口插入预先编写的追踪代码,包括:
确定所述入口的位置,并确定所述出口的位置;
将所述预先编写的追踪代码插入到所述入口的位置和所述出口的位置。
3.如权利要求2所述的追踪方法,其特征在于,所述并确定所述出口的位置,包括:
将所述函数的返回指令确定为所述出口的位置;
或者,在所述函数的所有代码外部套接一个try…catch块,将所述try…catch块末尾的异常处理模块作为所述出口的位置。
4.如权利要求3所述的追踪方法,其特征在于,所述函数的所有代码的外部套接一个try…catch块,包括:
将所述函数的所有指令读入到内存中;
从后向前寻找最后一条返回指令,将第一条指令至所述最后一条返回指令作为所述try...catch块的try部分,在catch部分直接记录函数出口信息,并利用所述异常处理模块将捕捉到的异常抛出。
5.如权利要求1~4任一项所述的追踪方法,其特征在于,还包括步骤:
以树的方式显示被返回的所述运行时间、所述函数名和/或所述函数参数。
6.一种函数运行的追踪装置,应用于程序调试系统,其特征在于,所述追踪装置包括:
代码插入模块,用于在被追踪的目标程序在调试为可执行代码前,在所述目标程序中每个函数的入口和出口插入预先编写的追踪代码,所述追踪代码用于向所述程序调试系统的后台发送所述函数的运行时间、函数名和/或函数参数;
代码执行模块,在调用所述函数时,执行所述追踪代码;
结果记录模块,用于记录所述追踪代码被执行时所返回的所述运行时间、所述函数名和/或所述函数参数。
7.如权利要求6所述的追踪装置,其特征在于,所述代码插入模块包括:
位置确定单元,用于确定所述入口的位置,并确定所述出口的位置;
插入执行单元,用于将所述追踪代码插入到所述入口的位置和所述出口的位置。
8.如权利要求7所述的追踪装置,其特征在于,所述位置确定单元包括:
第一确定子单元,用于将所述函数的返回指令确定为所述出口的位置;
第二确定子单元,用于在所述函数的所有代码的外部套接一个try…catch块,将所述try…catch块的末尾的异常处理模块作为所述出口的位置。
9.如权利要求8所述的追踪装置,其特征在于,所述第二确定子单元具体用于将所述函数的所有指令读入到内存中;从后向前寻找最后一条返回指令,将第一条指令至所述最后一条返回指令作为所述try...catch块的try部分,在catch部分直接记录函数出口信息,并利用所述异常处理模块将捕捉到的异常抛出。
10.如权利要求6~9任一项所述的追踪装置,其特征在于,还包括:
结果展示模块,用于以树的方式显示被返回的所述运行时间、所述函数名和/或所述函数参数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810594578.2A CN108959069A (zh) | 2018-06-11 | 2018-06-11 | 一种函数运行的追踪方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810594578.2A CN108959069A (zh) | 2018-06-11 | 2018-06-11 | 一种函数运行的追踪方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108959069A true CN108959069A (zh) | 2018-12-07 |
Family
ID=64488295
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810594578.2A Pending CN108959069A (zh) | 2018-06-11 | 2018-06-11 | 一种函数运行的追踪方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108959069A (zh) |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110674045A (zh) * | 2019-09-24 | 2020-01-10 | 北京达佳互联信息技术有限公司 | 信息追踪检测方法、装置以及电子设备、存储介质 |
CN110781060A (zh) * | 2019-09-20 | 2020-02-11 | 平安普惠企业管理有限公司 | 函数监控方法、装置、计算机设备及存储介质 |
CN110837372A (zh) * | 2019-11-04 | 2020-02-25 | 贵阳动视云科技有限公司 | 汇编代码清除混淆的方法、装置、介质及设备 |
CN111240930A (zh) * | 2020-01-08 | 2020-06-05 | 珠海金山网络游戏科技有限公司 | 一种获取游戏模块性能占用率的方法及系统 |
CN111367588A (zh) * | 2018-12-25 | 2020-07-03 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
CN111427780A (zh) * | 2020-03-10 | 2020-07-17 | 畅捷通信息技术股份有限公司 | 函数信息的追踪方法、装置和计算机可读存储介质 |
CN112506780A (zh) * | 2020-12-10 | 2021-03-16 | 零氪科技(北京)有限公司 | 一种问题追踪的方法、系统、电子设备及存储介质 |
CN112631904A (zh) * | 2020-12-17 | 2021-04-09 | 展讯通信(上海)有限公司 | 函数调用信息的记录方法及设备 |
CN112882912A (zh) * | 2021-02-01 | 2021-06-01 | 华东师范大学 | 一种应用于并行科学计算程序的函数运行时间测量方法 |
CN114860216A (zh) * | 2022-07-07 | 2022-08-05 | 麒麟软件有限公司 | 一种用于集成开发环境的c程序动态追踪方法及系统 |
CN116257457A (zh) * | 2023-05-15 | 2023-06-13 | 成都赛力斯科技有限公司 | 函数执行情况获取方法、装置、电子设备及可读存储介质 |
CN116610479A (zh) * | 2023-05-15 | 2023-08-18 | 成都赛力斯科技有限公司 | 一种自动监测故障方法、装置、电子设备及可读存储介质 |
US11972240B2 (en) | 2021-12-03 | 2024-04-30 | Samsung Electronics Co., Ltd. | Systems and methods for automapping source code to machine code |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1564137A (zh) * | 2004-04-09 | 2005-01-12 | 中兴通讯股份有限公司 | 一种嵌入式系统多任务并发调试的方法 |
US20140380283A1 (en) * | 2013-06-25 | 2014-12-25 | Purdue Research Foundation | Systems and Methods of Detecting Power Bugs |
CN104636259A (zh) * | 2015-03-18 | 2015-05-20 | 厦门雅迅网络股份有限公司 | 一种基于运行期动态跟踪的函数执行超时与死锁检测方法 |
CN105630668A (zh) * | 2014-12-01 | 2016-06-01 | 深圳市腾讯计算机系统有限公司 | 一种测试方法及装置 |
CN107797913A (zh) * | 2016-09-07 | 2018-03-13 | 大陆汽车电子(连云港)有限公司 | 一种实时系统的软件分析系统与方法 |
CN108089978A (zh) * | 2017-11-28 | 2018-05-29 | 华北电力大学(保定) | 一种分析asp.net应用软件性能及故障的诊断方法 |
-
2018
- 2018-06-11 CN CN201810594578.2A patent/CN108959069A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1564137A (zh) * | 2004-04-09 | 2005-01-12 | 中兴通讯股份有限公司 | 一种嵌入式系统多任务并发调试的方法 |
US20140380283A1 (en) * | 2013-06-25 | 2014-12-25 | Purdue Research Foundation | Systems and Methods of Detecting Power Bugs |
CN105630668A (zh) * | 2014-12-01 | 2016-06-01 | 深圳市腾讯计算机系统有限公司 | 一种测试方法及装置 |
CN104636259A (zh) * | 2015-03-18 | 2015-05-20 | 厦门雅迅网络股份有限公司 | 一种基于运行期动态跟踪的函数执行超时与死锁检测方法 |
CN107797913A (zh) * | 2016-09-07 | 2018-03-13 | 大陆汽车电子(连云港)有限公司 | 一种实时系统的软件分析系统与方法 |
CN108089978A (zh) * | 2017-11-28 | 2018-05-29 | 华北电力大学(保定) | 一种分析asp.net应用软件性能及故障的诊断方法 |
Non-Patent Citations (2)
Title |
---|
常达等: "基于二进制动态插装程序执行路径追踪", 《信息安全与技术》 * |
武剑洁等: "《软件测试技术基础[M]》", 31 October 2008, 华中科技大学出版社 * |
Cited By (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111367588A (zh) * | 2018-12-25 | 2020-07-03 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
CN111367588B (zh) * | 2018-12-25 | 2023-05-16 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
CN110781060A (zh) * | 2019-09-20 | 2020-02-11 | 平安普惠企业管理有限公司 | 函数监控方法、装置、计算机设备及存储介质 |
CN110674045B (zh) * | 2019-09-24 | 2023-06-23 | 北京达佳互联信息技术有限公司 | 信息追踪检测方法、装置以及电子设备、存储介质 |
CN110674045A (zh) * | 2019-09-24 | 2020-01-10 | 北京达佳互联信息技术有限公司 | 信息追踪检测方法、装置以及电子设备、存储介质 |
CN110837372A (zh) * | 2019-11-04 | 2020-02-25 | 贵阳动视云科技有限公司 | 汇编代码清除混淆的方法、装置、介质及设备 |
CN110837372B (zh) * | 2019-11-04 | 2021-01-26 | 贵阳动视云科技有限公司 | 汇编代码清除混淆的方法、装置、介质及设备 |
CN111240930A (zh) * | 2020-01-08 | 2020-06-05 | 珠海金山网络游戏科技有限公司 | 一种获取游戏模块性能占用率的方法及系统 |
CN111427780A (zh) * | 2020-03-10 | 2020-07-17 | 畅捷通信息技术股份有限公司 | 函数信息的追踪方法、装置和计算机可读存储介质 |
CN111427780B (zh) * | 2020-03-10 | 2024-05-31 | 畅捷通信息技术股份有限公司 | 函数信息的追踪方法、装置和计算机可读存储介质 |
CN112506780A (zh) * | 2020-12-10 | 2021-03-16 | 零氪科技(北京)有限公司 | 一种问题追踪的方法、系统、电子设备及存储介质 |
CN112506780B (zh) * | 2020-12-10 | 2024-08-23 | 零氪科技(北京)有限公司 | 一种问题追踪的方法、系统、电子设备及存储介质 |
CN112631904A (zh) * | 2020-12-17 | 2021-04-09 | 展讯通信(上海)有限公司 | 函数调用信息的记录方法及设备 |
CN112882912A (zh) * | 2021-02-01 | 2021-06-01 | 华东师范大学 | 一种应用于并行科学计算程序的函数运行时间测量方法 |
US11972240B2 (en) | 2021-12-03 | 2024-04-30 | Samsung Electronics Co., Ltd. | Systems and methods for automapping source code to machine code |
CN114860216A (zh) * | 2022-07-07 | 2022-08-05 | 麒麟软件有限公司 | 一种用于集成开发环境的c程序动态追踪方法及系统 |
CN116257457A (zh) * | 2023-05-15 | 2023-06-13 | 成都赛力斯科技有限公司 | 函数执行情况获取方法、装置、电子设备及可读存储介质 |
CN116610479A (zh) * | 2023-05-15 | 2023-08-18 | 成都赛力斯科技有限公司 | 一种自动监测故障方法、装置、电子设备及可读存储介质 |
CN116610479B (zh) * | 2023-05-15 | 2024-08-27 | 重庆赛力斯凤凰智创科技有限公司 | 一种自动监测故障方法、装置、电子设备及可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108959069A (zh) | 一种函数运行的追踪方法和装置 | |
US8849753B2 (en) | Automating asynchronous programming in single threaded systems | |
US11816018B2 (en) | Systems and methods of formal verification | |
Diemer et al. | Compositional performance analysis in python with pycpa | |
US7647219B2 (en) | Event-driven test framework | |
US7802233B2 (en) | Automated display of trace historical data | |
US20130318504A1 (en) | Execution Breakpoints in an Integrated Development Environment for Debugging Dataflow Progrrams | |
US8997059B2 (en) | Reverse debugging | |
US20140013313A1 (en) | Editor/Development Tool for Dataflow Programs | |
CN109101237A (zh) | 代码的加密编译方法及装置 | |
CN110799952A (zh) | 分布式时间旅行跟踪记录和重放 | |
CN105308578B (zh) | 状态转变的诊断 | |
CN110892384B (zh) | 对处理器未定义行为依赖的重放时间行程跟踪 | |
US10496423B2 (en) | Method for opening up data and functions of terminal application based on reconstruction technology | |
Doherty et al. | Making linearizability compositional for partially ordered executions | |
Tveito et al. | Global Reproducibility Through Local Control for Distributed Active Objects. | |
Lammich et al. | Predecessor sets of dynamic pushdown networks with tree-regular constraints | |
US20150106781A1 (en) | Verification of uml state machines | |
Owe | Verifiable Programming of Object-Oriented and Distributed Systems. | |
Pinisetty et al. | Tipex: A tool chain for timed property enforcement during execution | |
Keogh et al. | OOP demystified | |
Geeraerts et al. | Queue-dispatch asynchronous systems | |
Dixon et al. | Leafy automata for higher-order concurrency | |
CN113678110A (zh) | 时间旅行调试追踪中的存储器值暴露 | |
Sharma | Hands-On Reactive Programming with Reactor: Build reactive and scalable microservices using the Reactor framework |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20181207 |
|
RJ01 | Rejection of invention patent application after publication |