CN100388233C - 一种定位无操作系统的嵌入式系统内存泄露的方法 - Google Patents
一种定位无操作系统的嵌入式系统内存泄露的方法 Download PDFInfo
- Publication number
- CN100388233C CN100388233C CNB2005101211087A CN200510121108A CN100388233C CN 100388233 C CN100388233 C CN 100388233C CN B2005101211087 A CNB2005101211087 A CN B2005101211087A CN 200510121108 A CN200510121108 A CN 200510121108A CN 100388233 C CN100388233 C CN 100388233C
- 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.)
- Active
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=3000;
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_times++;
p=malloc(size);
if(p==NULL)
printf(″##Malloc fail##\n″);
else
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所述的一种定位无操作系统的嵌入式系统内存泄露的方法,其特征在于:所述找出最后分配该特定地址的内存的指令通过仿真器跟踪定位出。
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 CN1794203A (zh) | 2006-06-28 |
CN100388233C true 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) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102053868B (zh) * | 2009-11-04 | 2016-08-10 | 突触计算机系统(上海)有限公司 | 一种内存泄露检测方法和装置 |
CN102831068B (zh) * | 2011-06-13 | 2016-04-06 | 阿里巴巴集团控股有限公司 | 一种内存操作记录的处理方法及装置 |
CN112559184A (zh) * | 2020-12-17 | 2021-03-26 | 成都思酷智能科技有限公司 | 一种云桌面动态分配内存的方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1466057A (zh) * | 2002-06-20 | 2004-01-07 | 华为技术有限公司 | 一种软件内存泄露的检查方法 |
CN1538300A (zh) * | 2003-09-23 | 2004-10-20 | 中兴通讯股份有限公司 | 一种实现嵌入式实时系统内存泄漏检测和定位的方法 |
US20050022063A1 (en) * | 2003-07-11 | 2005-01-27 | Dmitry Grebenev | Kernel-level method of flagging problems in applications |
-
2005
- 2005-12-29 CN CNB2005101211087A patent/CN100388233C/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1466057A (zh) * | 2002-06-20 | 2004-01-07 | 华为技术有限公司 | 一种软件内存泄露的检查方法 |
US20050022063A1 (en) * | 2003-07-11 | 2005-01-27 | Dmitry Grebenev | Kernel-level method of flagging problems in applications |
CN1538300A (zh) * | 2003-09-23 | 2004-10-20 | 中兴通讯股份有限公司 | 一种实现嵌入式实时系统内存泄漏检测和定位的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN1794203A (zh) | 2006-06-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100389403C (zh) | 内存泄漏检测及恢复的方法 | |
KR102537875B1 (ko) | 차량 ecu 소프트웨어 검증을 위한 동적 결함 주입 방법 및 장치 | |
US7000225B2 (en) | Method for inserting global breakpoints | |
KR101459867B1 (ko) | 시스템 테스트 장치 | |
CN100440163C (zh) | 对计算机程序进行运行时分析的方法和系统 | |
JP2002538465A (ja) | 単一のテスターチャンネルを使用して複数のデバイスの同時テストを行うための分散型インターフェース | |
KR20080095527A (ko) | 임베디드 소프트웨어의 인터페이스 자동 추출 장치 및 그방법 | |
CN107480021A (zh) | 一种基于Linux系统下测试Expander背板硬盘指示灯的方法及系统 | |
CN100388233C (zh) | 一种定位无操作系统的嵌入式系统内存泄露的方法 | |
US6745345B2 (en) | Method for testing a computer bus using a bridge chip having a freeze-on-error option | |
CN1801155A (zh) | 合并硬件设计语言的原始档案与查验资料档案的方法 | |
CN100392606C (zh) | 一种定位虚拟操作系统内存泄漏的方法 | |
CN102486938A (zh) | 一种快速检测存储器的方法及装置 | |
CN107832180A (zh) | 一种对硬盘接口依次进行单盘性能自动测试的方法 | |
CN118426689A (zh) | 固态硬盘的数据处理方法、系统及设备 | |
US7689880B2 (en) | Test apparatus, test method, analyzing apparatus and computer readable medium | |
CN112612697A (zh) | 一种基于字节码技术的软件缺陷测试定位方法及系统 | |
CN102375776A (zh) | 一种嵌入式设备及其检测和定位内存泄漏的方法 | |
CN101201778A (zh) | 可扩展固件接口下硬盘测试方法 | |
CN113688031B (zh) | 一种基于字节码增强技术的测试定位方法 | |
US9753806B1 (en) | Implementing signal integrity fail recovery and mainline calibration for DRAM | |
CN100487669C (zh) | 内存重复释放的定位方法和系统 | |
US20070028218A1 (en) | Apparatus, system, and method for a software test coverage analyzer using embedded hardware | |
CN101697285B (zh) | 存储设备硬件调试的方法及系统 | |
US10593419B1 (en) | Failing read count diagnostics for memory built-in self-test |
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. |