CN104572448A - 一种线程堆栈的使用情况的实现方法和装置 - Google Patents
一种线程堆栈的使用情况的实现方法和装置 Download PDFInfo
- Publication number
- CN104572448A CN104572448A CN201410815476.0A CN201410815476A CN104572448A CN 104572448 A CN104572448 A CN 104572448A CN 201410815476 A CN201410815476 A CN 201410815476A CN 104572448 A CN104572448 A CN 104572448A
- Authority
- CN
- China
- Prior art keywords
- address
- thread stacks
- service condition
- thread
- stacks
- 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
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本申请实施例提供了一种任务堆栈使用情况的实现方法和装置,其中,线程堆栈的检测方法具体包括:在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;依据所述分界地址,计算得到所述线程堆栈的使用情况;在所述线程堆栈的使用情况超过预设门限时,发出告警信息;其中,所述预设门限低于所述线程堆栈的容量。本申请实施例能够提高任务的执行效率和提升用户体验。
Description
技术领域
本申请涉及计算机操作系统技术领域,特别是涉及一种任务堆栈使用情况的实现方法和装置。
背景技术
在计算机操作系统中,正在计算机中执行的程序称为进程(Process),而线程(Thread)为进程中某个单一顺序的控制流,其为程序执行流的最小单元。一个标准的线程通常由线程标识(ID)、当前指令指针(PC)、寄存器集合和堆栈组成。一个进程可以由一个或多个线程组成,这些线程共享进程的地址空间。
目前,每一个线程的堆栈容量由程序员在创建线程时进行配置。如果配置的堆栈容量偏小,而线程本身又进行了相关的递归操作,或者定义了比较大的局部变量,则容易导致线程实际使用的堆栈容量超过上述配置的堆栈容量,也就是堆栈溢出,由于产生堆栈溢出的线程与其它线程共享地址空间,因此,该线程的堆栈溢出容易破坏其它线程的数据,从而导致整个进程崩溃。而如果配置的堆栈容量偏大,堆栈的使用又将造成系统内存资源的浪费。因此,线程堆栈的检测是非常重要的技术。
现有的可移植操作系统接口(POSIX,Portable Operating SystemInterface)标准定义了嵌入式操作系统应该为应用程序提供的接口标准。POSIX标准提供了一种堆栈溢出的检测手段,该检测手段为线程堆栈设置了一个满栈警戒区,该满栈警戒区处于线程堆栈底部,属于线程堆栈的一个扩展区域,当对线程堆栈末尾的警戒缓冲区进行访问时,嵌入式系统会发出错误信号,通常是发送段违例(SIGSEGV,Segmentation violation)信号给线程。然而,当发出错误信号时,嵌入式操作系统已经处于异常工作状态,一般都采用复位方式以尽快回到工作状态,既中止了正在执行的任务影响了任务的执行效率,又降低了用户体验。
发明内容
本申请实施例所要解决的技术问题是提供一种线程堆栈的检测方法和装置,能够提高任务的执行效率和提升用户体验。
相应的,本申请实施例还提供了一种任务堆栈使用情况的查询方法和装置,为用户提供线程堆栈的使用情况的查询接口,以方便用户对堆栈使用情况的实时检测。
为了解决上述问题,本申请公开了一种线程堆栈的检测方法,包括:
在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
依据所述分界地址,计算得到所述线程堆栈的使用情况;
在所述线程堆栈的使用情况超过预设门限时,发出告警信息;其中,所述预设门限低于所述线程堆栈的容量。
优选的,所述依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址的步骤,包括:
在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址,或者,在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址。
优选的,所述在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址的步骤,包括:
按照从高地址到低地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个不为所述预定值的堆栈地址作为所述分界地址。
优选的,所述在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址的步骤,包括:
按照从低地址到高地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个为所述预定值的堆栈地址作为所述分界地址。
优选的,所述依据所述分界地址,计算得到所述线程堆栈的使用情况的步骤,包括:
以所述线程堆栈的栈顶地址与所述分界地址的差值确定所述线程堆栈的使用情况;或者,
以所述线程堆栈的栈顶地址与所述分界地址的差值相对于所述线程堆栈的容量的比例,确定所述线程堆栈的使用情况。
优选的,所述方法还包括:依据所述告警信息,通过堆栈解析得到所述线程堆栈的故障现场信息。
另一方面,本申请还提供了一种线程堆栈的使用情况的查询方法,包括:
接收查询请求;所述查询请求中携带有线程堆栈;
依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况;所述线程堆栈的使用情况记录中记录有系统中线程堆栈的使用情况;
将所获取的所述线程堆栈的使用情况作为查询结果返回;
其中,通过如下步骤生成所述线程堆栈的使用情况记录:
在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
依据所述分界地址,计算得到所述线程堆栈的使用情况;
将所述线程堆栈的使用情况添记录至线程堆栈的使用情况记录。
优选的,所述线程堆栈的使用情况记录中还记录有所述线程堆栈的使用情况的记录时间;
所述依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况的步骤,包括:依据线程堆栈的使用情况记录获取所述线程堆栈的、记录时间最新的使用情况。
再一方面,本申请还公开了一种线程堆栈的检测装置,包括:
初始化模块,用于在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
查询模块,用于在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
计算模块,用于依据所述分界地址,计算得到所述线程堆栈的使用情况;及
告警模块,用于在所述线程堆栈的使用情况超过预设门限时,发出告警信息;其中,所述预设门限低于所述线程堆栈的容量。
优选的,所述查询模块包括:
第一查询子模块,用于在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址;或者,
第二查询子模块,用于在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址。
优选的,所述第一查询子模块,具体用于按照从高地址到低地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个不为所述预定值的堆栈地址作为所述分界地址。
优选的,所述第二查询子模块,具体用于按照从低地址到高地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个为所述预定值的堆栈地址作为所述分界地址。
又一方面,本申请还公开了一种线程堆栈的使用情况的查询装置,包括:
接口模块,用于接收查询请求;所述查询请求中携带有线程堆栈;
查询模块,用于依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况;所述线程堆栈的使用情况记录中记录有系统中线程堆栈的使用情况;
返回模块,用于将所获取的所述线程堆栈的使用情况作为查询结果返回;及
记录生成模块,用于生成所述线程堆栈的使用情况记录;
其中,所述记录生成模块包括:
初始化子模块,用于在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
查询子模块,用于在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
计算子模块,用于依据所述分界地址,计算得到所述线程堆栈的使用情况;及
记录子模块,用于将所述线程堆栈的使用情况添记录至线程堆栈的使用情况记录。
优选的,所述线程堆栈的使用情况记录中还记录有所述线程堆栈的使用情况的记录时间;
所述查询模块,具体用于依据线程堆栈的使用情况记录获取所述线程堆栈的、记录时间最新的使用情况。
与现有技术相比,本申请实施例包括以下优点:
现有技术在对线程堆栈末尾的警戒缓冲区进行访问时,嵌入式操作系统已经处于异常工作状态,只能采用复位方式以尽快回到工作状态,既中止了任务,又没有给故障诊断预留时间;而本申请实施例在所述线程执行完任务后,依据初始化时的预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址,并在所述线程堆栈的使用情况超过预设门限时发出告警信息;
第一,由于所述预设门限低于所述线程堆栈的容量,故能够在对线程堆栈末尾的警戒缓冲区进行访问前发出告警信息,因此能够避免出现对线程堆栈末尾的警戒缓冲区的访问导致的复位现象,从而能够避免任务的中止,故能够提高任务的执行效率和提升用户体验;
第二,本申请实施例在对线程堆栈末尾的警戒缓冲区进行访问前发出告警信息,还能够使得程序员依据所述告警信息获取相应的故障现场信息,以根据故障现场信息,定位相应的出错根源,以优化任务代码;
第三,在所述线程为通讯相关线程时,现有技术的对线程堆栈末尾的警戒缓冲区的访问已经导致系统异常,因此,系统无法通过PC(个人计算机,Personal Computer)连接设备,无法进行远程连接;而本申请实施例能够通过远程连接发出告警信息,例如,RRU((射频拉远单元,Radio Remote Unit))的板卡可以将告警信息上报给基站。
附图说明
图1是本申请的一种线程堆栈的检测方法实施例的步骤流程图;
图2是本申请实施例一种堆栈的示意图;
图3是本申请实施例一种线程堆栈的使用情况的示意图;
图4是本申请的一种线程堆栈的使用情况的查询方法实施例的步骤流程图;
图5是本申请一种线程堆栈的检测方法的应用示例的流程图;
图6是本申请一种线程堆栈的检测装置实施例的结构框图;以及
图7是本申请的一种线程堆栈的使用情况的查询装置实施例的结构框图。
具体实施方式
为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本申请作进一步详细的说明。
本申请实施例的核心构思之一在于,在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;一方面,通常线程在占用堆栈地址空间后,通常使用堆栈来存放函数的参数值、局部变量的值等,这就意味着一旦堆栈地址空间被使用,则相应地址空间的值就被修改为需要存放的值,而不再是初始化时的预定值;另一方面,堆栈为是一块连续的内存的区域,且依据堆栈后进先出的原则,堆栈中已使用地址空间与未使用地址空间仍分别为连续的区域;因此,上述初始化时的预定值可用于查询已使用地址空间与未使用地址空间的分界地址,进一步,可依据上述分界地址得到所述线程堆栈的使用情况及进行相应的告警处理。
参照图1,示出了本申请的一种线程堆栈的检测方法实施例的步骤流程图,具体可以包括如下步骤:
步骤101、在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
步骤102、在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
本申请实施例可以应用于Linux、vxworks等各种嵌入式系统,用于检测嵌入式系统中的线程堆栈。
参照图2,示出了本申请实施例一种堆栈的示意图,其中,Base表示堆栈的基址,N用于表示堆栈容量,SP表示堆栈指针,可用来指示堆栈当前的使用位置。
通常堆栈为向低地址扩展的数据结构,故在所述线程执行完任务后,所述线程堆栈的地址空间中已使用地址空间位于上方区域,未使用地址空间位于下方区域;并且,由于已被使用,已使用地址空间的值已被修改为不同于上述预定值的值,而未使用地址空间的值仍为初始化时的预定值,故已使用地址空间与未使用地址空间在分界处可以具有一个明显的分界地址。
参照图3,示出了本申请实施例一种线程堆栈的使用情况的示意图,其中,已使用地址空间与未使用地址空间的一个显著区别在于,已使用地址空间的值为非预定值,而未使用地址空间的值为预定值,故可以通过查询得到相应的分界地址。
需要说明的是,本申请实施例的分界地址具体可以包括:位于已使用地址空间的第一分界地址,及位于未使用地址空间的第二分界地址,在具体实现中,查询到上述两个地址中的一个即可。
另外,需要说明的是,已使用地址空间用于存放函数的参数值、局部变量的值等,故为了便于查询,所述预定值应避免与函数的参数值、局部变量的值相同,也即,所述预定值可以为防止与函数的参数值、局部变量的值相同从而引起查询冲突的各种值,例如,其可以为生僻值,如0x5a5a等,由于程序员一般不会采用生僻值来为函数的参数和局部变量赋值,故能够起到较好的防冲突作用。
本申请实施例可以提供如下所述依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址的技术方案:
技术方案一
技术方案一可以在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址。
具体地,所述在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址的步骤,具体可以包括:按照从高地址到低地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个不为所述预定值的堆栈地址作为所述分界地址。
现有的堆栈通常从高地址向低地址延伸,故技术方案一可以按照从高地址向低地址的顺序查询所述线程堆栈的地址空间。现有的线程接口会提供线程堆栈地址的查询接口,如POSIX提供的pthread_getattr_np()函数可用于查询线程堆栈的地址范围,在得到线程的地址范围之后,只需查询最后一个不是预定值“0x5a5a”的地址,就可得到上述第一分界地址;可以采用二分法等查找方法,当然本申请实施例对具体的查找方法不加以限制。
技术方案二
技术方案二可以在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址。
具体地,所述在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址的步骤,具体可以包括:按照从低地址到高地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个为所述预定值的堆栈地址作为所述分界地址。
技术方案二可以按照从低地址向高地址的查询顺序查找得到上述第二分界地址,由于查询原理与技术方案一类似,故在此不作赘述,相互参照即可。
步骤103、依据所述分界地址,计算得到所述线程堆栈的使用情况;
本申请实施例中,所述线程堆栈的使用情况可用于表示线程堆栈的使用大小或者线程堆栈的使用比例;
其中,在所述线程堆栈的使用情况表示线程堆栈的使用大小时,所述依据所述分界地址,计算得到所述线程堆栈的使用情况的步骤,具体可以包括:以所述线程堆栈的栈顶地址与所述分界地址的差值确定所述线程堆栈的使用大小;以图2所示堆栈为例,假设查询得到的第一分界地址为addr,那么,线程堆栈的使用大小可表示为(Base+N–1)-addr;
在所述线程堆栈的使用情况表示线程堆栈的使用比例时,所述依据所述分界地址,计算得到所述线程堆栈的使用情况的步骤,具体可以包括:以所述线程堆栈的栈顶地址与所述分界地址的差值相对于所述线程堆栈的容量的比例,确定所述线程堆栈的使用情况;以图2所示堆栈为例,假设查询得到的第一分界地址为addr,那么,线程堆栈的使用大小可表示为((Base+N–1)-addr)/N。
步骤104、在所述线程堆栈的使用情况超过预设门限时,发出告警信息;其中,所述预设门限低于所述线程堆栈的容量。
由于所述预设门限低于所述线程堆栈的容量,故本申请实施例能够在对线程堆栈末尾的警戒缓冲区进行访问前发出告警信息,因此能够避免出现对线程堆栈末尾的警戒缓冲区的访问导致的复位现象,从而能够避免任务的中止,故能够提高任务的执行效率和提升用户体验;并且,能够使得程序员依据所述告警信息获取相应的故障现场信息。
例如,如果希望对故障问题进一步的诊断,可以将所述预设门限设置的低一些,例如80%(所述线程堆栈的使用情况不超过线程堆栈的容量的80%),在出现故障问题后,现场堆栈还有20%的剩余空间,任务可以继续运行,故可以在任务运行的同时,对故障问题进一步的诊断。当然,上述80%只是作为示例,本领域技术人员可以依据实际需求采用各种各样的、低于所述线程堆栈的容量的预设门限。
因此,在本申请的一种优选实施例中,所述方法还可以包括:依据所述告警信息,通过堆栈解析得到所述线程堆栈的故障现场信息。而程序员可以根据故障现场信息,定位相应的出错根源,以优化任务代码。其中,所述堆栈解析的原理为查看从异常代码到上层逐级调用都使用了那些函数,例如,解析结果中可以包括:A函数调用了B函数,B函数运行到到第10行线程异常等等;通常的嵌入式系统会提供堆栈解析的相关函数,例如linux的backtrace等。
综上,现有技术在对线程堆栈末尾的警戒缓冲区进行访问时,嵌入式操作系统已经处于异常工作状态,只能采用复位方式以尽快回到工作状态,既中止了任务,又没有给故障诊断预留时间;而本申请实施例在所述线程执行完任务后,依据初始化时的预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址,并在所述线程堆栈的使用情况超过预设门限时发出告警信息;本申请实施例具有如下优点:
第一,由于所述预设门限低于所述线程堆栈的容量,故能够在对线程堆栈末尾的警戒缓冲区进行访问前发出告警信息,因此能够避免出现对线程堆栈末尾的警戒缓冲区的访问导致的复位现象,从而能够避免任务的中止,故能够提高任务的执行效率和提升用户体验;
第二,本申请实施例在对线程堆栈末尾的警戒缓冲区进行访问前发出告警信息,还能够使得程序员依据所述告警信息获取相应的故障现场信息,以根据故障现场信息,定位相应的出错根源,以优化任务代码;
第三,在所述线程为通讯相关线程时,现有技术的对线程堆栈末尾的警戒缓冲区的访问已经导致系统异常,因此,系统无法通过PC(个人计算机,Personal Computer)连接设备,无法进行远程连接;而本申请实施例能够通过远程连接发出告警信息,例如,RRU((射频拉远单元,Radio Remote Unit))的板卡可以将告警信息上报给基站。
参照图4,示出了本申请的一种线程堆栈的使用情况的查询方法实施例的步骤流程图,具体可以包括如下步骤:
步骤401、接收查询请求;所述查询请求中携带有线程堆栈;
步骤402、依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况;所述线程堆栈的使用情况记录中记录有系统中线程堆栈的使用情况;
步骤403、将所获取的所述线程堆栈的使用情况作为查询结果返回;
其中,可以通过如下步骤生成所述线程堆栈的使用情况记录:
步骤S100、在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
步骤S101、在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
步骤S102、依据所述分界地址,计算得到所述线程堆栈的使用情况;
步骤S103、将所述线程堆栈的使用情况添记录至线程堆栈的使用情况记录。
本实施例可以为用户提供线程堆栈的使用情况的查询接口,以方便用户对堆栈使用情况的实时检测。
在本申请的一种优选实施例中,所述线程堆栈的使用情况记录中还可记录有所述线程堆栈的使用情况的记录时间;
则所述依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况的步骤,具体可以包括:依据线程堆栈的使用情况记录获取所述线程堆栈的、记录时间最新的使用情况。
对于用户而言,本申请实施例提供的线程堆栈的使用情况能够为线程堆栈的容量配置提供合理的依据;在实际中,可以在嵌入式设备的测试过程中,首先根据经验进行线程堆栈容量的初步设置,然后,根据该线程堆栈在一段时间内的使用情况重新配置更为合理的线程堆栈容量;
在无法知道任务运行所需堆栈的情况下,通常会分配一个比较大的堆栈容量给线程,例如100k,而线程堆栈的使用情况表明线程堆栈都在实际中仅仅用了30%甚至更少的堆栈,例如线程A在设备运行3个月内线程堆栈的使用情况的最大值为30K,故可以30K为基准容量重新配置线程堆栈容量,例如,可以将基准容量除以deta作为重新配置的线程堆栈容量,其中deta可以为小于1的数,例如,deta可以为0.8;此种重新配置线程堆栈容量的方法既能够避免内存资源的浪费,又能够避免堆栈溢出现象。
为使本领域技术人员更好地理解本申请实施例,参照图5,示出了本申请一种线程堆栈的检测方法的应用示例的流程图,具体可以包括:
步骤501、使用POSIX线程接口创建线程,获取线程堆栈基址和线程堆栈大小;
步骤502、初始化所有线程堆栈空间为预定值;
步骤503、线程等待触发条件;
通常一个线程具有自己的用途,比如某些线程是用来轮询板卡的状态的,如果3分钟查询一次,那么该线程的触发条件就是3分钟计时到达;又如,有些线程是事件类触发的,例如在基带处理单元给射频单元发送小区建立的消息时,相应的线程需要要完成小区建立的相关RRU配置,等等
步骤504、在满足触发条件时,所述线程执行任务;
步骤505、在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
步骤506、依据所述分界地址,计算得到所述线程堆栈的使用情况;
步骤507、将所述线程堆栈的使用情况添记录至线程堆栈的使用情况记录;
步骤508、在所述线程堆栈的使用情况超过预设门限时,发出告警信息;其中,所述预设门限低于所述线程堆栈的容量;
步骤509、在所述线程堆栈的使用情况未超过预设门限时,继续等待下次触发条件的到来。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请实施例并不受所描述的动作顺序的限制,因为依据本申请实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本申请实施例所必须的。
参照图6,示出了本申请一种线程堆栈的检测装置实施例的结构框图,具体可以包括如下模块:
初始化模块601,用于在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
查询模块602,用于在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
计算模块603,用于依据所述分界地址,计算得到所述线程堆栈的使用情况;及
告警模块604,用于在所述线程堆栈的使用情况超过预设门限时,发出告警信息;其中,所述预设门限低于所述线程堆栈的容量。
在本申请的一种优选实施例中,所述查询模块602具体可以包括:
第一查询子模块,用于在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址;或者,
第二查询子模块,用于在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址。
在本申请的另一种优选实施例中,所述第一查询子模块,可具体用于按照从高地址到低地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个不为所述预定值的堆栈地址作为所述分界地址。
在本申请的再一种优选实施例中,所述第二查询子模块,可具体用于按照从低地址到高地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个为所述预定值的堆栈地址作为所述分界地址。
参照图7,示出了本申请一种线程堆栈的使用情况的查询装置实施例的结构框图,具体可以包括如下模块:
接口模块701,用于接收查询请求;所述查询请求中携带有线程堆栈;
查询模块702,用于依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况;所述线程堆栈的使用情况记录中记录有系统中线程堆栈的使用情况;
返回模块703,用于将所获取的所述线程堆栈的使用情况作为查询结果返回;及
记录生成模块704,用于生成所述线程堆栈的使用情况记录;
其中,所述记录生成模块704具体可以包括:
初始化子模块,用于在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
查询子模块,用于在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
计算子模块,用于依据所述分界地址,计算得到所述线程堆栈的使用情况;及
记录子模块,用于将所述线程堆栈的使用情况添记录至线程堆栈的使用情况记录。
在本申请的一种优选实施例中,所述线程堆栈的使用情况记录中还可记录有所述线程堆栈的使用情况的记录时间;则所述查询模块702,可具体用于依据线程堆栈的使用情况记录获取所述线程堆栈的、记录时间最新的使用情况
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本申请实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请实施例是参照根据本申请实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中配置的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中配置的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中配置的功能的步骤。
尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本申请所提供的一种线程堆栈的检测方法和装置、及一种任务堆栈使用情况的查询方法和装置,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
Claims (14)
1.一种线程堆栈的检测方法,其特征在于,包括:
在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
依据所述分界地址,计算得到所述线程堆栈的使用情况;
在所述线程堆栈的使用情况超过预设门限时,发出告警信息;其中,所述预设门限低于所述线程堆栈的容量。
2.根据权利要求1所述的方法,其特征在于,所述依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址的步骤,包括:
在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址,或者,在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址。
3.根据权利要求2所述的方法,其特征在于,所述在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址的步骤,包括:
按照从高地址到低地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个不为所述预定值的堆栈地址作为所述分界地址。
4.根据权利要求2所述的方法,其特征在于,所述在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址的步骤,包括:
按照从低地址到高地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个为所述预定值的堆栈地址作为所述分界地址。
5.根据权利要求1或2或3或4所述的方法,其特征在于,所述依据所述分界地址,计算得到所述线程堆栈的使用情况的步骤,包括:
以所述线程堆栈的栈顶地址与所述分界地址的差值确定所述线程堆栈的使用情况;或者,
以所述线程堆栈的栈顶地址与所述分界地址的差值相对于所述线程堆栈的容量的比例,确定所述线程堆栈的使用情况。
6.根据权利要求1或2或3或4所述的方法,其特征在于,还包括:依据所述告警信息,通过堆栈解析得到所述线程堆栈的故障现场信息。
7.一种线程堆栈的使用情况的查询方法,其特征在于,包括:
接收查询请求;所述查询请求中携带有线程堆栈;
依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况;所述线程堆栈的使用情况记录中记录有系统中线程堆栈的使用情况;
将所获取的所述线程堆栈的使用情况作为查询结果返回;
其中,通过如下步骤生成所述线程堆栈的使用情况记录:
在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
依据所述分界地址,计算得到所述线程堆栈的使用情况;
将所述线程堆栈的使用情况添记录至线程堆栈的使用情况记录。
8.根据权利要求7所述的方法,其特征在于,所述线程堆栈的使用情况记录中还记录有所述线程堆栈的使用情况的记录时间;
所述依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况的步骤,包括:依据线程堆栈的使用情况记录获取所述线程堆栈的、记录时间最新的使用情况。
9.一种线程堆栈的检测装置,其特征在于,包括:
初始化模块,用于在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
查询模块,用于在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
计算模块,用于依据所述分界地址,计算得到所述线程堆栈的使用情况;及
告警模块,用于在所述线程堆栈的使用情况超过预设门限时,发出告警信息;其中,所述预设门限低于所述线程堆栈的容量。
10.根据权利要求9所述的装置,其特征在于,所述查询模块包括:
第一查询子模块,用于在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址;或者,
第二查询子模块,用于在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址。
11.根据权利要求10所述的装置,其特征在于,所述第一查询子模块,具体用于按照从高地址到低地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个不为所述预定值的堆栈地址作为所述分界地址。
12.根据权利要求10所述的装置,其特征在于,所述第二查询子模块,具体用于按照从低地址到高地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个为所述预定值的堆栈地址作为所述分界地址。
13.一种线程堆栈的使用情况的查询装置,其特征在于,包括:
接口模块,用于接收查询请求;所述查询请求中携带有线程堆栈;
查询模块,用于依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况;所述线程堆栈的使用情况记录中记录有系统中线程堆栈的使用情况;
返回模块,用于将所获取的所述线程堆栈的使用情况作为查询结果返回;及
记录生成模块,用于生成所述线程堆栈的使用情况记录;
其中,所述记录生成模块包括:
初始化子模块,用于在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;
查询子模块,用于在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;
计算子模块,用于依据所述分界地址,计算得到所述线程堆栈的使用情况;及
记录子模块,用于将所述线程堆栈的使用情况添记录至线程堆栈的使用情况记录。
14.根据权利要求13所述的装置,其特征在于,所述线程堆栈的使用情况记录中还记录有所述线程堆栈的使用情况的记录时间;
所述查询模块,具体用于依据线程堆栈的使用情况记录获取所述线程堆栈的、记录时间最新的使用情况。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410815476.0A CN104572448A (zh) | 2014-12-23 | 2014-12-23 | 一种线程堆栈的使用情况的实现方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410815476.0A CN104572448A (zh) | 2014-12-23 | 2014-12-23 | 一种线程堆栈的使用情况的实现方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104572448A true CN104572448A (zh) | 2015-04-29 |
Family
ID=53088580
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410815476.0A Pending CN104572448A (zh) | 2014-12-23 | 2014-12-23 | 一种线程堆栈的使用情况的实现方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104572448A (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105808424A (zh) * | 2016-02-04 | 2016-07-27 | 北京空间飞行器总体设计部 | 一种适用于多任务软件进程堆栈使用深度检测的方法 |
CN106648549A (zh) * | 2017-01-03 | 2017-05-10 | 北京华胜信泰数据技术有限公司 | 线程栈的处理方法及系统 |
CN107491373A (zh) * | 2017-08-09 | 2017-12-19 | 杭州迪普科技股份有限公司 | 一种任务栈溢出监测方法及系统 |
CN109214169A (zh) * | 2017-06-30 | 2019-01-15 | 芜湖美的厨卫电器制造有限公司 | 堆栈溢出检测方法、装置及家用电器 |
CN109426501A (zh) * | 2017-06-27 | 2019-03-05 | 比亚迪股份有限公司 | 堆栈自检方法和装置 |
CN110362991A (zh) * | 2019-07-19 | 2019-10-22 | 上海睿赛德电子科技有限公司 | 一种实时操作系统的线程栈空间保护的方法 |
CN110727480A (zh) * | 2019-09-05 | 2020-01-24 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN111367774A (zh) * | 2018-12-26 | 2020-07-03 | 阿里巴巴集团控股有限公司 | 检测方法及装置 |
CN111367588A (zh) * | 2018-12-25 | 2020-07-03 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101271408A (zh) * | 2008-05-07 | 2008-09-24 | 浙江大学 | 在嵌入式系统中分析堆栈使用的方法 |
CN102293029A (zh) * | 2011-04-26 | 2011-12-21 | 华为技术有限公司 | 一种用户面缓冲器内存的恢复方法及装置 |
US20120017214A1 (en) * | 2010-07-16 | 2012-01-19 | Qualcomm Incorporated | System and method to allocate portions of a shared stack |
-
2014
- 2014-12-23 CN CN201410815476.0A patent/CN104572448A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101271408A (zh) * | 2008-05-07 | 2008-09-24 | 浙江大学 | 在嵌入式系统中分析堆栈使用的方法 |
US20120017214A1 (en) * | 2010-07-16 | 2012-01-19 | Qualcomm Incorporated | System and method to allocate portions of a shared stack |
CN103003791A (zh) * | 2010-07-16 | 2013-03-27 | 高通股份有限公司 | 分配共享堆栈的部分的系统和方法 |
CN102293029A (zh) * | 2011-04-26 | 2011-12-21 | 华为技术有限公司 | 一种用户面缓冲器内存的恢复方法及装置 |
Non-Patent Citations (1)
Title |
---|
张勇: "《ARMCortex-M0+嵌入式开发与实践 基于LPC800》", 30 September 2014 * |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105808424B (zh) * | 2016-02-04 | 2018-08-07 | 北京空间飞行器总体设计部 | 一种适用于多任务软件进程堆栈使用深度检测的方法 |
CN105808424A (zh) * | 2016-02-04 | 2016-07-27 | 北京空间飞行器总体设计部 | 一种适用于多任务软件进程堆栈使用深度检测的方法 |
CN106648549B (zh) * | 2017-01-03 | 2019-03-19 | 北京华胜信泰数据技术有限公司 | 线程栈的处理方法及系统 |
CN106648549A (zh) * | 2017-01-03 | 2017-05-10 | 北京华胜信泰数据技术有限公司 | 线程栈的处理方法及系统 |
CN109426501A (zh) * | 2017-06-27 | 2019-03-05 | 比亚迪股份有限公司 | 堆栈自检方法和装置 |
CN109214169A (zh) * | 2017-06-30 | 2019-01-15 | 芜湖美的厨卫电器制造有限公司 | 堆栈溢出检测方法、装置及家用电器 |
CN109214169B (zh) * | 2017-06-30 | 2023-12-08 | 芜湖美的厨卫电器制造有限公司 | 堆栈溢出检测方法、装置及家用电器 |
CN107491373A (zh) * | 2017-08-09 | 2017-12-19 | 杭州迪普科技股份有限公司 | 一种任务栈溢出监测方法及系统 |
CN111367588A (zh) * | 2018-12-25 | 2020-07-03 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
CN111367588B (zh) * | 2018-12-25 | 2023-05-16 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
CN111367774A (zh) * | 2018-12-26 | 2020-07-03 | 阿里巴巴集团控股有限公司 | 检测方法及装置 |
CN110362991A (zh) * | 2019-07-19 | 2019-10-22 | 上海睿赛德电子科技有限公司 | 一种实时操作系统的线程栈空间保护的方法 |
CN110727480A (zh) * | 2019-09-05 | 2020-01-24 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN110727480B (zh) * | 2019-09-05 | 2023-04-07 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104572448A (zh) | 一种线程堆栈的使用情况的实现方法和装置 | |
CN108984388B (zh) | 一种生成自动化测试用例的方法及终端设备 | |
CN107277029B (zh) | 一种远程过程调用的方法、装置及计算机设备 | |
US9146705B2 (en) | Split brain protection in computer clusters | |
CN108170832B (zh) | 一种面向工业大数据的异构数据库的监控系统及监控方法 | |
CN111385370B (zh) | Id分配方法、装置、存储介质及id分配系统 | |
US20080005537A1 (en) | Quantifying core reliability in a multi-core system | |
CN116090808A (zh) | 一种rpa断点重建方法、装置、电子设备和介质 | |
CN109408309A (zh) | 多终端的测试方法及装置 | |
CN111061802B (zh) | 一种电力数据管理处理方法、装置及存储介质 | |
CN110019444B (zh) | 一种操作请求处理方法、装置、设备及系统 | |
CN105302489A (zh) | 一种异构多核远程嵌入式存储器系统与方法 | |
CN104765792A (zh) | 一种维度数据存储的方法、装置及系统 | |
CN112559525B (zh) | 数据检查系统、方法、装置和服务器 | |
CN110543401B (zh) | 一种分级应用拓扑生成方法、系统及集群 | |
CN115374109B (zh) | 数据访问方法、装置、计算设备和系统 | |
CN109976881B (zh) | 事务识别方法和装置、存储介质以及电子装置 | |
CN116166737A (zh) | 资源拓扑图的生成方法、装置、电子设备及可读存储介质 | |
CN112181825A (zh) | 测试案例库构建方法、装置、电子设备及介质 | |
CN107679093B (zh) | 一种数据查询方法及装置 | |
CN106326094A (zh) | 检查指针异常的方法及系统 | |
CN108733678B (zh) | 一种数据搜索的方法、装置和相关设备 | |
CN112416995A (zh) | 一种数据统计方法、装置、计算机设备及存储介质 | |
CN107888696A (zh) | 一种存储实验室设备信息获取方法、系统及相关装置 | |
KR101411266B1 (ko) | 계층 구조를 이용한 이벤트 처리 방법 및 그를 이용한 이벤트 처리 엔진 및 그 시스템 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20150429 |