CN1538300A - 一种实现嵌入式实时***内存泄漏检测和定位的方法 - Google Patents
一种实现嵌入式实时***内存泄漏检测和定位的方法 Download PDFInfo
- Publication number
- CN1538300A CN1538300A CNA2004100069569A CN200410006956A CN1538300A CN 1538300 A CN1538300 A CN 1538300A CN A2004100069569 A CNA2004100069569 A CN A2004100069569A CN 200410006956 A CN200410006956 A CN 200410006956A CN 1538300 A CN1538300 A CN 1538300A
- Authority
- CN
- China
- Prior art keywords
- memory
- memory overflow
- internal memory
- round
- robin queue
- 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
本发明属于对计算机性能的改进,具体涉及一种实现嵌入式实时***内存泄漏检测和定位的方法。通过环形队列注册内存申请、定时扫描以及用户自定义内存扫描时间,使得内存泄露检测所耗***资源非常少并且不会出现瞬间的高峰。采用用户自定义内存生存期,就可以减少内存泄漏检查的误报,并且由于只对超出了最长生存期的内存进行报告,这样在实际运行中报告的信息量非常少,大大减少了定位和判断内存泄漏的时间,从而节省了大量人力,提高了调试和测试***的效率。本发明不但可用于调试和测试阶段,而且在产品阶段也可以应用,由于该方法***消耗资源非常少,用户又可以根据情况来决定是否启动,因此提高了实时操作***的稳定性和可靠性。
Description
技术领域
本发明属于对计算机性能的改进,具体涉及一种实现计算机操作***内存泄漏检测和定位的方法,尤其涉及一种实现嵌入式实时***内存泄漏检测和定位的方法。
背景技术
内存泄漏是计算机***中比较常见的缺陷,在许多比较复杂的计算机***中,由于内存泄漏造成***运行越来越慢,直到最后由于内存资源耗尽而崩溃。但是非常难以检测并准确定位具体哪段代码申请了内存,而没有释放从而引起了内存泄漏。
内存泄漏检测和定位是嵌入式实时操作***(称为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的进行报警,从而发现了内存泄漏。
第五步:
如果用户不需要该功能了,就可以调用接口函数停止队列扫描,并在申请内存时直接进行申请而不加内存泄漏管理头,完成这些功能只需要加入一个全局变量标识即可。
本发明所述的针对内存泄漏检测和定位的方法,内存泄露检测所耗***资源非常少并且不会出现瞬间的高峰。由于采用了用户自定义内存生存期,就可以减少内存泄漏检查的误报,并且由于只对超出了最长生存期的内存进行报告,这样在实际运行中报告的信息量非常少,大大减少了定位和判断内存泄漏的时间,从而节省了大量人力,提高了调试和测试***的效率。本方法不但可用于调试和测试阶段,而且在产品阶段也可以应用,由于该***消耗资源非常少,用户又可以根据情况来决定是否启动该功能,因此提高了实时操作***的稳定性和可靠性。
Claims (7)
1、一种实现嵌入式实时***内存泄漏检测和定位的方法,至少包括如下步骤:
第一步:建立一个由队列项所构成的循环队列,所述循环队列有一个游标,游标所指向的队列项为当前时间,游标每隔指定时间,往下走一格;
第二步:在申请内存时,同时申请内存泄漏管理块,用于填写相关信息,并且在所述申请的内存头中附加一个指针,用于指向内存泄漏管理块;
第三步:根据用户在申请内存时规定的内存最长生存期,计算出该申请内存在循环队列中的位置,并在该位置进行注册,即在该位置挂上内存泄漏管理块,由所有在该位置的内存泄漏管理块组成双向链表。
2、如权利要求1所述实现嵌入式实时***内存泄漏检测和定位的方法,其特征在于:
所述内存最长生存期超过循环队列总长度,用该生存期整除总长度,从而得到循环的圈数。
3、如权利要求1所述实现嵌入式实时***内存泄漏检测和定位的方法,其特征在于:
所述循环队列每隔指定时间,游标往下走一格,如果游标指向循环队列的队列项不为NULL,则遍历该队列项所指向的内存泄漏管理块双向链表;
如果循环圈数为0,该内存泄漏管理块所指向的内存发生了内存泄漏;
当内存使用率大于80%时就向用户报警,并给出内存的信息,如内存申请的调用函数在源代码的文件和位置行数。
4、如权利要求1或2或3所述实现嵌入式实时***内存泄漏检测和定位的方法,其特征在于:
所述循环队列游标的间隔指定时间为1秒。
5、如权利要求1或2或3所述实现嵌入式实时***内存泄漏检测和定位的方法,其特征在于:
所述循环队列的总长度为30分钟。
6、如权利要求1或2或3所述实现嵌入式实时***内存泄漏检测和定位的方法,其特征在于:
所述内存泄漏管理块用C语言定义如下:
typedef struct T_LeakCheckHead
{
char*filename;
int line:
int loop;
unsigned char HeadPoiter;
struct T_LeakCheckHead*prev;
struct T_LeakCheckHead*next;
}CLEAKCHECK。
7、如权利要求1或2或3所述实现嵌入式实时***内存泄漏检测和定位的方法,其特征在于:
所述循环队列的队列项定义如下:
typedef struct T_queueNode
{
struct T_LeakCheckHead*leakchkhead;
}CQUEUE;
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2004100069569A CN1327352C (zh) | 2003-09-23 | 2004-03-01 | 一种实现嵌入式实时***内存泄漏检测和定位的方法 |
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN03134643 | 2003-09-23 | ||
CN03134643.X | 2003-09-23 | ||
CNB2004100069569A CN1327352C (zh) | 2003-09-23 | 2004-03-01 | 一种实现嵌入式实时***内存泄漏检测和定位的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1538300A true CN1538300A (zh) | 2004-10-20 |
CN1327352C CN1327352C (zh) | 2007-07-18 |
Family
ID=34378727
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2004100069569A Expired - Fee Related CN1327352C (zh) | 2003-09-23 | 2004-03-01 | 一种实现嵌入式实时***内存泄漏检测和定位的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1327352C (zh) |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100388233C (zh) * | 2005-12-29 | 2008-05-14 | 兆日科技(深圳)有限公司 | 一种定位无操作***的嵌入式***内存泄露的方法 |
CN100389403C (zh) * | 2005-04-07 | 2008-05-21 | 华为技术有限公司 | 内存泄漏检测及恢复的方法 |
CN100392606C (zh) * | 2005-07-14 | 2008-06-04 | 中兴通讯股份有限公司 | 一种定位虚拟操作***内存泄漏的方法 |
CN100462925C (zh) * | 2005-12-08 | 2009-02-18 | 中兴通讯股份有限公司 | 自动释放嵌入式***中应用程序模块泄漏内存的方法 |
CN101206616B (zh) * | 2006-12-19 | 2010-06-09 | 中国电信股份有限公司 | 一种图形界面程序的资源泄漏测试及问题定位方法 |
CN101587455B (zh) * | 2008-12-11 | 2010-09-22 | 南京南瑞继保电气有限公司 | 一种用于vxWorks操作***检查内存泄漏的方法 |
CN101419568B (zh) * | 2007-10-26 | 2010-11-03 | 英业达股份有限公司 | 电脑可执行的翻译软件测试***及其方法 |
CN101710303B (zh) * | 2009-12-01 | 2011-07-27 | 中国人民解放军国防科学技术大学 | 基于流敏感上下文敏感指向图的内存泄漏检测方法 |
CN101539976B (zh) * | 2009-04-23 | 2011-08-31 | 南京大学 | 二进制程序内存腐烂攻击的实时检测*** |
CN103064784A (zh) * | 2012-11-29 | 2013-04-24 | 福建师范大学 | 面向Xen环境的运行时内存泄漏检测方法及其实现*** |
CN104022963A (zh) * | 2014-01-02 | 2014-09-03 | 烽火通信科技股份有限公司 | 多种通信方式并存的通信方法及装置 |
CN104484606A (zh) * | 2014-12-05 | 2015-04-01 | 国云科技股份有限公司 | 一种虚拟化平台内存信息保密性的验证方法 |
CN104866409A (zh) * | 2015-05-29 | 2015-08-26 | 小米科技有限责任公司 | 内存泄露监控方法和装置 |
CN103914366B (zh) * | 2013-01-05 | 2017-05-31 | 腾讯科技(深圳)有限公司 | 一种自动监测应用程序进行内存信息的方法及装置 |
CN107423220A (zh) * | 2017-08-04 | 2017-12-01 | 青岛海信宽带多媒体技术有限公司 | 内存泄露的检测方法及装置、电子设备 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
FR2532009B1 (fr) * | 1982-08-19 | 1986-06-06 | Aerospatiale | Agencement de roue cinetique a paliers magnetiques, particulierement destine a servir d'accumulateur d'energie |
US6167535A (en) * | 1997-12-09 | 2000-12-26 | Sun Microsystems, Inc. | Object heap analysis techniques for discovering memory leaks and other run-time information |
JP2001306345A (ja) * | 2000-04-17 | 2001-11-02 | Toshiba Tec Corp | 情報処理装置及びposターミナル |
JP2002108698A (ja) * | 2000-10-04 | 2002-04-12 | Nissin Electric Co Ltd | メモリ管理システム及びメモリ管理方法 |
CN1275423C (zh) * | 2002-02-28 | 2006-09-13 | 中兴通讯股份有限公司 | 嵌入式实时操作***中定时器的计时方法 |
-
2004
- 2004-03-01 CN CNB2004100069569A patent/CN1327352C/zh not_active Expired - Fee Related
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100389403C (zh) * | 2005-04-07 | 2008-05-21 | 华为技术有限公司 | 内存泄漏检测及恢复的方法 |
CN100392606C (zh) * | 2005-07-14 | 2008-06-04 | 中兴通讯股份有限公司 | 一种定位虚拟操作***内存泄漏的方法 |
CN100462925C (zh) * | 2005-12-08 | 2009-02-18 | 中兴通讯股份有限公司 | 自动释放嵌入式***中应用程序模块泄漏内存的方法 |
CN100388233C (zh) * | 2005-12-29 | 2008-05-14 | 兆日科技(深圳)有限公司 | 一种定位无操作***的嵌入式***内存泄露的方法 |
CN101206616B (zh) * | 2006-12-19 | 2010-06-09 | 中国电信股份有限公司 | 一种图形界面程序的资源泄漏测试及问题定位方法 |
CN101419568B (zh) * | 2007-10-26 | 2010-11-03 | 英业达股份有限公司 | 电脑可执行的翻译软件测试***及其方法 |
CN101587455B (zh) * | 2008-12-11 | 2010-09-22 | 南京南瑞继保电气有限公司 | 一种用于vxWorks操作***检查内存泄漏的方法 |
CN101539976B (zh) * | 2009-04-23 | 2011-08-31 | 南京大学 | 二进制程序内存腐烂攻击的实时检测*** |
CN101710303B (zh) * | 2009-12-01 | 2011-07-27 | 中国人民解放军国防科学技术大学 | 基于流敏感上下文敏感指向图的内存泄漏检测方法 |
CN103064784A (zh) * | 2012-11-29 | 2013-04-24 | 福建师范大学 | 面向Xen环境的运行时内存泄漏检测方法及其实现*** |
CN103064784B (zh) * | 2012-11-29 | 2016-01-27 | 福建师范大学 | 面向Xen环境的运行时内存泄漏检测方法及其实现*** |
CN103914366B (zh) * | 2013-01-05 | 2017-05-31 | 腾讯科技(深圳)有限公司 | 一种自动监测应用程序进行内存信息的方法及装置 |
CN104022963A (zh) * | 2014-01-02 | 2014-09-03 | 烽火通信科技股份有限公司 | 多种通信方式并存的通信方法及装置 |
CN104022963B (zh) * | 2014-01-02 | 2017-06-13 | 烽火通信科技股份有限公司 | 多种通信方式并存的通信方法及装置 |
CN104484606A (zh) * | 2014-12-05 | 2015-04-01 | 国云科技股份有限公司 | 一种虚拟化平台内存信息保密性的验证方法 |
CN104866409A (zh) * | 2015-05-29 | 2015-08-26 | 小米科技有限责任公司 | 内存泄露监控方法和装置 |
CN107423220A (zh) * | 2017-08-04 | 2017-12-01 | 青岛海信宽带多媒体技术有限公司 | 内存泄露的检测方法及装置、电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN1327352C (zh) | 2007-07-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1538300A (zh) | 一种实现嵌入式实时***内存泄漏检测和定位的方法 | |
US11429764B2 (en) | System and method for energy usage accounting in software applications | |
CN1291311C (zh) | 一种执行非标准呼叫/返回的程序代码的装置及方法 | |
US8825721B2 (en) | Time-based object aging for generational garbage collectors | |
CN104335175B (zh) | 基于***性能度量在***节点之间标识和迁移线程的方法和*** | |
Burtscher et al. | Measuring GPU power with the K20 built-in sensor | |
US20130086131A1 (en) | Time-based object aging for generational garbage collectors | |
US7761487B2 (en) | Predicting out of memory conditions using soft references | |
US8849875B2 (en) | Remembered set overhead reduction by deferred garbage collection of stable regions | |
CN1918550A (zh) | 用于监视资源的方法、装置及计算机程序 | |
CN1828544A (zh) | 利用同步开销以改善多线程性能的机制 | |
CN101052204A (zh) | 跟踪区重配置方法及***、用户设备和移动性管理实体 | |
CN1235142C (zh) | 嵌入式软件任务死循环监控方法 | |
US20110119318A1 (en) | Zero-copy maturing of large objects in generational heap with copying collection | |
WO2020211253A1 (zh) | 分布式***中主机数量弹性伸缩方法、装置和计算机设备 | |
CN1904850A (zh) | 对嵌入式操作***的性能信息进行实时监测的方法 | |
Eklov et al. | StatCC: a statistical cache contention model | |
CN1878322A (zh) | 故障定位的方法及装置 | |
US9280386B1 (en) | Identifying task instance outliers based on metric data in a large scale parallel processing system | |
CN102411513A (zh) | 一种工作于混合模式执行引擎中的垃圾收集方法 | |
CN101067797A (zh) | 处理器利用率的测量装置及方法 | |
CN1245697C (zh) | 一种通过视频片段进行视频检索的方法 | |
JP2005050063A (ja) | 流体の数値計算方法及び装置及び制御プログラム及び記憶媒体 | |
CN105242971A (zh) | 面向流式处理***的内存对象管理方法及*** | |
CN100344109C (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 | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20170817 Address after: 164700, Heilongjiang County, Baiquan Province Public Township Long March village 1 groups Patentee after: Zhao Zhengheng Address before: 518057 Nanshan District science and Technology Industrial Park, Guangdong high tech Industrial Park, ZTE building Patentee before: ZTE Corporation |
|
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20070718 Termination date: 20180301 |