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

文档序号:6650512阅读:121来源:国知局
专利名称:一种定位无操作系统的嵌入式系统内存泄露的简易方法
技术领域
本发明属于对软件可靠性的改进,具体涉及一种定位无操作系统的嵌入式系统内存泄露的方法。
背景技术
内存泄露是软件系统中很常见的缺陷,内存泄露会导致软件系统运行时可用内存减少,软件运行速度变慢,甚至会由于内存耗尽而产生系统崩溃。检测软件是否存在内存泄露和定位出造成内存泄露地具体位置已成为软件调试和可靠性测试的重要内容。目前,一般由编写软件的工程师自己详细审查代码,确认软件是否存在内存泄露,并查找出造成内存泄露的具体位置。当软件系统达到一定规模后使用此方法费力又耗时,且效果不佳。另一种方法是采用专用的商用软件来检测和定位,使用此方法需要较高的成本。

发明内容
本发明克服了现有技术中的不足,提供了一种定位无操作系统的嵌入式系统内存泄露的简易方法,可准确、快速地发现软件是否存在内存泄露,并准确查找出造成内存泄露的位置。
本发明的技术方案概述如下一种定位无操作系统的嵌入式系统内存泄露的简易方法,包括如下步骤
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中进行内存分配的程序代码就是存在内存泄露的程序代码。如果软件中不包含各个步骤的执行信息,可以通过仿真器逐步跟踪定位出最后分配存在内存泄露的特定地址的内存的程序代码。
权利要求
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所述的一种定位无操作系统的嵌入式系统内存泄露的简易方法,其特征在于所述找出最后分配该特定地址的内存的指令可以通过仿真器跟踪定位出。
全文摘要
一种定位无操作系统的嵌入式系统内存泄露的简易方法,包括如下步骤在软件主循环中嵌入内存泄露检查模块,该内存泄露检查模块多次重复分配和释放内存空间,并记录内存泄露检查模块自身的运行时间;至少运行两次主循环,将每次记录的内存泄露检查模块的运行时间进行比较,如果上述内存泄露检查模块的运行时间逐渐增加,就判定软件存在内存泄露,否则,就判定不存在内存泄露;如果存在内存泄露,运行该软件,比较其对各个地址的内存的分配和释放次数,确定是否有某个特定地址的内存未被释放;最后分配该特定地址的内存的指令就是造成内存泄露的位置。可简单、快速的判定是否存在内存泄露并准确定位出造成内存泄露的位置。
文档编号G06F11/36GK1794203SQ200510121108
公开日2006年6月28日 申请日期2005年12月29日 优先权日2005年12月29日
发明者黄晋锋 申请人:兆日科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1