CN1794203A - 一种定位无操作系统的嵌入式系统内存泄露的简易方法 - Google Patents

一种定位无操作系统的嵌入式系统内存泄露的简易方法 Download PDF

Info

Publication number
CN1794203A
CN1794203A CN 200510121108 CN200510121108A CN1794203A CN 1794203 A CN1794203 A CN 1794203A CN 200510121108 CN200510121108 CN 200510121108 CN 200510121108 A CN200510121108 A CN 200510121108A CN 1794203 A CN1794203 A CN 1794203A
Authority
CN
China
Prior art keywords
internal memory
memory
reveal
module
software
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
Application number
CN 200510121108
Other languages
English (en)
Other versions
CN100388233C (zh
Inventor
黄晋锋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shenzhen Sinosun Technology Co., Ltd.
Original Assignee
Sinosun Technology (Shenzhen) Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Sinosun Technology (Shenzhen) Co Ltd filed Critical Sinosun Technology (Shenzhen) Co Ltd
Priority to CNB2005101211087A priority Critical patent/CN100388233C/zh
Publication of CN1794203A publication Critical patent/CN1794203A/zh
Application granted granted Critical
Publication of CN100388233C publication Critical patent/CN100388233C/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

一种定位无操作系统的嵌入式系统内存泄露的简易方法,包括如下步骤:在软件主循环中嵌入内存泄露检查模块,该内存泄露检查模块多次重复分配和释放内存空间,并记录内存泄露检查模块自身的运行时间;至少运行两次主循环,将每次记录的内存泄露检查模块的运行时间进行比较,如果上述内存泄露检查模块的运行时间逐渐增加,就判定软件存在内存泄露,否则,就判定不存在内存泄露;如果存在内存泄露,运行该软件,比较其对各个地址的内存的分配和释放次数,确定是否有某个特定地址的内存未被释放;最后分配该特定地址的内存的指令就是造成内存泄露的位置。可简单、快速的判定是否存在内存泄露并准确定位出造成内存泄露的位置。

Description

一种定位无操作系统的嵌入式系统内存泄露的简易方法
【技术领域】
本发明属于对软件可靠性的改进,具体涉及一种定位无操作系统的嵌入式系统内存泄露的方法。
【背景技术】
内存泄露是软件系统中很常见的缺陷,内存泄露会导致软件系统运行时可用内存减少,软件运行速度变慢,甚至会由于内存耗尽而产生系统崩溃。检测软件是否存在内存泄露和定位出造成内存泄露的具体位置已成为软件调试和可靠性测试的重要内容。目前,一般由编写软件的工程师自己详细审查代码,确认软件是否存在内存泄露,并查找出造成内存泄露的具体位置。当软件系统达到一定规模后使用此方法费力又耗时,且效果不佳。另一种方法是采用专用的商用软件来检测和定位,使用此方法需要较高的成本。
【发明内容】
本发明克服了现有技术中的不足,提供了一种定位无操作系统的嵌入式系统内存泄露的简易方法,可准确、快速地发现软件是否存在内存泄露,并准确查找出造成内存泄露的位置。
本发明的技术方案概述如下:一种定位无操作系统的嵌入式系统内存泄露的简易方法,包括如下步骤:
A.在软件主循环中嵌入内存泄露检查模块,该内存泄露检查模块多次重复分配和释放内存空间,并记录内存泄露检查模块自身的运行时间;
B.至少运行两次主循环,将每次记录的内存泄露检查模块的运行时间进行比较,如果上述内存泄露检查模块的运行时间逐渐增加,就判定软件存在内存泄露,否则,就判定不存在内存泄露;
C.如果存在内存泄露,运行该软件,比较其对各个地址的内存的分配和释放次数,确定是否有某个特定地址的内存未被释放;
D.最后分配该特定地址的内存的指令就是造成内存泄露的位置。所述步骤B之后步骤C之前还包括如下步骤:
21)、在存在内存泄露的软件中注销一个软件模块;
22)、至少运行两次主循环,将每次记录的内存泄露检查模块的运行时间进行比较,如果上述内存泄露检查模块的运行时间没有逐渐增加,就判定被注销的软件模块中存在内存泄露,剩余软件模块中不存在内存泄露,进入步骤C,如果上述内存泄露检查模块的运行时间逐渐增加,就进行步骤23);
23)、比较注销软件模块前后的内存泄露检查模块运行时间的增量,如果增量减少,控制模块就判定:被注销的软件模块中存在内存泄露,剩余软件模块中存在内存泄露,如果增量没有减少,控制模块就判定:被注销的软件模块中不存在内存泄露,剩余软件模块中存在内存泄露。
24)判断剩余软件模块的个数,如果剩余软件模块的个数不为1,则又进行步骤21);如果剩余软件模块的个数为1,则进入步骤C。
所述内存泄露检查模块是测试程序,该测试程序分配和和释放内存空间的次数可调。
在所述步骤C中,运行该有内存泄露的软件之前,在存在内存泄露的软件模块中用新的函数替换原有的分配内存空间和释放内存空间的函数,所述新函数包含原函数并增加内存分配和释放的统计和打印功能。
所述步骤C中,如果某个地址的内存的分配次数大于该地址的内存的释放次数,控制模块就判定该地址存在内存泄露,否则该地址不存在内存泄露。
如果原程序中包含各个步骤的执行信息,所述找出最后分配该特定地址的内存的指令的方法是:找出最后分配该特定地址的内存的语句,及该语句之后最邻近的步骤N运行完毕的信息,步骤N中进行内存分配的程序代码就是存在内存泄露的位置。
所述找出最后分配该特定地址的内存的指令可以通过仿真器逐步跟踪定位出。
与现有技术相比,本发明的效果是通过比较内存泄露检查模块的运行时间,可简单、快速的判定是否存在内存泄露。通过先确定存在内存泄露的软件模块,再比较地址的内存的分配次数和释放次数,确定存在内存泄露的特定地址,再找出最后分配该特定地址的内存的指令,该指令就是造成内存泄露的位置,可以准确的定位造成内存泄露的位置。使用本发明,不需引进昂贵的商用软件,成本低,而且不需编写软件的工程师详细审查代码,节约了大量时间。
【附图说明】
图1是内存泄露的示意图。
图2是本发明实施例中控制模块与软件的关系示意图。
图3是一种定位无操作系统的嵌入式系统内存泄露的简易方法的流程图。
图4是确定泄露内存的软件模块的流程图。
【具体实施方式】
下面通过具体的实施例并结合附图对本发明作进一步详细的描述。如图1所示,1为系统已分配的内存空间,2为未分配的内存空间,3为内存泄露空间,4为内存开始地址,5为内存结束地址。当软件完成初始化进入主循环以后,系统所需要的基本内存已经分配完毕,会占用内存的比较低端的地址空间,同时系统的内存管理程序会形成一个内存分配使用的链表,每分配一块内存就会在这个链表中添加一个节点。当软件需要为某个应用分配一段内存空间时,就需要在上述内存分配使用链表中查找到一段未使用且足够大的内存空间,查找过程需要从链表的首节点开始,直到查找到一段未使用且足够大的内存空间结束。当内存块的分配比较连续,而且链表中节点个数较少时,查找过程就可以很快的结束。上述节点的数据结构在C语言中定义如下:typedef struct_struct_region{
struct_struct_region *prev;
struct_struct_region *next;
unsigned long start;
unsigned long len;  }region,*region_t;
如图2、图3所示,一种定位无操作系统的嵌入式系统内存泄露的简易方法,包括如下步骤:
第一步:在软件主循环中嵌入内存泄露检查模块,所述内存泄露检查模块能够根据设定次数进行多次重复分配和释放内存空间,该内存泄露检查模块还包含时间记录模块,能记录其每次的运行时间。
第二步:控制模块控制软件至少运行两次主循环,并且每次都读取内存泄露检查模块的运行时间,将每次记录的内存泄露检查模块的运行时间进行比较。如果内存泄露检查模块的运行时间逐渐增加,控制模块就判定软件存在内存泄露;否则控制模块就判定软件不存在内存泄露。
当软件中没有内存泄露时,主循环调用内存泄露检查模块就在如图1所示的初始化内存空间之后的未分配内存空间2内进行内存的分配和释放。为内存泄露检查模块分配内存空间时,查找一段未使用且足够大的内存空间所需搜索链表的节点数是不变的,此时内存泄露检查模块的运行时间是基本保持稳定的。当软件中有内存泄露,主循环调用内存泄露检查模块,为其分配内存空间时,查找一段未使用且足够大的内存空间所需搜索链表的节点数是逐渐增加的,此时内存泄露检查模块的运行时间会逐渐增加。
内存泄露检查模块可以采用如下程序:
    U32m=5000;

    U32n=100;

       for(tmp=0;tmp<m;tmp++)

       {

          p=malloc(n);

          for(tmp2=0;tmp2<n;tmp2++)

          {

              p2=malloc(n);

              free(p2);

          }

          free(p);

    }
其中m和n可以根据不同的系统内存使用状况适当的调整,m和n越大,内存泄露检查模块的运行时间的增加就越明显。
第三步:如图2、图4所示,确定出泄露内存的软件模块。具体包括如下步骤:
a)控制模块发出控制信号,注销存在内存泄露的软件中的一个软件模块,即将该软件模块从主循环中去除,运行主循环时,不需调用该软件模块。
b)控制模块控制软件至少运行两次主循环,并且每次都读取内存泄露检查模块的运行时间,将每次记录的内存泄露检查模块的运行时间进行比较。如果内存泄露检查模块的运行时间没有逐渐增加,控制模块就判定:被注销的软件模块中存在内存泄露,剩余软件模块中不存在内存泄露,进入第四步;如果内存泄露检查模块的运行时间逐渐增加,则进行步骤c)。剩余软件模块是指注销软件模块后,运行主循环时,需调用的软件模块。
c)控制模块比较注销软件模块前每次内存泄露检查模块的运行时间的增量与注销软件模块后每次内存泄露检查模块的运行时间的增量,如果增量没有减少,控制模块就判定:被注销的软件模块中不存在内存泄露,剩余软件模块中存在内存泄露,然后进行步骤d);如果增量减少,控制模块就判定:被注销的软件模块中存在内存泄露,剩余软件模块中存在内存泄露,然后进行步骤d)。
d)控制模块判断剩余软件模块的个数,如果剩余软件模块的个数不为1,则又进行步骤a);如果剩余软件模块的个数为1,则第三步结束,进入第四步。
第四步,在第三步确定出的泄露内存的软件模块中,控制模块定义新的函数替换原有的分配内存空间和释放内存空间的函数,新函数包含原函数并增加了内存分配的统计和打印功能。在正常情况,即没有内存泄露的情况下,内存的分配和释放是一一对应的,即各个地址的内存的分配次数和释放次数相等。控制模块控制运行新程序,统计打印出来的各个地址的内存分配次数和释放次数。如果某个特定地址的内存的分配次数大于该特定地址的内存的释放次数,控制模块就判定该特定地址存在内存泄露,否则该特定地址不存在内存泄露。控制模块记录上述存在内存泄露的特定地址。
例如:可以用下列dmalloc、dcalloc、dfree函数替换原有malloc、calloc、free函数,具体定义如下:
   static unsigned int malloc_times=0;
   void*dmalloc(size_t size)
   {

      void*p=NULL;

      malloc_imes++;

      p=malloc(size);

      if(p==NULL)

         printf(″##Malloc fail##\n″);

      else
        <!-- SIPO <DP n="6"> -->
        <dp n="d6"/>
    printf(″Malloc times=%d,adds=0x%x\n″,malloc_times,p);
  return p;
}
void*dcalloc(size_t nitems,size_t size)
{
  void*p;
  p=dmalloc(nitems*size);
  if(!p)

    return NULL;
  memset(p,0x00,nitems*size);
  return p;
}
void dfree(void*ptr)
{
  malloc_times--;
  if(ptr==NULL)
  {

    printf(″##free NULL##\n″);

    return;

    }

    printf(″Free times=%d,adds=0x%x\n″,malloc_times,ptr);

    free(ptr);
}
用以上新函数dmalloc、dcalloc、dfree替换原有malloc、calloc、free函数之后,运行程序,如果打印信息里显示的free个数是N,控制模块就判定存在N个内存泄露处。统计打印出来的各个地址的内存分配次数和释放次数。如果某个特定地址的内存的分配次数大于该特定地址的内存的释放次数,控制模块就判定该特定地址存在内存泄露,否则该特定地址不存在内存泄露。控制模块记录上述存在内存泄露的特定地址。
第五步:如果软件中包含各个步骤的执行信息,所述执行信息是指显示各个步骤运行结束的信息,例如:程序运行完步骤1就打印“步骤1运行完毕!”,程序运行完步骤2就打印“步骤2运行完毕!”......。控制模块查找出:最后分配存在内存泄露的特定地址的内存的语句,和该语句之后最邻近的步骤N运行完毕的信息。步骤N中进行内存分配的程序代码就是存在内存泄露的程序代码。如果软件中不包含各个步骤的执行信息,可以通过仿真器逐步跟踪定位出最后分配存在内存泄露的特定地址的内存的程序代码。

Claims (7)

1.一种定位无操作系统的嵌入式系统内存泄露的简易方法,其特征在于包括如下步骤:
A.在软件主循环中嵌入内存泄露检查模块,该内存泄露检查模块多次重复分配和释放内存空间,并记录内存泄露检查模块自身的运行时间;
B.至少运行两次主循环,将每次记录的内存泄露检查模块的运行时间进行比较,如果上述内存泄露检查模块的运行时间逐渐增加,就判定软件存在内存泄露,否则,就判定不存在内存泄露;
C.如果存在内存泄露,运行该软件,比较其对各个地址的内存的分配和释放次数,确定是否有某个特定地址的内存未被释放;
D.最后分配该特定地址的内存的指令就是造成内存泄露的位置。
2.根据权利要求1所述的一种定位无操作系统的嵌入式系统内存泄露的简易方法,其特征在于所述步骤B之后步骤C之前还包括如下步骤:
21)、在存在内存泄露的软件中注销一个软件模块;
22)、至少运行两次主循环,将每次记录的内存泄露检查模块的运行时间进行比较,如果上述内存泄露检查模块的运行时间没有逐渐增加,就判定被注销的软件模块中存在内存泄露,剩余软件模块中不存在内存泄露,进入步骤C,如果上述内存泄露检查模块的运行时间逐渐增加,就进行步骤23);
23)、比较注销软件模块前后的内存泄露检查模块运行时间的增量,如果增量减少,就判定:被注销的软件模块中存在内存泄露,剩余软件模块中存在内存泄露,如果增量没有减少,就判定:被注销的软件模块中不存在内存泄露,剩余软件模块中存在内存泄露。
24)判断剩余软件模块的个数,如果剩余软件模块的个数不为1,则又进行步骤21);如果剩余软件模块的个数为1,则进入步骤C。
3.根据权利要求1所述的一种定位无操作系统的嵌入式系统内存泄露的简易方法,其特征在于:所述内存泄露检查模块是测试程序,该测试程序分配和和释放内存空间的次数可调。
4.根据权利要求1所述的一种定位无操作系统的嵌入式系统内存泄露的简易方法,其特征在于:在所述步骤C中,运行该有内存泄露的软件之前,在存在内存泄露的软件模块中用新的函数替换原有的分配内存空间和释放内存空间的函数,所述新函数包含原函数并增加内存分配和释放的统计和打印功能。
5.根据权利要求1所述的一种定位无操作系统的嵌入式系统内存泄露的简易方法,其特征在于:所述步骤C中,如果某个地址的内存的分配次数大于该地址的内存的释放次数,控制模块就判定该地址存在内存泄露,否则该地址不存在内存泄露。
6.根据权利要求1所述的一种定位无操作系统的嵌入式系统内存泄露的简易方法,其特征在于:如果原程序中包含各个步骤的执行信息,所述找出最后分配该特定地址的内存的指令的方法是:找出最后分配该特定地址的内存的语句,及该语句之后最邻近的步骤N运行完毕的信息,步骤N中进行内存分配的指令就是造成内存泄露的位置。
7.根据权利要求1所述的一种定位无操作系统的嵌入式系统内存泄露的简易方法,其特征在于:所述找出最后分配该特定地址的内存的指令可以通过仿真器跟踪定位出。
CNB2005101211087A 2005-12-29 2005-12-29 一种定位无操作系统的嵌入式系统内存泄露的方法 Active CN100388233C (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CNB2005101211087A CN100388233C (zh) 2005-12-29 2005-12-29 一种定位无操作系统的嵌入式系统内存泄露的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CNB2005101211087A CN100388233C (zh) 2005-12-29 2005-12-29 一种定位无操作系统的嵌入式系统内存泄露的方法

Publications (2)

Publication Number Publication Date
CN1794203A true CN1794203A (zh) 2006-06-28
CN100388233C CN100388233C (zh) 2008-05-14

Family

ID=36805660

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB2005101211087A Active CN100388233C (zh) 2005-12-29 2005-12-29 一种定位无操作系统的嵌入式系统内存泄露的方法

Country Status (1)

Country Link
CN (1) CN100388233C (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102831068A (zh) * 2011-06-13 2012-12-19 阿里巴巴集团控股有限公司 一种内存操作记录的处理方法及装置
CN102053868B (zh) * 2009-11-04 2016-08-10 突触计算机系统(上海)有限公司 一种内存泄露检测方法和装置
CN112559184A (zh) * 2020-12-17 2021-03-26 成都思酷智能科技有限公司 一种云桌面动态分配内存的方法及装置

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1248114C (zh) * 2002-06-20 2006-03-29 华为技术有限公司 一种软件内存泄露的检查方法
US7900092B2 (en) * 2003-07-11 2011-03-01 Computer Associates Think, Inc. Kernel-level method of flagging problems in applications
CN1327352C (zh) * 2003-09-23 2007-07-18 中兴通讯股份有限公司 一种实现嵌入式实时系统内存泄漏检测和定位的方法

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102053868B (zh) * 2009-11-04 2016-08-10 突触计算机系统(上海)有限公司 一种内存泄露检测方法和装置
CN102831068A (zh) * 2011-06-13 2012-12-19 阿里巴巴集团控股有限公司 一种内存操作记录的处理方法及装置
CN112559184A (zh) * 2020-12-17 2021-03-26 成都思酷智能科技有限公司 一种云桌面动态分配内存的方法及装置

Also Published As

Publication number Publication date
CN100388233C (zh) 2008-05-14

Similar Documents

Publication Publication Date Title
US6523141B1 (en) Method and apparatus for post-mortem kernel memory leak detection
US7734666B2 (en) Method and system for inspecting memory leaks and analyzing contents of garbage collection files
CN1845080A (zh) 内存泄漏检测及防止的方法
US8151143B2 (en) Method and apparatus of partitioned memory dump in a software system
CN1248114C (zh) 一种软件内存泄露的检查方法
CN100440163C (zh) 对计算机程序进行运行时分析的方法和系统
CN1801155A (zh) 合并硬件设计语言的原始档案与查验资料档案的方法
CN1991785A (zh) 用于分析运行时存储器访问错误的方法和系统
CN1141644C (zh) 一种嵌入处理机内存的检测和监控方法
CN112148221B (zh) 一种磁盘冗余阵列的巡检方法、装置、设备及存储介质
US7096339B2 (en) System and method for detecting memory management programming errors
CN1794203A (zh) 一种定位无操作系统的嵌入式系统内存泄露的简易方法
BR0009008A (pt) Sistema e método para dispositivos para teste e validação dotados de um sistema operacional embutido
CN1431595A (zh) 自动化的主板测试系统及方法
CN1929034A (zh) 一种内存故障测试的方法及系统
CN101051220A (zh) 将过程序列检查集中化的方法
CN1896957A (zh) 一种定位虚拟操作系统内存泄漏的方法
CN102053868A (zh) 一种内存泄露检测方法和装置
US6816986B1 (en) Remapping memory devices during operation
US20080126730A1 (en) Volume migration program, method and system
CN101201778A (zh) 可扩展固件接口下硬盘测试方法
CN110688266B (zh) 故障内存条定位方法、装置及存储介质
JP4886188B2 (ja) 情報処理装置及びその制御方法、コンピュータプログラム及び記憶媒体
CN1288562C (zh) 检测软盘驱动器盘片更换的方法
CN1841333A (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
C56 Change in the name or address of the patentee

Owner name: SHENZHEN ZHAORI TECHNOLOGY CO., LTD.

Free format text: FORMER NAME: ZHAORI SCIENCE + TECHNOLOGY (SHENZHEN) CO., LTD.

CP01 Change in the name or title of a patent holder

Address after: 518040 Guangdong city of Shenzhen province Futian District Che Kung Temple Tairan Industrial Zone 213 6C

Patentee after: Shenzhen Sinosun Technology Co., Ltd.

Address before: 518040 Guangdong city of Shenzhen province Futian District Che Kung Temple Tairan Industrial Zone 213 6C

Patentee before: Sinosun Technology (Shenzhen) Co., Ltd.