一种任务栈溢出监测方法及系统技术方案

技术编号:16837220 阅读:48 留言:0更新日期:2017-12-19 19:48
本申请提供一种任务栈溢出监测方法,所述方法包括:检测任务中函数栈操作状态;若所述函数栈操作状态为预设的函数栈操作,则读取任务栈栈底地址;将当前栈顶地址与所述任务栈栈底地址减去任务栈总长度得到的差值进行比较;根据比较结果监测任务栈溢出。与现有技术方案相比,本方案不用占用额外的内存空间用于设置只读内存区,实时监测任务栈溢出现象,不会漏报任务栈溢出现象。

A monitoring method and system for task stack overflow

This application provides a task stack overflow monitoring method, the method includes: the function stack operation state detection task; if the function stack operating state as a function of the default stack operation, read the task stack address will end; the top of the stack address and the difference between the total length of task stack base address minus task the stack is compared; according to the comparison of monitoring results of task stack overflow. Compared with the existing technology solutions, this scheme does not occupy additional memory space to set up read-only memory area, real-time monitoring task stack overflow phenomenon, and will not omit the phenomenon of task stack overflow.

【技术实现步骤摘要】
一种任务栈溢出监测方法及系统
本申请涉及计算机领域,特别是涉及一种任务栈溢出监测方法及系统。
技术介绍
在操作系统中,如Linux操作系统,为了提高操作系统运行效率,所有任务会共享同一物理地址空间,只有任务栈占用的内存空间是独立的,任何任务之间没有内存地址保护机制。一个任务栈的总长度是有限的,如果太长会导致内存空间浪费,如果太短可能导致任务栈溢出(任务栈溢出也称栈顶越界)。任务栈溢出意味着,在任务执行过程中将读写用于其它功能的内存内容。其它功能的内存内容有可能是本任务使用的内存内容,也有可能是其它任务使用的内存内容,从而导致发生各种异常现象,如任务崩溃、死机等。现有的技术方案是确定一块位于任务栈末端的内存空间,将该内存空间设置为只读属性;该内存空间只能进行读操作,当任务执行过程中对该内存空间进行写操作时,会触发操作系统的地址访问异常中断;当监听到地址访问异常中断时,判断产生地址访问异常中断的任务是否任务栈溢出。现有的技术方案缺点是:每个函数占用的内存空间中,并不是每个字节都会进行读写操作,有相当一部分内存内容是预留的,不会发生读写操作;即使是用于存储局部变量的空间,由于函数参数或者外部条件不一样,也不一定会进行写操作。如果任务栈末端的只读内存区恰好属于预留内存区,或者在一定条件下函数没有对只读内存区进行写操作,即使函数发生了任务栈溢出,也不会触发地址访问异常中断,此时任务栈末端内存区及只读内存区以外的内存区域已经被写入了错误数据。当有其它任务再次访问已经被写成错误数据的内存时,才会出现功能异常,并不能实时监测任务栈溢出现象,会漏报任务栈溢出现象。专利技术内容有鉴于此,本申请提供一种任务栈溢出监测方法及系统。具体地,本申请是通过如下技术方案实现的:一种任务栈溢出监测方法,所述方法包括:检测任务中函数栈操作状态;若所述函数栈操作状态为预设的函数栈操作,则读取任务栈栈底地址;将当前栈顶地址与所述任务栈栈底地址减去任务栈总长度得到的差值进行比较;根据比较结果监测任务栈溢出。一种任务栈溢出监测系统,所述系统包括:检测函数栈操作单元,用于检测任务中函数栈操作状态;读取栈底地址单元,用于若所述函数栈操作状态为预设的函数栈操作,则读取任务栈栈底地址;比较单元,用于将当前栈顶地址与所述任务栈栈底地址减去任务栈总长度得到的差值进行比较;监测任务栈溢出单元,用于根据比较结果监测任务栈溢出。以上技术方案,将栈底地址减去任务栈总长度得到的差值与栈顶地址进行比较,根据比较结果能够实时监测任务栈溢出现象并报错,防止对其它任务甚至操作系统造成破坏,同时能够确保研发人员直接定位到造成任务栈溢出的代码位置和调用序列,方便研发人员快速查找问题。而且与现有技术方案相比,本方案不用占用额外的内存空间用于设置只读内存区,实时监测任务栈溢出现象,不会漏报任务栈溢出现象。附图说明为了更清楚地说明本专利技术实施例的技术方案,下面将对实施例描述中所需要的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本专利技术中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。图1是本申请一示例性实施例示出的任务栈溢出监测方法的一种实施流程图;图2是本申请一示例性实施例示出的任务栈溢出监测方法的一段内存空间区域;图3是本申请一示例性实施例示出的任务栈溢出监测方法的一种优选实施流程图;图4是本申请一示例性实施例示出的任务栈溢出监测系统的一种结构示意图;图5是本申请一示例性实施例示出的任务栈溢出监测系统的一种优选结构示意图。具体实施方式首先对本专利技术实施例所提供的一种任务栈溢出监测方法进行说明,该方法可以包括以下步骤:检测任务中函数栈操作状态;若所述函数栈操作状态为预设的函数栈操作,则读取任务栈栈底地址;将当前栈顶地址与所述任务栈栈底地址减去任务栈总长度得到的差值进行比较;根据比较结果监测任务栈溢出。其中,任务中函数栈操作状态为函数在执行过程中进行压栈操作或进行退栈操作。这里对函数的压栈操作和退栈操作进行说明:每个函数调用时在任务栈空间中分配的一段内存区成为函数的栈帧,在任务执行过程中,进入一个函数时栈顶指针地址减去本函数栈帧大小,该操作称为压栈操作;退出函数时栈顶指针地址加上本函数栈帧大小,该操作称为退栈操作。进入函数和退出函数时,栈顶指针地址加减相同的值,确保调用一个函数前后栈顶指针地址保持原值不变。在任务执行过程中,当前函数栈操作状态为压栈操作时,且在执行压栈操作指令之后,从任务基本信息数据结构中读取任务栈栈底地址和任务栈总长度,从栈顶寄存器中读取当前栈顶地址,将该任务栈栈底地址减去任务栈总长度得到的差值与当前栈顶寄存器中的栈顶地址进行比较。如果该任务栈栈底地址减去任务栈总长度的差值大于当前栈顶寄存器中的栈顶地址,则发生了任务栈溢出,否则就没有发生栈溢出。发生任务栈溢出时,立即记录现象异常信息并抛出异常,终止任务运行;没有发生任务栈溢出时,将继续执行原任务流程。为了使本领域技术人员更好的理解本专利技术中的技术方案,这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。基于本专利技术中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于本专利技术保护的范围。图1所示,为本专利技术一种任务栈溢出监测方法的实施流程图,其具体包括以下基本步骤:S101,检测任务中函数栈操作状态;根据本专利技术实施例的技术方案,首先需要确定的是任务执行过程中当前函数栈操作状态,即当前函数是否有压栈操作。如果函数没有压栈操作,则没有必要执行本方案的操作步骤。对于函数的压栈操作、退栈操作前面已经做了详细描述,这里不再一一解释。假设在操作系统中有以下任务,主函数main函数,main函数调用func_A,函数func_A调用func_B函数。首先在该任务执行过程中,当执行main函数时,检测main函数是否有压栈操作;当执行main函数调用func_A时,检测func_A函数是否有压栈操作;当执行函数func_A调用func_B函数时,检测func_B函数是否有压栈操作。S102,若所述函数栈操作状态为预设的函数栈操作,则读取任务栈栈底地址;当前函数栈操作状态可能是进行压栈操作,也可能是进行退栈操作。当函数栈操作状态为压栈操作时,继续执行后续步骤,否则不再执行后续步骤;并且当函数执行压栈操作指令之后读取任务栈栈底地址。这里的任务栈栈底地址存放于任务基本信息的数据结构中。任务基本信息的数据结构中存放了任务名称、任务ID(Identity,身份)、任务运行状态、当前所运行的CPU(CentralProcessingUnit,中央处理器)ID、任务栈总长度、任务栈栈底地址等。当操作系统创建一个任务时,会在内存中为该任务分配一块内存存放其任务基本信息数据结构,并初始化各项信息,包括任务栈总长度和任务栈栈底地址。在该任务的生命周期内,栈底地址一经初始化就不会再变化,任务栈总长度一经初始化可以保持不变,也可以动态调整。如图2所示,这里以10000H本文档来自技高网...
一种任务栈溢出监测方法及系统

【技术保护点】
一种任务栈溢出监测方法,其特征在于,所述方法包括:检测任务中函数栈操作状态;若所述函数栈操作状态为预设的函数栈操作,则读取任务栈栈底地址;将当前栈顶地址与所述任务栈栈底地址减去任务栈总长度得到的差值进行比较;根据比较结果监测任务栈溢出。

【技术特征摘要】
1.一种任务栈溢出监测方法,其特征在于,所述方法包括:检测任务中函数栈操作状态;若所述函数栈操作状态为预设的函数栈操作,则读取任务栈栈底地址;将当前栈顶地址与所述任务栈栈底地址减去任务栈总长度得到的差值进行比较;根据比较结果监测任务栈溢出。2.根据权利要求1所述的方法,其特征在于,所述若所述函数栈操作状态为预设的函数栈操作,则读取任务栈栈底地址,包括:当前函数栈操作状态为压栈操作时,读取任务栈栈底地址。3.根据权利要求2所述的方法,其特征在于,所述当前函数栈操作状态为压栈操作时,读取任务栈栈底地址,包括:当前函数栈操作状态为压栈操作时,并且在函数执行压栈操作指令之后读取任务栈栈底地址。4.根据权利要求1所述的方法,其特征在于,所述根据比较结果监测任务栈溢出,包括:若所述任务栈栈底地址减去任务栈总长度得到的差值大于当前栈顶地址,则发生任务栈溢出。5.根据权利要求4所述的方法,其特征在于,还包括:发生任务栈溢出时,记录现象异常信息并抛出异常,终止任务运行。6.一种任务栈溢出监测系统,其特...

【专利技术属性】
技术研发人员:符志清李艳华
申请(专利权)人:杭州迪普科技股份有限公司
类型:发明
国别省市:浙江,33

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1