专利名称:一种记录导致系统异常的函数的方法
技术领域:
本发明涉及数据通信技术领域,尤其涉及一种记录导致系统异常的函数 的方法。
背景技术:
在数据通信领域中,产品在应用时会由于某种原因导致系统异常,例如 导致系统复位或者死机。由于系统已经重新启动或死机,所以在重新启动后
已经不能使用通常的定位手段来查看诸如内存变量、任务状态、或者CPU
占用率等来定位原因,这就造成事后很难确切找到系统的故障原因,也就不 容易定位产品的问题,从而提高产品稳定性。
数据通信产品一般都是实时的嵌入式系统,都是基于任务或者进程来调 度的,换句话说,任务或者进程是集合各种系统资源实现特定功能的最小运 行单元。在系统复位或者死机时,若能捕获最后一个运行的任务以及它的运 行时间,那么,就能为事后定位复位或死机的原因提供信息,缩小查找范围。
但是,有时仅捕捉到导致系统死机或复位的任务还是很难找到根本原 因。为了更进一步缩小查找范围,若可以记录导致系统死机或复位的函数, 那么就能把导致故障的原因定位到函数一级,更加有利于查找到导致死机或 复位故障的根本原因。由于函数的调用在一个实时性系统里非常的频繁,如 果所釆取的监控手段过于占用系统资源,就必然会导致系统性能下降,进而 也会影响系统主要功能的运行。
发明内容
本发明所要解决的技术问题在于,提供一种记录导致系统异常的函数的 方法,实现记录导致系统死机或复位等异常的函数,以及记录调用所述函数
的任务的目的,用于根据记录信息缩小故障查找范围,以便定位系统问题提 高系统稳定性。
本发明提供一种记录导致系统死机或复位的函数的方法,包括如下步
骤
在内存记录区为每一任务分配一个用于记录函数地址的函数指针数组 元素,并定义一个跟踪当前运行任务的全局函数指针,在系统要运行的文件 中加入函数调用钩子函数;
任务切换时,在任务切换钩子函数里将所述全局函数指针赋值为新切入 的任务对应的函数指针数组元素的地址;
在函数调用钩子函数处把当前任务当前调用的函数地址记录到所述全 局函数指针里。
所述方法进一步包括
在系统重新启动后,将所述内存记录区中保存的任务、函数信息复制保 存到别处供分析使用。
所述方法进一步包括
在复制保存后,将所述内存记录区清零用于捕获本次系统运行的信息。 所述方法进一步包括
在分析过捕获的上次系统复位或死机的信息后,将所述信息用文件形式 保存在掉电不丢失的介质上。
所述内存记录区是系统为用户保留而系统并不控制的内存区。
应用本发明,可以利用数据通信产品软硬件的某些特性来捕获到导致系 统复位或者死机的函数及运行该函数的任务,从而为事后定位系统故障提供 有效的记录信息,缩小了故障查找范围,以便于定位系统问题,提高产品在 市场中的稳定性。
图1是本发明实施例中记录导致系统死机或复位的函数的流程图; 图2是本发明实施例中全局的记录函数指针随任务切换赋值的变化示 意图。
具体实施例方式
为使本发明的目的、技术方案和优点更加清楚,以下结合附图对本发明 作进一步地详细ijL明。
为实现本发明的目的,需要利用数据通信产品软硬件的某些特性来捕获 到导致系统复位或者死机的函数及运行该函数的任务。在数据通信产品中, 通常具有如下的软硬件特性
(1) 凄t据通信产品的内存在非断电复位或死机时,内存具有非断电内 容不丢失的特性。
产品设备所使用的内存在设备非断电复位并再次启动后,内存中所记录 的信息是不会丢失的,还是保持复位前保留的原值,这就为捕获一些定位死 机或复位的故障信息,提供了一个高速的々某质,而且内存不会因为加入监控 信息而影响系统的正常运行。
(2) 嵌入式系统具有可为用户保留部分内存的特性。
数据通信产品中使用的操作系统,通常为嵌入式系统, 一般会为用户保 留一部分内存给用户自己使用,操作系统不会控制这块内存。那么,在设备 非断电复位或死机并再次启动后,在复位或者死机前捕获的任务和其运行时 间就不会被操作系统清理掉,为用户根据这些关于任务相关信息确定导致上 次复位或死机的任务及其启动时间提供了支撑。
(3 )嵌入式系统一般会为用户提供一些钩子函数接口来监控嵌入式系 统内部运行的 一些关键事件。
虽然用户不能通过直接更改嵌入式系统的源码来加入调试手段,但可以 通过嵌入式系统所提供的钩子函数加入用户4全测所需的定位代码,从而通过 钩子函数及加入其中的用户定位代码来捕获一些系统运行的信息。
在本发明的实施例中,对于任务或进程的相关信息,可以利用现有的"任 务切换钩子函数接口 "来捕获非断电复位或者死机前运行的任务及其运行时
间。只要在任务切换钩子函数里记录要切换到的那个任务就可以了,每次切 换总是把以前记录的覆盖掉,这样记录到的永远只是最后一个运行的任务。
为了能够利用钩子函数查找并获取导致死机或复位的原因,本发明不但 要记录当前运行的任务及相关信息,还要记录该任务最后运行或调用的函数 及相关信息。
本发明提供一种记录导致系统异常的函数的方法,其主要实现思路为
利用系统的任务切换钩子函数接口 ,并在系统中通过工具加入函数调用 钩子函数,在任务切换钩子函数里更新记录当前正在运行的函数的全局函数 指针为当前任务对应的记录区,每次切换总是将记录当前正在运行的函数的 全局函数指针更新为记录本任务的函数,这样在函数调用钩子函数里只要把 函数指针记录到这个记录当前正在运行的函数的全局函数指针里就可以了 , 这样不会因为加入函数钩子导致系统性能大幅下降,提高了监控的高效性。
如图l所示,给出了本发明的技术方案的一个具体实施例,分为如下步
骤
步骤101'.在系统中加入函数调用和返回钩子处理函数。加入时,使用 工具把系统要运行的文件中加入函数调用钩子函数,在函数调用钩子函数里 把本函数的地址记录到事先定义的一个全局的函数指针里。本发明中,系统 只会提供任务切换钩子加入的函数,必须执行才能加入切换钩子函数,加入 函数调用钩子函数可以根据可执行文件特点替换一些指令即可。
步骤102:操作系统启动时保留一块内存区A用于记录信息。操作系统 在初始化时保留 一块内存区域留给系统记录最后一个任务及其运行时间的 信息,操作系统不会控制这部分内容。
步骤103:系统启动后,把内存A保存的信息复制到内存B供以后分析, 内存A清零。系统启动后将复位前系统捕获信息从内存A中复制一份到别 处以供分析使用,然后,先将记录区A清零用来捕获本次系统运行的信息。
步骤104:在记录区A为每个任务分配一个记录函数指针地址,再分配 一个全局地址。在记录区A上构造一个函数指针数组用来记录函数地址, 然后把这个数组的每个元素和一个任务——对应,同时定义一个全局的函数
指针用来跟踪当前运行的任务。
步骤105:在任务切换钩子里刷新全局记录地址为本任务用于记录当前 函数的记录地址。
具体地,在任务切换钩子函数里把定义的用来跟踪当前任务的那个全局 函数指针赋值为新切入的任务对应的指针数组元素的地址,这样就能保证永 远跟踪当前运行的任务。
步骤106:在函数调用钩子里把当前任务当前调用或使用的函数地址记 录到全局记录函数指针里,这样就能确保能监控到本任务当前调用的函数。
步骤107:分析内存B中保存的捕获的上次系统复位或死机的信息,得 出复位或死机前最后运行的任务和函数并形成文件,保存在掉电不丢失的介 质(例如flash)上。
如图2所示,给出了本实施例中全局的记录函数指针随任务切换赋值的 变化情况。
本发明的应用范围并不限于定位系统复位或死机的故障,也可以参照上 述实施方式来监控系统的其它异常,所监控到的故障信息都是任务和/或函 数级的。
本文所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本 领域的技术人员来说,本发明可以有各种更改和变化。因此,凡在本发明的 精神和原则之内所作的任何修改、等同替换、改进以及更新等等,均应包含 在本发明的保护范围之内。
权利要求
1、一种记录导致系统死机或复位的函数的方法,其特征在于,包括如下步骤在内存记录区为每一任务分配一个用于记录函数地址的函数指针数组元素,并定义一个跟踪当前运行任务的全局函数指针,在系统要运行的文件中加入函数调用钩子函数;任务切换时,在任务切换钩子函数里将所述全局函数指针赋值为新切入的任务对应的函数指针数组元素的地址;在函数调用钩子函数处把当前任务当前调用的函数地址记录到所述全局函数指针里。
2、 如权利要求l所述的方法,其特征在于,所述方法进一步包括在系统重新启动后,将所述内存记录区中保存的任务、函数信息复制保 存到别处供分析使用。
3、 如权利要求2所述的方法,其特征在于,所述方法进一步包括 在复制保存后,将所述内存记录区清零用于捕获本次系统运行的信息。
4、 如权利要求2所述的方法,其特征在于,所述方法进一步包括在分析过捕获的上次系统复位或死机的信息后,将所述信息用文件形式 保存在掉电不丟失的介质上。
5、 如权利要求l所述的方法,其特征在于所述内存记录区是系统为用户保留而系统并不控制的内存区。
全文摘要
本发明公开了一种记录导致系统死机或复位的函数的方法,首先,在内存记录区为每一任务分配一个用于记录函数地址的函数指针数组元素,并定义一个跟踪当前运行任务的全局函数指针,在系统要运行的文件中加入函数调用钩子函数;任务切换时,在任务切换钩子函数里将所述全局函数指针赋值为新切入的任务对应的函数指针数组元素的地址;在函数调用钩子函数处把当前任务当前调用的函数地址记录到所述全局函数指针里。应用本发明可以捕获到导致系统复位或者死机的函数,并捕获到运行该函数的任务,从而为事后定位系统故障提供有效的记录信息,缩小了故障查找范围,以便于定位系统问题。
文档编号G06F11/14GK101169753SQ200710187550
公开日2008年4月30日 申请日期2007年11月26日 优先权日2007年11月26日
发明者石江涛 申请人:中兴通讯股份有限公司