首页> 中国专利> 一种实现嵌入式实时系统内存泄漏检测和定位的方法

一种实现嵌入式实时系统内存泄漏检测和定位的方法

摘要

本发明属于对计算机性能的改进,具体涉及一种实现嵌入式实时系统内存泄漏检测和定位的方法。通过环形队列注册内存申请、定时扫描以及用户自定义内存扫描时间,使得内存泄露检测所耗系统资源非常少并且不会出现瞬间的高峰。采用用户自定义内存生存期,就可以减少内存泄漏检查的误报,并且由于只对超出了最长生存期的内存进行报告,这样在实际运行中报告的信息量非常少,大大减少了定位和判断内存泄漏的时间,从而节省了大量人力,提高了调试和测试系统的效率。本发明不但可用于调试和测试阶段,而且在产品阶段也可以应用,由于该方法系统消耗资源非常少,用户又可以根据情况来决定是否启动,因此提高了实时操作系统的稳定性和可靠性。

著录项

  • 公开/公告号CN1538300A

    专利类型发明专利

  • 公开/公告日2004-10-20

    原文格式PDF

  • 申请/专利权人 中兴通讯股份有限公司;

    申请/专利号CN200410006956.9

  • 申请日2004-03-01

  • 分类号G06F11/34;G06F9/46;

  • 代理机构11127 北京三友知识产权代理有限公司;

  • 代理人王一斌

  • 地址 518057 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦

  • 入库时间 2023-12-17 15:34:51

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-03-01

    未缴年费专利权终止 IPC(主分类):G06F11/34 授权公告日:20070718 终止日期:20180301 申请日:20040301

    专利权的终止

  • 2017-09-05

    专利权的转移 IPC(主分类):G06F11/34 登记生效日:20170817 变更前: 变更后: 申请日:20040301

    专利申请权、专利权的转移

  • 2007-07-18

    授权

    授权

  • 2004-12-29

    实质审查的生效

    实质审查的生效

  • 2004-10-20

    公开

    公开

说明书

技术领域

本发明属于对计算机性能的改进,具体涉及一种实现计算机操作系统内存泄漏检测和定位的方法,尤其涉及一种实现嵌入式实时系统内存泄漏检测和定位的方法。

背景技术

内存泄漏是计算机系统中比较常见的缺陷,在许多比较复杂的计算机系统中,由于内存泄漏造成系统运行越来越慢,直到最后由于内存资源耗尽而崩溃。但是非常难以检测并准确定位具体哪段代码申请了内存,而没有释放从而引起了内存泄漏。

内存泄漏检测和定位是嵌入式实时操作系统(称为RTOS)及应用程序的代码调试、测试以及维护时的一项重要内容,内存检测和定位方法的优劣,直接关系到RTOS的安全性、稳定性和可靠性,以及建立在RTOS上的产品能否快速推出和稳定。

现有RTOS在内存泄露检测方面缺乏行之有效的办法。通常的做法有下面几个方法:

在调试和测试阶段通常使用自动测试工具通过对内存的打桩,内存的使用被登记到自动测试工具的数据库里,然后根据人的经验判断,判断是否有内存泄漏,再对所有已经申请了的内存进行人工检查,对内存泄漏进行定位。但是这对大量的地方有内存申请和释放时将是一个非常痛苦的检查过程。

另外一些能够想到的方法是在内存申请后把内存的相关信息记录到一个文件里,内存释放后,再把该内存的相关信息删除。程序可以定期或不定期对文件进行检查确实是否有内存泄漏以及发生在什么地方。但是这将严重影响整个系统的性能,并且当进行检查时会有一个对已经申请内存遍历的过程,这将使系统的CPU占有率有个瞬间的高峰,存在着不确定性,对于嵌入式实时系统的稳定性构成很大的影响。

综上所述,现有技术的缺点有两个:一是对系统性能影响很大,不易及时发现内存泄漏;二是发现内存泄漏后,不易准确的找到内存泄漏的原因。

发明内容

本发明的目的在于克服上述现有技术的不足之处,提出一种实现嵌入式实时操作系统的内存泄漏检测和定位的方法,所述方法具有适用范围广、可靠性高、实时性强的特点。

本发明是这样实现的:

一种实现嵌入式实时系统内存泄漏检测和定位的方法,至少包括如下步骤:

第一步:建立一个由队列项所构成的循环队列,所述循环队列有一个游标,游标所指向的队列项为当前时间,游标每隔指定时间,往下走一格;

第二步:在申请内存时,同时申请内存泄漏管理块,用于填写相关信息,并且在所述申请的内存头中附加一个指针,用于指向内存泄漏管理块;

第三步:根据用户在申请内存时规定的内存最长生存期,计算出该申请内存在循环队列中的位置,并在该位置进行注册,即在该位置挂上内存泄漏管理块,由所有在该位置的内存泄漏管理块组成双向链表。

所述内存最长生存期超过循环队列总长度,用该生存期整除总长度,从而得到循环的圈数。

所述循环队列每隔指定时间,游标往下走一格,如果游标指向循环队列的队列项不为NULL,则遍历该队列项所指向的内存泄漏管理块双向链表;

如果循环圈数为0,该内存泄漏管理块所指向的内存发生了内存泄漏;

当内存使用率大于80%时就向用户报警,并给出内存的信息,如内存申请的调用函数在源代码的文件和位置行数。

所述循环队列游标的间隔指定时间为1秒。

所述循环队列的总长度为30分钟。

所述内存泄漏管理块用C语言定义如下:

typedef  struct T_LeakCheckHead

{

char *filename;

int   line;

int   loop;

unsigned char HeadPoiter;

struct T_LeakCheckHead *prev;

struct T_LeakCheckHead *next;

}CLEAKCHECK。

所述循环队列的队列项定义如下:

typedef  struct T_queueNode

{

struct T_LeakCheckHead *leakchkhead;

}CQUEUE;

采用本发明所述方法,与现有技术相比,由于采取了环形队列注册内存申请、定时扫描技术以及用户自定义内存扫描时间的措施,使得内存泄露检测所耗资源非常少,并且不会出现瞬间的高峰,极大的提高了系统的安全性、稳定性和可靠性,并提高了内存泄露检测和定位的准确性,及时性。

附图说明

图1是内存泄漏循环队列结构示意图;

图2是申请内存与内存泄漏管理块结构关系示意图;

图3是内存泄漏管理块注册的双向链表示意图。

具体实施方式

本发明所述的方法如下:

第一步:建立一个循环队列,该循环队列有一个游标,游标所指向的就是当前时间,游标每过1秒(用户可根据实际情况规定为其他间隔时间)往下走一格,结构如图1所示。

第二步:在申请内存时,同时申请内存泄漏管理块,填写相关信息。并且在内存头中附加一个指针用于指向内存泄漏管理块,结构如图2所示。

第三步:根据用户在申请内存时规定的内存最长生存期计算出其在队列中的位置,并在该位置进行注册,即挂上内存泄漏管理块在此处。所有在此处的内存泄漏管理块组成双向链表,结构如图3所示。

第四步:如果内存最长生存期超过循环队列总长度就需要用该生存期整除总长度,从而得到循环的圈数。

第五步:循环队列每隔指定时间就前进一步,如果这时游标指向的队列项不为NULL,则遍历该项指向内存泄漏管理块双链表。如果循环圈数为0,则说明该内存泄漏管理块所指向的内存发生了内存泄漏,当内存使用率大于80%时就向用户报警,并给出内存的信息,如内存申请的调用函数在源代码的文件和位置行数。

以下结合附图详述本发明的实施例。

该内存泄漏检测和定位方法包括以下步骤:

第一步:

用C语言定义内存泄漏管理块如下(参见图2):

typedef  struct T_LeakCheckHead

{

char *filename;

int   line;

int   loop;

unsigned char HeadPoiter;

struct T_LeakCheckHead *prev;

struct T_LeakCheckHead *next;

}CLEAKCHECK;

定义队列项为(参见图1):

typedef  struct T_queueNode

{

struct T_LeakCheckHead *leakchkhead;

}CQUEUE;

在初始化内存泄漏检查功能时,根据用户指定的大小N,创建数组CQUEUE queue[N],并创建一个实时任务,该任务可以根据用户指定的时间对该数组下标n加1,例如每秒加1。如果数组下标n加1超过了N,就使得下标变为n=0,从而使得数组成为一个循环队列。

第二步:

申请内存,并从该内存开始部分划出内存泄漏管理头,在申请内存时用户可指定该内存的最大生存期,如果是-1则认为该内存永不释放,有无限长的生存期。具体操作用C语言和伪代码混合描述如下(参见图3):

char *GetMem(int Size,int TimeToLive)

{

char *buffer,CLEAKCHECK *check,int cur;

if(TimeToLive==-1)return malloc(Size);

buffer=malloc(Size+sizeof(CLEAKCHECK));

check=buffer;

check->loop=TimeToLive/N;

cur=(TimeToLive%N+n)%N;

把内存泄漏管理头check填上调试和检测信息,并挂到queue[cur]->leakchkhead指向的双向链表尾上;

return(char*)(check+1);

}

第三步:

释放内存的操作非常简单,用C语言描述如下:

FreeMem(char *buffer)

{

CLEAKCHECK *check;

check=buffer;

check--;

/*从双向链表中解除该节点*/

(check->prev)->next=check->next;

(check->next)->prev=check->prev;

free((char *)check);

}

第四步:

由于定义了最长生存期,对于绝大多数的内存都在这个生成期前就被释放了,因此超过这个生产期长度的我们认为发生了内存泄漏。一般规定队列的最大长度为30分钟,大多数内存的生存期都小于该长度,即check->loop==0的项。由此可以得到循环队列游标到达某个队列项(如queue[i])时,队列项上挂着的内存泄漏管理块应该是发生了内存泄漏的管理块和check->loop大于0的块,这些都将非常非常的少,大多数情况下将只有0个或几个。对挂在queue[i]项的所有内存泄漏管理块进行遍历,对于check->loop==0的进行报警,从而发现了内存泄漏。

第五步:

如果用户不需要该功能了,就可以调用接口函数停止队列扫描,并在申请内存时直接进行申请而不加内存泄漏管理头,完成这些功能只需要加入一个全局变量标识即可。

本发明所述的针对内存泄漏检测和定位的方法,内存泄露检测所耗系统资源非常少并且不会出现瞬间的高峰。由于采用了用户自定义内存生存期,就可以减少内存泄漏检查的误报,并且由于只对超出了最长生存期的内存进行报告,这样在实际运行中报告的信息量非常少,大大减少了定位和判断内存泄漏的时间,从而节省了大量人力,提高了调试和测试系统的效率。本方法不但可用于调试和测试阶段,而且在产品阶段也可以应用,由于该系统消耗资源非常少,用户又可以根据情况来决定是否启动该功能,因此提高了实时操作系统的稳定性和可靠性。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号