CN101788949A - 一种实现嵌入式***函数监控的方法及装置 - Google Patents
一种实现嵌入式***函数监控的方法及装置 Download PDFInfo
- Publication number
- CN101788949A CN101788949A CN201010121305A CN201010121305A CN101788949A CN 101788949 A CN101788949 A CN 101788949A CN 201010121305 A CN201010121305 A CN 201010121305A CN 201010121305 A CN201010121305 A CN 201010121305A CN 101788949 A CN101788949 A CN 101788949A
- Authority
- CN
- China
- Prior art keywords
- function
- monitoring
- monitored
- call
- call back
- 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.)
- Granted
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种实现嵌入式***函数监控的方法,通过在***断点链表中注册回调函数,在调用被监控函数时,通过调用该回调函数获得被监控函数的调用信息并保存到所设置的监控链表中。本发明还公开了一种实现嵌入式***函数监控的装置,在当前***运行过程中,可以随时通过从监控链表中查看被监控函数的调用信息,来判断当前函数A是否陷入死循环、函数A的执行结果是否正确,并获得函数A的调用频度等信息,无需在当前***增加调试代码或修改代码即可实现,可以有效减少***负担,有利于节省***资源;在***运行过程中便可执行,使用灵活。
Description
技术领域
本发明涉及嵌入式***的监控领域,尤其涉及一种实现嵌入式***函数监控的方法及装置。
背景技术
在嵌入式***中,尤其对通信产品***而言,功能、可靠性和执行效率是衡量一款产品优秀与否的重要指标,但无论如何优秀的产品,都不可避免会存在一些故障,只是故障表现的深浅不同。如何有效的定位出故障,是嵌入式软件开发人员需要面对的一个重要问题。
嵌入式***一般都是基于任务调度的,任务作为内核进行资源分配和调度的最小单元,对整个***的影响至关重要,一个任务出现异常,就有可能导致其他任务甚至整个***陷入瘫痪。如果以任务作为故障诊断的对象,那么任务可能出现的故障包括长时间占据CPU、挂起以及未实现预期功能。对于前两种故障,一般嵌入式***本身就会提供比较丰富的手段,来协助开发人员迅速找到事故现场。而对于最后一种故障,原因可能是由于嵌入式***中的一个或者多个函数功能不正常引起,此时就需要对函数的运行进行有效监控。
对函数的监控主要是对函数的调用关系、函数运行时间、是否发生死循环以及输入输出参数等信息的监控。通过增加调试代码是实现对函数监控的一种手段,但这种方式,不可避免的会占用***的一些额外资源,影响***的执行效率,而且对于很多嵌入式***,这种方式需要***重新加载,灵活性和应用范围受到很大限制。
发明内容
有鉴于此,本发明的主要目的在于提供一种实现嵌入式***函数监控的方法及装置,能够在不增加***负担、不修改***代码的前提下,实现对函数的监控。
为达到上述目的,本发明的技术方案是这样实现的:
本发明提供了一种实现嵌入式***函数监控的方法,所述方法包括:调用被监控函数之前,在当前***的断点链表中,注册用于获取所述被监控函数本次调用信息的回调函数;调用所述被监控函数时,调用所注册的回调函数,获得所述被监控函数本次被调用时的调用信息;将所获得的调用信息保存到预设的监控链表中。
在上述方案中,在所述注册被监控函数的回调函数之前,所述方法还包括:在当前***内,设置用于保存各被监控函数调用信息的监控链表,所设置的监控链表包含各被监控函数的监控表项,各监控表项中保存有所对应被监控函数的标识信息、以及调用信息。
在上述方案中,在所述注册被监控函数的回调函数之前,所述方法还包括:检测所述监控链表中是否已包含有被监控函数的监控表项;如果是,则从被监控函数的监控表项中获取所需的临时空间,存储被监控函数本次被调用时的调用信息;否则,在所述监控链表中设置所述被监控函数的监控表项,并从所设置的监控表项中获取所需的临时空间。
在上述方案中,所述注册被监控函数的回调函数的过程,具体为:在本次调用被监控函数之前,通过调用当前***的断点增加接口函数,完成所述回调函数的注册。
在上述方案中,所述调用回调函数并获得所述被监控函数本次的调用信息的过程,具体为:在本次调用所述被监控函数开始时和/或结束时,进入当前***的TRAP异常处理函数,通过所述TRAP异常处理函数完成所述回调函数的调用,再由所述回调函数从当前***中获取被监控函数本次的调用信息。
在上述方案中,通过所述TRAP异常处理函数完成所述回调函数的调用,具体为:将所述被监控函数的首地址和/或返回地址注册到所述断点链表中,并将所述被监控函数首地址和/或返回地址处的指令修改为TRAP指令;触发TRAP异常,进入TRAP异常处理函数,所述TRAP异常处理函数根据所述被监控函数的首地址或返回地址,调用所注册的回调函数。
在上述方案中,在获得被监控函数本次被调用的调用信息之后,所述方法还包括:通过所述的TRAP异常处理函数将所述被监控函数的首地址再次修改为TRAP指令。
在上述方案中,所述方法还包括:在将所述被监控函数首地址和/或返回地址处的指令修改为TRAP指令之前,备份所述地址处的原指令;在进入TRAP异常处理函数之后,由TRAP异常处理函数将被监控函数首地址或返回地址处的TRAP指令还原为原指令。
在上述方案中,所述将所获得的调用信息保存到所述的监控链表,具体为:将所述监控函数所对应监控表项的索引注册到所述断点链表中;所述的回调函数根据所注册的监控表项的索引,将所获得的被监控函数本次调用时的调用信息保存到所述的临时空间内。
在上述方案中,所述监控表项中还包括被监控函数的监控权限信息。
在上述方案中,在将所获得的调用信息保存到所述的监控链表之后,所述方法还包括:在调用所述被监控函数的任务或中断执行结束时,将所述断点链表中注册的回调函数清除。
本发明还提供了一种实现嵌入式***函数监控的装置,所述装置包括:注册单元、调用单元、存储单元,其中:注册单元,用于在当前***的断点链表中,注册用于获取所述被监控函数本次调用信息的回调函数;调用单元,用于调用所述注册单元注册的回调函数,获得所述被监控函数本次被调用时的调用信息;存储单元,用于将所述调用单元获得的调用信息保存到预设的监控链表中。
在上述方案中,所述装置还包括:设置单元,用于设置保存各被监控函数调用信息的监控链表。
在上述方案中,所述设置单元,还用于在所述监控链表中设置保存所述被监控函数的调用信息的监控表项。
在上述方案中,所述注册单元,具体用于通过调用当前***的断点增加接口函数,完成所述回调函数的注册。
在上述方案中,所述调用单元,具体用于通过当前***的TRAP异常处理函数,调用所述注册单元注册的回调函数,再通过所述回调函数从当前***中获得调用被监控函数的调用信息。
在上述方案中,所述装置还包括:清除单元,用于将所述注册单元在所述断点链表中注册的回调函数清除。
本发明通过在***断点链表中注册回调函数,在调用被监控函数时,通过调用该回调函数获得被监控函数的调用信息,并保存到所设置的监控链表中;在当前***运行过程中,可以随时通过从监控链表中查看被监控函数被调用过程中产生的信息,来判断当前函数是否陷入死循环、当前函数的执行结果是否正确,并获得当前函数的调用频度等信息,无需在当前***增加调试代码或修改代码即可实现,能有效减少***负担,有利于节省***资源;在***运行过程中便可执行,使用灵活。
附图说明
图1为本发明嵌入式***函数监控方法的流程示意图;
图2为本发明实现嵌入式***函数监控的装置的组成结构示意图;
图3为在监控链表中增加函数A监控点的实现流程示意图;
图4-1为任务E调用函数A时对函数A进行监控的一部分实现流程示意图;
图4-2为任务E调用函数A时对函数A进行监控的另一部分实现流程示意图。
具体实施方式
本发明实现嵌入式***函数监控的方法,参照图1所示,主要包括以下步骤:
步骤101:调用被监控函数之前,在当前***的断点链表中,注册用于获取所述被监控函数本次调用信息的回调函数;
步骤102:调用所述被监控函数时,调用所注册的回调函数,获得所述被监控函数本次被调用时的调用信息;
步骤103:将所获得的调用信息保存到预设的监控链表中。
这里,所述监控链表是预先设置的,用于保存各被监控函数的调用信息。
这里,被监控函数的调用信息具体可以是被监控函数在被调用时产生的任何信息。
具体地,调用被监控函数开始时的调用信息主要包括:调用被监控函数的任务名称、或者调用被监控函数的中断的向量值、以及调用被监控函数的时刻、堆栈回溯信息、被监控函数的传递参数、被监控函数被调用的次数等;
调用被监控函数结束时的调用信息主要包括:被监控函数的返回标识、被监控函数返回时的时刻、以及被监控函数返回的参数等,其中,被监控函数返回时的时刻为调用被监控函数结束时的时刻。
上述过程中,在步骤101的注册被监控函数的回调函数之前,所述方法还可以包括:在当前***内,设置用于保存各被监控函数调用信息的监控链表;其中,所述监控链表包含各被监控函数的监控表项,各监控表项中保存有所对应被监控函数的标识信息、以及调用信息。
相应的,在注册所述被监控函数的回调函数之前,所述方法还包括:检测所述监控链表中是否已包含有被监控函数的监控表项;如果是,则从被监控函数的监控表项中获取所需的一段临时空间,用于存储被监控函数本次被调用时的调用信息;否则,在所述监控链表中设置所述被监控函数的监控表项,并从所设置的监控表项中获取所需的一段临时空间。
具体地,可以在***中预先定义一个监控函数,由该监控函数来检测所述监控链表中是否已包含有被监控函数的监控表项;如果是,则直接在所述被监控函数的监控表项中获取所需的一段临时空间,用于存储被监控函数本次被调用时的调用信息;否则,在所设置的监控链表中,查找一个空闲表项,将所述被监控函数的标识信息写入该空闲表项,确定该空闲表项为所述被监控函数的监控表项,并在该空闲表项中获取所需的一段临时空间。
这里,上述监控表项中保存的被监控函数的标识信息可以是被监控函数的首地址,检测时,通过检测所述监控链表中是否保存有被监控函数的首地址,来确定在所述监控链表中是否已包含被监控函数的监控表项。
这里,可以通过已定义的监控函数,调用当前***的空间分配接口函数,由该空间分配接口函数为所述被监控函数分配所需的临时空间,使得所述被监控函数能够从自身的监控表项中获取所述的临时空间,以实时保存被监控函数的调用信息。
步骤101中注册被监控函数的回调函数的过程,具体为:
通过调用当前***的断点增加接口函数,在所述断点链表中完成所述回调函数的注册。
这里,可以根据实际应用需要,在调用被监控函数之前,分别通过调用所述的断点增加接口函数,在所述断点链表中注册第一回调函数、以及第二回调函数,其中,第一回调函数用于在本次调用被监控函数开始时获取调用信息,第二回调函数用于在本次调用被监控函数结束时获取调用信息。
具体地,可以通过预先定义的监控函数调用断点增加接口函数,完成第一回调函数的注册;第一回调函数在本次调用被监控函数开始时获得调用信息之后,调用断点增加接口函数,完成第二回调函数的注册。
步骤102中调用所述的回调函数并获得所述被监控函数调用信息的过程,具体为:在本次调用所述被监控函数开始时和/或结束时,进入当前***的TRAP异常处理函数,通过该TRAP异常处理函数完成所述回调函数的调用,再由该回调函数从当前***中获取被监控函数本次的调用信息。
具体地,通过TRAP异常处理函数完成所述回调函数的调用,过程如下:将所述被监控函数的首地址和/或返回地址注册到所述断点链表中,并将所述被监控函数首地址和/或返回地址处的指令修改为TRAP指令;在本次调用所述被监控函数开始时和/或结束时,触发TRAP异常,进入TRAP异常处理函数,该TRAP异常处理函数根据所述被监控函数的首地址或返回地址,调用所注册的回调函数,该回调函数从当前***中获取被监控函数的调用信息。
具体地,在调用被监控函数开始时,通过所述的TRAP异常处理函数,根据所述被监控函数的首地址,在当前***的断点链表中,查找到所注册的第一回调函数,调用该第一回调函数,通过该第一回调函数从当前***中获取被监控函数在被调用开始时的调用信息;
在调用被监控函数结束时,通过所述的TRAP异常处理函数,根据所述被监控函数的返回地址,在当前***的断点链表中,查找到所注册的第二回调函数,调用该第二回调函数,通过该第二回调函数从当前***中获取被监控函数在被调用结束时的调用信息。
这里,被监控函数的返回地址,为当前调用该被监控函数的任务或中断在调用被监控函数结束时,下一个要调用的指令所处的地址。
这里,所注册的回调函数可以通过从当前***中保存有所述调用信息的函数或内存中读取所需的调用信息,来获取所述的调用信息。
上述过程中,步骤102中还可以包括:在将所述被监控函数首地址和/或返回地址处的指令修改为TRAP指令之前,备份该地址处的原指令;在进入TRAP异常处理函数之后,由TRAP异常处理函数将被监控函数首地址或返回地址处的TRAP指令还原为原指令。
步骤103中,将所获得的调用信息保存到所述的监控链表的过程,具体可以为:
将所述监控函数所对应监控表项的索引注册到所述断点链表中;其中,所述的回调函数根据所注册的监控表项的索引,将所获得的被监控函数本次调用时的调用信息保存到所述的临时空间内。
具体地,由预先定义的监控函数在进行第一回调函数的注册时,将所述的监控函数所对应监控表项的索引注册到所述断点链表中,在调用被监控函数开始时,所述的TRAP异常处理函数将所述断点链表中已注册的监控表项的索引传送给所述的第一回调函数,第一回调函数从该监控表项的临时空间内获取所需的一段未使用的内存区,并将所获得的被监控函数调用开始时的调用信息保存到该内存区中;
第一回调函数在进行第二回调函数的注册时,将自身所获取内存区的地址注册到断点链表中,在调用被监控函数结束时,所述的TRAP异常处理函数将所述断点链表中已注册的内存区的地址传送给所述的第二回调函数,第二回调函数将自身获得的调用信息保存到该内存区中。
这里,在获得被监控函数调用结束时的调用信息后,步骤103还可以包括:将所述被监控函数的返回地址从所述断点链表中清除。
具体地,将所述被监控函数的返回地址、所注册的第二回调函数、以及所述第一回调函数获取的内存区的地址,都从所述断点链表中清除,以免在当前任务或当前中断再次调用被监控函数时,影响被监控函数的监控过程。
另外,本发明的嵌入式***的函数监控方法中,在步骤102中还可以包括:在获得被监控函数本次被调用的调用信息之后,通过TRAP异常处理函数将所述被监控函数的首地址再次修改为TRAP指令,以使得当前任务或当前中断再次调用被监控函数时能够调用所注册的回调函数,具体处理过程如下:
TRAP异常处理函数在调用所述回调函数之后,获取被监控函数首地址的下一条地址处的指令,并将该指令修改为TRAP指令;
在调用被监控函数的当前任务或当前中断,执行所述被监控函数首地址的下一条地址处的指令时,再次触发TRAP异常,进入TRAP异常处理函数;
TRAP异常处理函数再将被监控函数首地址处的指令重新修改为TRAP指令,使得当前任务或当前中断再次调用被监控函数时,能够再次通过TRAP异常处理函数来调用所注册的回调函数。
在步骤103结束之后,所述方法还可以包括:
在调用所述被监控函数的任务或中断执行结束时,将所述断点链表中注册的回调函数清除。
具体地,需要在当前任务或当前中断执行结束时,将所述断点链表中为被监控函数所注册的回调函数、被监控函数的首地址、以及被监控函数的监控表项的索引等都清除,防止在其他任务或中断调用被监控函数时监控过程受到影响。
在实际应用中,在设置被监控函数的监控表项时,还可以在该监控表项中设置被监控函数的监控权限信息。由于访问被监控函数的对象包括任务和中断,因此,被监控函数的监控权限信息可以包含表示以下含义的一个或多个参数:所有任务调用被监控函数时均监控、只在某一特定任务调用被监控函数时监控、所有中断调用被监控函数时均监控或只在某一特定中断调用被监控函数时监控、所有任务和所有中断调用被监控函数时均监控、所有任务以及某一特定中断调用被监控函数时监控、所有中断以及某一特定任务调用被监控函数时监控、只在某一特定任务和某一个特定中断调用被监控函数时监控。
为实现上述方法,本发明还提出一种实现嵌入式***的函数监控的装置,参照图2所示,主要包括:注册单元21、调用单元22、存储单元23,其中:
注册单元21,用于在当前***的断点链表中,注册用于获取所述被监控函数本次调用信息的回调函数;
调用单元22,用于调用所述注册单元21注册的回调函数,获得所述被监控函数本次被调用时的调用信息;
存储单元23,用于将所述调用单元22获得的调用信息保存到已设置的用于保存各被监控函数调用信息的监控链表中。
这里,所述装置还可以包括:设置单元24,用于设置保存各被监控函数调用信息的监控链表。
其中,所述设置单元24还用于在所述监控链表中设置保存所述被监控函数的调用信息的监控表项。
这里,所述装置还可以包括:清除单元25,用于将注册单元21在所述断点链表中注册的回调函数清除。
实际应用时,在调用所述被监控函数的任务或中断执行结束时,通过该清除单元25来将注册单元21所注册的回调函数清除,以避免对其他任务或中断调用被监控函数的监控过程造成影响。
这里,所述注册单元21具体用于:通过调用当前***的断点增加接口函数,完成所述回调函数的注册。
所述调用单元22具体用于:通过当前***的TRAP异常处理函数,调用所述注册单元注册的回调函数,再通过该回调函数从当前***中获得调用被监控函数的调用信息。
实际应用中,通过本发明装置的各部分实现嵌入式***中函数监控的具体过程,可以参照上文中方法的描述,在此不再赘述。
下面以任务E调用函数A时的监控过程为例,对本发明的具体实现过程做进一步详细说明。
在嵌入式***中,任务E调用函数A时,需要对函数A进行监控。
在实现对函数A的监控之前,首先需要在当前***中增加函数A的监控点,参照图3所示,具体流程如下:
步骤301:预先定义的监控函数检测函数A的首地址是否为合法的代码段地址,如果是,则继续步骤302,否则结束当前流程;
这里,检测函数A地址是否合法是为了防止在进行监控时,由于函数A的地址不合法而导致当前***崩溃。
步骤302:所述监控函数检测函数A首地址是否已保存在已设置的监控链表中,如果是,则进入步骤304,否则进入步骤303;
这里,监控链表预先设置在当前的嵌入式***中,用于保存各被监控函数的首地址和调用信息。该监控链表包含一个或多个监控表项,每个监控表项对应保存一个被监控函数的首地址和调用信息。
步骤303:所述监控函数在监控链表中查找一个空闲表项,将函数A的首地址写入该空闲表项,确定该空闲表项为函数A的监控表项,用于保存函数A的调用信息;
这里,如果在监控链表中未找到空闲表项,则可以通过手动删除当前监控链表中的任意一个或多个监控表项,来得到一个空闲表项。
步骤304:所述监控函数从所述函数A的监控表项中,动态获取所需的一段临时空间L,用于记录函数A本次被任务E调用时的调用信息。
这里,监控函数调用嵌入式***中用于分配临时空间的接口函数,由该接口函数从函数A的监控表项中分配所需的一段临时空间L给函数A,并将所分配的临时空间L的地址返回给所述监控函数。
在完成函数A监控点的增加过程后,函数A的一个新的监控点被加入到当前***的监控链表中并开始工作。通过该监控点,在任务E调用函数A的过程中,如图4-1、图4-2所示,实现对函数A监控的具体流程如下:
步骤401:所述监控函数调用当前***已定义的断点增加接口函数B,在当前***断点链表中任务E的断点表项内,增加函数A的第一断点项,将函数A的首地址、第一回调函数C1、以及函数A监控表项的索引K注册到该第一断点项,其中,第一回调函数C1用于在任务E本次调用函数A开始时获取函数A的调用信息;
这里,还可以根据实际需要,将函数A的第一断点项同时增加到需要监控的多个任务或中断的断点表项中。例如,需要在任务E和任务J调用函数A时均监控,则可以同时在任务E和任务J的断点表项内,都增加函数A的上述第一断点项。
步骤402:当前***从其他任务切换到新任务E时,调用任务切换钩子函数D,函数D遍历当前***的断点链表,检测到与新任务E相匹配的断点表项时,加载此断点表项,将函数A首地址处的原指令备份后修改为TRAP指令;
这里,步骤401-402的过程可以只在有任务切换时执行,同一任务多次调用被监控函数时,只需要在该任务初次调用被监控函数时执行一次。
步骤403:任务E运行过程中调用函数A时,调用函数A首地址处的TRAP指令,触发TRAP异常,进入TRAP异常处理函数F;
步骤404:TRAP异常处理函数F移除所加载的断点表项,将函数A首地址处的TRAP指令恢复为原指令,以确保在调用函数A开始时获取调用信息之后,任务E能够正常调用函数A;
步骤405:TRAP异常处理函数F从所增加的函数A的第一断点项中,调用已注册的第一回调函数C1,并将其中的函数A监控表项的索引K传送给该第一回调函数C1;
这里,TRAP异常处理函数F可以根据函数A的首地址,从断点链表中查找到已注册的第一回调函数C1、以及函数A监控表项的索引K,调用回调函数C,并将函数A监控表项的索引K传送给所述第一回调函数C1;
步骤406:第一回调函数C1检测函数A监控表项的索引K是否是合法的监控表项索引,如果是,则继续步骤407,否则结束当前监控流程;
这里,检测监控表项的索引是否合法可以根据当前***所设置的监控链表来确定。例如,当前***中所设置的监控链表包含7个监控表项,这7个监控表项分别以1-7的七个数值作为索引,检测时,通过判断索引K的数值是否超出7,或者是否小于1,来确定索引K是否合法。
步骤407:第一回调函数C1从当前***中获得调用开始的调用信息,如当前调用函数A的任务E的ID、调用函数A时的TICK值(时刻)、调用函数A时所传递的参数、堆栈回溯信息以及函数A被任务E调用的次数等,并从索引K所对应监控表项的临时空间L中获取所需的一段未使用的内存区M,将所获得的调用信息记录到该内存区M中;
这里,第一回调函数C1可以通过从当前***中保存有上述调用信息的函数或内存区中读取这些参数,以获得函数A的上述调用信息。
步骤408:第一回调函数C1设置函数A的返回标识,用于检测函数A是否正常返回;
步骤409:第一回调函数C1获取任务E本次调用函数A时的返回地址G,并检测该返回地址G是否合法,如果合法,则继续步骤410,否则结束当前流程;
这里,返回地址G为任务E在本次调用函数A结束后,要调用的下一条指令所存放的地址,也可以通过从当前***中保存有该返回地址G的函数或内存区中获取该返回地址G。
步骤410:第一回调函数C1调用断点增加接口函数B,在任务E的断点表项中增加函数A的第二断点项,将所获得的返回地址G、第二回调函数C2、以及所获取的内存区M的地址注册到该第二断点项,并将返回地址G处的原指令修改为TRAP指令,其中,第二回调函数C2用于在任务E本次调用函数A结束时获取函数A的调用信息,至此,第一回调函数C1的调用过程结束,返回到TRAP异常处理函数F;
步骤411:TRAP异常处理函数F获取函数A的首地址,将函数A首地址的下一条地址H处的原指令备份后,将地址H处的原指令修改为TRAP指令,至此,由函数A首地址处的指令发生异常所进入的TRAP异常处理函数F调用结束;
步骤412:任务E从TRAP异常处理函数F中返回,正常调用函数A,从函数A首地址开始执行,到达地址H时,调用地址H处的TRAP指令,再次触发TRAP异常,进入TRAP异常处理函数F;
步骤413:TRAP异常处理函数F将函数A首地址处的原指令重新修改为TRAP指令,并将地址H处的TRAP指令恢复为原指令,使得任务E下一次调用函数A时能够通过进入TRAP异常处理函数F来调用回调函数,以实现对函数A的再次监控,至此,由地址H处的指令发生异常所进入的TRAP异常处理函数调用结束;
步骤414:任务E从TRAP异常处理函数F中返回,继续调用函数A,在调用过程中,判断函数A是否正常返回,如果是,则继续步骤415,否则表明函数A陷入死循环,则无法进行后续的监控流程,因而结束当前监控过程;
这里,可以通过上述第一回调函数C1所设置的函数A的返回标识,来判断函数A是否正常返回;例如,若所设置的函数A的返回标识为0和1,在函数A被调用结束时,返回标识1;否则,函数A在被调用过程中以及其他均返回标识0,可以通过定时查询函数A的返回标识,如果函数A在设定时间内返回的标识持续为0,则函数A陷入死循环,否则,函数A正常返回。
步骤415:函数A正常返回,任务E结束函数A的调用过程,执行返回地址G处的TRAP指令,在函数A的当前监控过程中,再次触发TRAP异常,任务E第三次进入TRAP异常处理函数F;
步骤416:TRAP异常处理函数F将返回地址G处的指令恢复为原指令;
步骤417:TRAP异常处理函数F从任务E断点表项中函数A的第二断点项内调用已注册的第二回调函数C2,并将其中内存区M的地址传送给该第二回调函数C2;
步骤418:第二回调函数C2检测内存区M的地址是否合法,如果合法,则继续,否则结束当前流程;
步骤419:第二回调函数C2从当前***中获得函数A本次调用结束时的调用信息,如函数A的返回标识、函数A返回时的TICK值、以及函数A返回时传递的参数等,并根据内存区M的地址,将所获得的调用信息记录到内存区M中;
步骤420:第二回调函数C2将函数A的第二断点项从任务E的断点表项中清除,至此,第二回调函数C2的调用过程结束,任务E从TRAP异常处理函数F中返回,任务E本次调用函数A时的监控过程结束。
这里,如果任务E在之后的执行过程中,需要再次调用函数A,则重新执行步骤403到步骤420的过程,便可实现对函数A再次被调用时的监控。
在任务E执行结束时,由所述的监控函数清除断点链表中为函数A所设置的断点项,以防止在其他任务调用函数A时,影响函数A的监控过程。
这里,在当前***运行过程中,可以随时通过监控结果显示接口查看函数A在监控链表中所保存的调用信息,以判断当前函数A是否陷入死循环、函数A的执行结果是否正确,并获得函数A的调用频度等信息。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (17)
1.一种实现嵌入式***函数监控的方法,其特征在于,所述方法包括:
调用被监控函数之前,在当前***的断点链表中,注册用于获取所述被监控函数本次调用信息的回调函数;
调用所述被监控函数时,调用所注册的回调函数,获得所述被监控函数本次被调用时的调用信息;
将所获得的调用信息保存到预设的监控链表中。
2.根据权利要求1所述实现嵌入式***函数监控的方法,其特征在于,在所述注册被监控函数的回调函数之前,所述方法还包括:
在当前***内,设置用于保存各被监控函数调用信息的监控链表,所设置的监控链表包含各被监控函数的监控表项,各监控表项中保存有所对应被监控函数的标识信息、以及调用信息。
3.根据权利要求2所述实现嵌入式***函数监控的方法,其特征在于,在所述注册被监控函数的回调函数之前,所述方法还包括:
检测所述监控链表中是否已包含有被监控函数的监控表项;如果是,则从被监控函数的监控表项中获取所需的临时空间,存储被监控函数本次被调用时的调用信息;否则,在所述监控链表中设置所述被监控函数的监控表项,并从所设置的监控表项中获取所需的临时空间。
4.根据权利要求1所述实现嵌入式***函数监控的方法,其特征在于,所述注册被监控函数的回调函数的过程,具体为:
在本次调用被监控函数之前,通过调用当前***的断点增加接口函数,完成所述回调函数的注册。
5.根据权利要求1所述实现嵌入式***函数监控的方法,其特征在于,所述调用回调函数并获得所述被监控函数本次的调用信息的过程,具体为:
在本次调用所述被监控函数开始时和/或结束时,进入当前***的TRAP异常处理函数,通过所述TRAP异常处理函数完成所述回调函数的调用,再由所述回调函数从当前***中获取被监控函数本次的调用信息。
6.根据权利要求5所述实现嵌入式***函数监控的方法,其特征在于,通过所述TRAP异常处理函数完成所述回调函数的调用,具体为:
将所述被监控函数的首地址和/或返回地址注册到所述断点链表中,并将所述被监控函数首地址和/或返回地址处的指令修改为TRAP指令;
触发TRAP异常,进入TRAP异常处理函数,所述TRAP异常处理函数根据所述被监控函数的首地址或返回地址,调用所注册的回调函数。
7.根据权利要求6所述实现嵌入式***函数监控的方法,其特征在于,在获得被监控函数本次被调用的调用信息之后,所述方法还包括:
通过所述的TRAP异常处理函数将所述被监控函数的首地址再次修改为TRAP指令。
8.根据权利要求6所述实现嵌入式***函数监控的方法,其特征在于,所述方法还包括:
在将所述被监控函数首地址和/或返回地址处的指令修改为TRAP指令之前,备份所述地址处的原指令;在进入TRAP异常处理函数之后,由TRAP异常处理函数将被监控函数首地址或返回地址处的TRAP指令还原为原指令。
9.根据权利要求2所述实现嵌入式***函数监控的方法,其特征在于,所述将所获得的调用信息保存到所述的监控链表,具体为:
将所述监控函数所对应监控表项的索引注册到所述断点链表中;所述的回调函数根据所注册的监控表项的索引,将所获得的被监控函数本次调用时的调用信息保存到所述的临时空间内。
10.根据权利要求2所述实现嵌入式***函数监控的方法,其特征在于,所述监控表项中还包括被监控函数的监控权限信息。
11.根据权利要求1至10任一项所述实现嵌入式***函数监控的方法,其特征在于,在将所获得的调用信息保存到所述的监控链表之后,所述方法还包括:
在调用所述被监控函数的任务或中断执行结束时,将所述断点链表中注册的回调函数清除。
12.一种实现嵌入式***函数监控的装置,其特征在于,所述装置包括:注册单元、调用单元、存储单元,其中:
注册单元,用于在当前***的断点链表中,注册用于获取所述被监控函数本次调用信息的回调函数;
调用单元,用于调用所述注册单元注册的回调函数,获得所述被监控函数本次被调用时的调用信息;
存储单元,用于将所述调用单元获得的调用信息保存到预设的监控链表中。
13.根据权利要求12所述实现嵌入式***函数监控的装置,其特征在于,所述装置还包括:设置单元,用于设置保存各被监控函数调用信息的监控链表。
14.根据权利要求13所述实现嵌入式***函数监控的装置,其特征在于,所述设置单元,还用于在所述监控链表中设置保存所述被监控函数的调用信息的监控表项。
15.根据权利要求11所述实现嵌入式***函数监控的装置,其特征在于,
所述注册单元,具体用于通过调用当前***的断点增加接口函数,完成所述回调函数的注册。
16.根据权利要求11所述实现嵌入式***函数监控的装置,其特征在于,
所述调用单元,具体用于通过当前***的TRAP异常处理函数,调用所述注册单元注册的回调函数,再通过所述回调函数从当前***中获得调用被监控函数的调用信息。
17.根据权利要求11至16任一项所述实现嵌入式***函数监控的装置,其特征在于,所述装置还包括:清除单元,用于将所述注册单元在所述断点链表中注册的回调函数清除。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010121305.XA CN101788949B (zh) | 2010-03-10 | 2010-03-10 | 一种实现嵌入式***函数监控的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010121305.XA CN101788949B (zh) | 2010-03-10 | 2010-03-10 | 一种实现嵌入式***函数监控的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101788949A true CN101788949A (zh) | 2010-07-28 |
CN101788949B CN101788949B (zh) | 2015-01-28 |
Family
ID=42532170
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010121305.XA Active CN101788949B (zh) | 2010-03-10 | 2010-03-10 | 一种实现嵌入式***函数监控的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101788949B (zh) |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103577304A (zh) * | 2012-08-10 | 2014-02-12 | 百度在线网络技术(北京)有限公司 | 一种代码动态分析的方法及装置 |
CN105183629A (zh) * | 2014-05-29 | 2015-12-23 | 北京基调网络***有限公司 | 分析php应用软件性能的诊断***及其方法和性能管理平台 |
CN105426755A (zh) * | 2015-11-24 | 2016-03-23 | 无锡江南计算技术研究所 | 一种基于哈希算法的库函数安全增强方法 |
CN102722440B (zh) * | 2012-06-07 | 2017-03-15 | 中兴通讯股份有限公司 | 一种嵌入式***可执行代码的调试装置、调试方法及嵌入式*** |
CN106557300A (zh) * | 2015-09-24 | 2017-04-05 | 腾讯科技(深圳)有限公司 | 一种野指针的函数栈信息确定方法、装置及电子设备 |
CN106886570A (zh) * | 2017-01-16 | 2017-06-23 | 网宿科技股份有限公司 | 页面处理方法及装置 |
CN107038116A (zh) * | 2017-03-16 | 2017-08-11 | 杭州朔天科技有限公司 | 异构多核芯片***中通过大核调试小核程序的实现方法 |
CN107102944A (zh) * | 2017-04-07 | 2017-08-29 | 北京深思数盾科技股份有限公司 | 一种调用函数的分析方法及装置 |
CN107168857A (zh) * | 2017-03-31 | 2017-09-15 | 武汉斗鱼网络科技有限公司 | 一种统计应用程序中的函数调用的方法及组件 |
CN107766216A (zh) * | 2016-08-19 | 2018-03-06 | 阿里巴巴集团控股有限公司 | 一种用于获取应用执行信息的方法与设备 |
CN107908537A (zh) * | 2017-11-27 | 2018-04-13 | 郑州云海信息技术有限公司 | 一种基于内核模块异常信息处理的***及方法 |
CN109547430A (zh) * | 2018-11-16 | 2019-03-29 | 上海朔羡网络科技有限公司 | 一种开发服务网关***及开发服务网关 |
CN109840181A (zh) * | 2018-12-26 | 2019-06-04 | 山东中创软件商用中间件股份有限公司 | 一种事件同步方法、装置、设备及计算机可读存储介质 |
CN112732513A (zh) * | 2019-10-28 | 2021-04-30 | 腾讯科技(深圳)有限公司 | 内存监控方法、装置、计算机可读存储介质和计算机设备 |
CN115185359A (zh) * | 2022-09-09 | 2022-10-14 | 粤港澳大湾区数字经济研究院(福田) | 一种机密计算协处理器***及其掉电保护方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030208745A1 (en) * | 2002-05-01 | 2003-11-06 | Juraj Bystricky | Software breakpoints implementation via specially named function |
CN1570879A (zh) * | 2003-07-25 | 2005-01-26 | 华为技术有限公司 | 一种存储异常信息的方法 |
CN101625659A (zh) * | 2009-07-03 | 2010-01-13 | 无敌科技(西安)有限公司 | 嵌入式***实时监控内存的方法 |
-
2010
- 2010-03-10 CN CN201010121305.XA patent/CN101788949B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030208745A1 (en) * | 2002-05-01 | 2003-11-06 | Juraj Bystricky | Software breakpoints implementation via specially named function |
CN1570879A (zh) * | 2003-07-25 | 2005-01-26 | 华为技术有限公司 | 一种存储异常信息的方法 |
CN101625659A (zh) * | 2009-07-03 | 2010-01-13 | 无敌科技(西安)有限公司 | 嵌入式***实时监控内存的方法 |
Non-Patent Citations (4)
Title |
---|
兰利东 等: "GDB 远程调试环境的设计与实现", 《单片机与嵌入式***应用》, no. 10, 1 December 2005 (2005-12-01), pages 22 - 25 * |
吴超: "Windows环境下隐蔽调试器的设计与实现", 《中国优秀硕士学位论文》, no. 11, 15 November 2009 (2009-11-15), pages 46 - 50 * |
郭胜超 等: "GDB远程调试及其在嵌入式Linux***中的应用", 《计算机工程与科学》, vol. 26, no. 10, 21 October 2004 (2004-10-21) * |
黄红燕 等: "GDB stub的剖析与改进", 《电子技术应用》, no. 5, 31 May 2006 (2006-05-31) * |
Cited By (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102722440B (zh) * | 2012-06-07 | 2017-03-15 | 中兴通讯股份有限公司 | 一种嵌入式***可执行代码的调试装置、调试方法及嵌入式*** |
CN103577304A (zh) * | 2012-08-10 | 2014-02-12 | 百度在线网络技术(北京)有限公司 | 一种代码动态分析的方法及装置 |
CN103577304B (zh) * | 2012-08-10 | 2018-11-09 | 百度在线网络技术(北京)有限公司 | 一种代码动态分析的方法及装置 |
CN105183629A (zh) * | 2014-05-29 | 2015-12-23 | 北京基调网络***有限公司 | 分析php应用软件性能的诊断***及其方法和性能管理平台 |
CN105183629B (zh) * | 2014-05-29 | 2018-06-22 | 北京基调网络***有限公司 | 分析php应用软件性能的诊断***及其方法和性能管理平台 |
CN106557300A (zh) * | 2015-09-24 | 2017-04-05 | 腾讯科技(深圳)有限公司 | 一种野指针的函数栈信息确定方法、装置及电子设备 |
CN106557300B (zh) * | 2015-09-24 | 2020-04-07 | 腾讯科技(深圳)有限公司 | 一种野指针的函数栈信息确定方法、装置及电子设备 |
CN105426755A (zh) * | 2015-11-24 | 2016-03-23 | 无锡江南计算技术研究所 | 一种基于哈希算法的库函数安全增强方法 |
CN107766216A (zh) * | 2016-08-19 | 2018-03-06 | 阿里巴巴集团控股有限公司 | 一种用于获取应用执行信息的方法与设备 |
CN106886570B (zh) * | 2017-01-16 | 2020-11-13 | 网宿科技股份有限公司 | 页面处理方法及装置 |
CN106886570A (zh) * | 2017-01-16 | 2017-06-23 | 网宿科技股份有限公司 | 页面处理方法及装置 |
CN107038116A (zh) * | 2017-03-16 | 2017-08-11 | 杭州朔天科技有限公司 | 异构多核芯片***中通过大核调试小核程序的实现方法 |
CN107168857A (zh) * | 2017-03-31 | 2017-09-15 | 武汉斗鱼网络科技有限公司 | 一种统计应用程序中的函数调用的方法及组件 |
CN107168857B (zh) * | 2017-03-31 | 2021-01-01 | 武汉斗鱼网络科技有限公司 | 一种统计应用程序中的函数调用的方法及组件 |
CN107102944B (zh) * | 2017-04-07 | 2020-01-24 | 北京深思数盾科技股份有限公司 | 一种调用函数的分析方法及装置 |
CN107102944A (zh) * | 2017-04-07 | 2017-08-29 | 北京深思数盾科技股份有限公司 | 一种调用函数的分析方法及装置 |
CN107908537A (zh) * | 2017-11-27 | 2018-04-13 | 郑州云海信息技术有限公司 | 一种基于内核模块异常信息处理的***及方法 |
CN109547430A (zh) * | 2018-11-16 | 2019-03-29 | 上海朔羡网络科技有限公司 | 一种开发服务网关***及开发服务网关 |
CN109840181A (zh) * | 2018-12-26 | 2019-06-04 | 山东中创软件商用中间件股份有限公司 | 一种事件同步方法、装置、设备及计算机可读存储介质 |
CN112732513A (zh) * | 2019-10-28 | 2021-04-30 | 腾讯科技(深圳)有限公司 | 内存监控方法、装置、计算机可读存储介质和计算机设备 |
CN115185359A (zh) * | 2022-09-09 | 2022-10-14 | 粤港澳大湾区数字经济研究院(福田) | 一种机密计算协处理器***及其掉电保护方法 |
CN115185359B (zh) * | 2022-09-09 | 2023-01-06 | 粤港澳大湾区数字经济研究院(福田) | 一种机密计算协处理器***及其掉电保护方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101788949B (zh) | 2015-01-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101788949A (zh) | 一种实现嵌入式***函数监控的方法及装置 | |
US9218203B2 (en) | Packet scheduling in a multiprocessor system using inter-core switchover policy | |
CN105843741B (zh) | 应用程序的信息处理方法和装置 | |
CN102984029B (zh) | 应用于分布式***的心跳检测装置和方法、网络设备 | |
CN104115154A (zh) | 当在域之间切换时维持安全数据与不安全访问相隔离 | |
CN106326066B (zh) | 一种嵌入式***任务响应性能的监测调整的方法及其*** | |
CN106919462B (zh) | 一种生成处理器故障记录的方法及装置 | |
CN109918141A (zh) | 线程执行方法、装置、终端及存储介质 | |
CN105677462A (zh) | 基于物联网的分布式任务***及业务处理方法 | |
US20220391256A1 (en) | Non-transitory computer-readable storage medium, information processing apparatus, and multiplex control method | |
CN104679645A (zh) | 一种栈空间余量实时检测方法 | |
CN103458527B (zh) | 前导检测任务处理调度方法及装置 | |
CN104298602A (zh) | 一种调试应用程序的方法及装置 | |
CN104391754A (zh) | 一种任务异常的处理方法及装置 | |
CN105224403B (zh) | 一种中断处理方法及装置 | |
CN109656783A (zh) | ***平台监控方法及装置 | |
CN101599113A (zh) | 驱动型恶意软件防御方法和装置 | |
EP3765963B1 (en) | Tracing branch instructions | |
CN102929770B (zh) | 嵌入式linux***用户态任务独占的监测定位方法 | |
EP2630577B1 (en) | Exception control in a multiprocessor system | |
CN106371809A (zh) | 线程处理器及线程处理方法 | |
CN113687942B (zh) | 检测方法、装置及电子设备 | |
CN110874279A (zh) | 故障定位方法、装置和*** | |
CN111857689A (zh) | 一种框架、框架的功能配置方法、终端及存储介质 | |
CN109101260B (zh) | 一种节点软件的升级方法、装置和计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |