专利名称:一种通信设备系统中内存泄漏的检测方法
技术领域:
本发明涉及通信设备系统中的内存泄漏检测方法,尤其涉及光通讯设备 系统中的内存泄漏检测方法。
背景技术:
内存泄漏是指分配了内存给某个程序使用,而程序使用完内存后没有释 放内存,导致已分配的内存无法回收再利用。随着程序的运行,系统中可用 的内存就会越来越少,导致系统由于没有足够的内存而瘫痪,造成严重影响。一般在通信设备中运行的是嵌入式系统,该系统的内存资源很宝贵、有 限。在该系统上的软件一般都要求长时间不间断运行,只要泄漏了哪怕是很 少一部分的内存,日积月累下来都可能造成系统的内存不足,最后瘫痪,导 致通信业务中断。内存泄漏可能是由于开发人员考虑不周,编写的程序存在隐患没有及时 释放内存,也可能是系统出现了异常,没有释放内存导致的。 一般而言,在 通信设备系统中运行的应用程序都存在着内存泄漏的危险。目前, 一般使用软件工具和定义内存块的生命期来检测内存泄漏,但这有几点不足。第一,这些工具大部分都是基于Windows平台的,必须把应用 程序移植到Windows平台上才可以使用。第二,这些工具只能在应用程序的 测试阶段使用,当应用程序移到了通信设备上运行时则不能使用。有的内存 泄漏在测试阶段是难以发现的,往往只有在实际使用中才会出现。第三,很 多情况下内存块的生命期是难以确定的,有的程序可能需要一直使用内存块 而不释放,通过定义内存块的生命期则会发生误判。发明内容为了解决上述的技术问题,提供了一种新的内存泄漏检测方法,其目 的在于,本发明不仅从时间上检测内存泄漏,而且还从空间上(申请内存块
的位置,即申请内存块的代码所在的文件名和行号)来判断是否发生了内存泄漏,更加准确的检测和定位内存泄漏。本发明提供了一种内存泄漏的检测方法,具有如下步骤步骤1、定义内存块的使用期、内存块泄露阈值和检测过滤表参数,用于为内存泄露检测提供依据;步骤2、记录申请内存块的信息,用于记录内存块的使用信息; 步骤3、对内存块所述参数进行泄露检测,用于检测内存是否泄露。 所述内存块使用期,用于估计程序申请内存块后使用的时间; 所述内存块泄露阈值,用于从空间上判断内存是否发生泄漏; 所述检测过滤表,用于避免误判内存泄漏。所述记录申请内存块的信息包括申请内存块的位置信息、分配的时刻和 内存块使用状态。所述位置信息使用文件名和文件行号表示,或者使用文件的唯一标识和 文件行号表示,所述内存块的使用状态包括空闲和已使用。 所述检测过滤表记录程序不会释放的内存块的位置信息。 释放内存块时,将该内存块的使用状态置为空闲。 所述对内存块进行检测包括如下具体步骤步骤71、建立内存块信息块指针链表,将符合条件的内存块信息添加到 所述内存块信息块指针链表中;步骤72、统计所述指针链表中所述位置信息相同的内存块数目,并与所 述内存块泄露阈值进行比较,判断是否发生了内存泄露。所述步骤71中,所述添加到内存块信息块指针链表中的内存块信息包括 所述内存块的分配时刻、位置信息和使用状态。所述步骤71中,所述符合条件的内存块是指该内存块的使用时间超过所 述使用期,并且该内存块的位置信息没有出现在所述检测过滤表中。所述步骤72中,如果所述指针链表中所述位置信息相同的内存块数目大 于或者等于所述内存块泄露阈值,则发生了内存泄露,且发生泄漏的位置即 为内存块信息块中记录的内存块位置信息。采用本发明提供的方法,能够准确的从时间上,空间上检测出内存泄漏, 而且具有很大的灵活性。内存块的使用期可以根据不同的程序使用内存块情 况而定。当内存块泄漏阀值定义得比较大时,比如定义为3,适用于检测出泄漏了大于等于3个内存块的情况。当内存块泄漏阀值定义为1时,则只要超过了使用期则认为发生了内存泄漏。假如存在某个程序的确需要很长时间 使用内存块而不会释放,则可以把该程序申请内存块代码的位置信息添加到 检测过滤表中,以减少误判,使得判断出来的内存泄漏更准确、实用。采用 本发明提供的方法不显著增加内存块申请的时间,检测时只检测使用时间超 出了使用期的内存块,不会显著的影响系统的性能。而且该发明不仅在通信 设备的测试阶段使用,还可以在通信设备实际应用阶段使用。
图1是内存泄漏检测实施例流程图;图2是记录申请内存块位置信息示意图;图3是内存泄漏检测链表图。
具体实施方式
本发明通过定义内存块的使用期、内存块泄漏阀值和检测过滤表,从时间 和空间上(申请内存块的位置,即申请内存块的代码所在的文件名和行号) 综合判断是否发生了内存泄漏。判断的准则是内存块的使用时间超出了使用 期,从相同位置申请的内存块数目大于等于内存块泄漏阔值,并且申请内存 块的位置不在过滤检测表中。本发明所提供的方法的具体步骤如下第一步,定义内存块的使用期、内存块泄漏阀值和检测过滤表。内存块 使用期是估计程序申请了内存块后使用的时间,比如一个小时。从分配内存 块的时刻起,如果在使用期内没有释放内存块,则可能发生了内存泄漏,需 要作进一步的检测。内存块泄漏阀值是从空间上判定内存是否发生泄漏的准 贝IJ。当在相同的位置申请的内存块数大于等于该阀值,并且在使用期内都没 有释放内存块时,则判定发生了内存泄漏。检测过滤表是为了避免误判内存 泄漏而定的。检测过滤表的每个表项即为申请内存块的位置信息,对于申请 内存块而不会释放的程序则把其申请内存块的位置信息填入该表中,出现在 过滤表中申请的内存块不认为发生内存泄漏,以避免误判。
第二步,在分配内存块的时候记录申请内存块的位置信息、分配的时刻 和内存块状态(此时内存块状态置为已使用)。每一个内存块对应有一个信息 块记录申请内存块的位置信息、分配的时刻和内存块的状态。位置信息可以 通过文件名和文件的行号来表示,也可以通过一种文件的唯一标识和文件行 号来表示。内存块的状态包括但不限于空闲和已使用两种状态。在释放内存 块的时候,无需清除信息块中申请内存块的位置等信息,只是把内存块的状 态置为空闲即可。第三步,进行内存泄漏检测时,建立一个内存块信息块指针链表,遍历 全部己分配的内存块信息块,把使用时间超出使用期,并且申请内存块的位 置信息不出现在过滤表中的内存块信息块添加到该指针链表中。第四步,统计该指针链表中位置信息相同的内存块数目,当数目大于等 于内存块泄漏阀值时则判定发生了内存泄漏。泄漏的位置即为内存块信息块 中记录的申请内存块位置信息。下面对上述各部分进行详细说明。下面结合附图,对本发明做进一步的详细描述。图1是本发明所述方法的实施例流程图,具体的步骤如下第一步,定义内存块使用期为3600,单位是秒,内存块泄漏阀值为2, 检测过滤表为空。第二步,在应用程序中申请内存块的函数Alloc中记录申请内存块的代 码所在的文件名、文件行号和当前时刻到内存块信息块中。在应用程序中释 放内存块的函数Free中置内存块信息块的内存块状态为空闲。如附图2,当 程序运行到Func函数中申请内存块的代码并成功申请到内存块时,记录申请 内存块代码所在的文件名file.cpp、文件行号和当前时刻到内存块信息块中, 并置内存块信息块中的状态为已使用。在Func函数中有两处代码调用Alloc 函数,故有两个内存块信息块分别记录申请内存块的信息。内存块信息块1 记录的是file.cpp文件中第100行申请的内存块信息,内存块信息块2记录 的是file.cpp文件中第200行申请的内存块信息。当程序调用函数Free释放 内存块pDatal时,仅把内存块信息块2的状态置为空闲。在Fimc函数结束 前没有调用Free函数释放内存块pData,则pData所指向的内存块则会发生 泄漏。每调用Func函数一次则会泄漏一个内存块。第三步,遍历全部己使用的内存块信息块,并把使用时间大于等于使用
期的内存块信息块串接成一条检测链表,如附图3所不。假设建立该链表前应用程序已经调用了Func函数3次,并且Func函数中100行申请的内存块 的使用时间都已经超出了使用期3600秒。由于3次调用了Fimc函数,泄漏 了 3个内存块,故在检测链表中会出现3个在Func函数中申请的内存块信息, 如附图3中所示的内存块信息块1,内存块信息块2和内存块信息块4。假如 检测过滤表不为空,而是有一个表项为文件名是file.cpp、行号是IOO,则不 会把内存块信息块1,内存块信息块2和内存块信息块4添加到检测链表中。第四步,遍历如附图3中所示的检测链表中的内存块信息块,统计内存 块信息块中文件名、文件行号都相同的内存块数目,此时统计到文件名为 file.cpp,行号为100的内存块信息块数目为3,大于内存块泄漏阀值2,此 时判定发生了内存泄漏,泄漏的位置即为内存块信息块中记录的文件名 file.cpp,文件行号100行。综上所述,采用本发明提供的方法,能够准确的从时间上,空间上检测 出内存泄漏,而且具有很大的灵活性。内存块的使用期可以根据不同的程序 使用内存情况而定。当内存块泄漏阀值定义得比较大时,比如定义为3,适 用于检测出泄漏了大于等于3个内存块的情况。当内存块泄漏阀值定义为1 时,则只要超过了使用期则认为发生了内存泄漏。假如存在某个程序的确需 要很长时间使用内存块而不会释放,则可以把该程序申请内存块代码的位置 信息添加到检测过滤表中,以减少误判,使得判断出来的内存泄漏更准确、 实用。采用本发明提供的方法不显著增加内存块申请的时间,检测时只检测 使用时间超出了使用期的内存块,不会显著的影响系统的性能。而且该发明 不仅在通信设备的测试阶段使用,还可以在通信设备实际应用阶段使用。以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普 通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进和润 饰,这些改进和润饰应视为本发明的保护范围。
权利要求
1.一种内存泄漏的检测方法,其特征在于,具有如下步骤步骤1、定义内存块的使用期、内存块泄露阈值和检测过滤表参数,用于为内存泄露检测提供依据;步骤2、记录申请内存块的信息,用于记录内存块的使用信息;步骤3、对内存块所述参数进行泄露检测,用于检测内存是否泄露。
2. 如权利要求l所述的内存泄漏的检测方法,其特征在于, 所述内存块使用期,用于估计程序申请内存块后使用的时间; 所述内存块泄露阈值,用于从空间上判断内存是否发生泄漏; 所述检测过滤表,用于避免误判内存泄漏。
3. 如权利要求2所述的内存泄漏的检测方法,其特征在于,所述记录申 请内存块的信息包括申请内存块的位置信息、分配的时刻和内存块使用状态。
4. 如权利要求3所述的内存泄漏的检测方法,其特征在于,所述位置信 息使用文件名和文件行号表示,或者使用文件的唯一标识和文件行号表示, 所述内存块的使用状态包括空闲和已使用。
5. 如权利要求4所述的内存泄漏的检测方法,其特征在于,所述检测过 滤表记录程序不会释放的内存块的位置信息。
6. 如权利要求1至5之一所述的内存泄漏的检测方法,其特征在于,释 放内存块时,将该内存块的使用状态置为空闲。
7. 如权利要求1至5之一所述的内存泄漏的检测方法,其特征在于,所 述对内存块进行检测包括如下具体步骤步骤71、建立内存块信息块指针链表,将符合条件的内存块信息添加到 所述内存块信息块指针链表中;步骤72、统计所述指针链表中所述位置信息相同的内存块数目,并与所 述内存块泄露阈值进行比较,判断是否发生了内存泄露。
8. 如权利要求7所述的内存泄漏的检测方法,其特征在于,所述步骤 71中,所述添加到内存块信息块指针链表中的内存块信息包括所述内存块的 分配时刻、位置信息和使用状态。
9. 如权利要求7所述的内存泄漏的检测方法,其特征在于,所述步骤 71中,所述符合条件的内存块是指该内存块的使用时间超过所述使用期,并 且该内存块的位置信息没有出现在所述检测过滤表中。
10.如权利要求7所述的内存泄漏的检测方法,其特征在于,所述步骤 72中,如果所述指针链表中所述位置信息相同的内存块数目大于或者等于所 述内存块泄露阈值,则发生了内存泄露,且发生泄漏的位置即为内存块信息 块中记录的内存块位置信息。
全文摘要
本发明涉及一种内存泄漏的检测方法,具有如下步骤步骤1.定义内存块的使用期、内存块泄露阈值和检测过滤表参数,用于为内存泄露检测提供依据;步骤2.记录申请内存块的信息,用于记录内存块的使用信息;步骤3.对内存块所述参数进行泄露检测,用于检测内存是否泄露。采用本发明提供的方法,能够准确的从时间上,空间上检测出内存泄漏,而且具有很大的灵活性。
文档编号G06F11/34GK101162436SQ200610113759
公开日2008年4月16日 申请日期2006年10月13日 优先权日2006年10月13日
发明者李小伟, 黄海伦 申请人:中兴通讯股份有限公司