一种嵌入式系统内存泄露的检测方法

文档序号:6586279阅读:208来源:国知局
专利名称:一种嵌入式系统内存泄露的检测方法
技术领域
本发明涉及一种内存处理方法,具体地说,是涉及一种对嵌入式系统内存泄露进
行检测的方法,属于嵌入式系统技术领域。
背景技术
对于内存泄露,一般是指堆内存的泄露。堆内存,是指应用程序在运行过程中,利 用一些特定的函数从堆中分配的、而在使用完毕后再通过特定的函数予以释放的内存。如 果应用程序在使用完堆内存后没有将其释放,则这块内存就不能被再次使用,就认为这块 内存泄露了。 根据其发生的方式来分,内存泄露可以分为下述4类 (1)常发性内存泄露发生内存泄露的函数代码会被多次执行到,每次被执行的 时候都会导致一块内存泄露。 (2)偶发性内存泄露发生内存泄露的函数代码只有在某些特定环境或操作过程 下才会发生。 常发性和偶发性是相对的,对于特定的环境,偶发性也许就会变成常发性。
(3) —次性内存泄露发生内存泄露的函数代码只会被执行一次;或者由于算法 上的缺陷,导致总会有一块且仅有一块内存发生泄露。比如,在类的构造函数中分配内存, 在析构函数中却没有释放该内存,所以内存泄露只会发生一次。
(4)隐式内存泄露程序在运行过程中不停地分配内存,但是直到结束的时候才
释放内存。严格地说,此时并没有发生内存泄露,因为最终程序释放了所有申请的内存。但
是对于一个服务器程序来说,需要运行几天、几周甚至几个月,若不及时释放内存,也可能
导致最终耗尽系统的所有内存,因此,对于这类内存泄露,称之为隐式内存泄露。
内存泄露时,将会导致内存空间的浪费。 一个小的内存泄露可能不需要太注意,但
是若程序泄露大块内存,或者渐增式的泄露内存会引起下述现象先是系统性能降低,然后
引起复杂的内存耗尽错误;最坏的情况是,一个内存泄露程序可能用完了非常多的内存而
引起其他程序出错,而用户不能知道错误到底来自哪里。另外,一个看上去危害不大的内存
泄露,可能是另一个问题的先兆。因此,要尽量避免内存泄露现象的发生。 要避免内存泄露,除了要求编程人员具有良好的编码习惯和编码规范之外,关键
还要从程序代码上入手,对内存泄露进行高效、可靠的检测。目前常用的内存泄露检测方法
是为内存分配函数和内存释放函数提供debug版本,跟踪内存的分配和释放;程序调试人
员手动调用或者在程序结束时自动调用内存泄露信息显示函数,根据跟踪结果显示内存地
址、内存块的大小及内存中的内容等信息。但是,这种传统的内存泄露检测方法在嵌入式系
统中使用时存在下述缺陷 第一,嵌入式系统中的软件一般是启动后一直在运行,通过断电方式结束程序的
运行,因此,无法预知程序何时结束,也就无法执行相应的内存泄露检测程序。
第二,嵌入式系统中内存的分配和释放,不一定是在同一个文件中,也不一定是在
3同一个模块中,也可能分配后永远不释放,这依赖于设计时的逻辑,而内存泄露检测模块无 法知晓。因此,内存检测时无法提供准确的内存泄露信息,可能会发生内存泄露误报的问 题。 第三,在嵌入式系统中无法检测内存误释放的问题,由于指针使用错误,有可能会 在不应该释放内存的地方进行了释放,从而可能导致程序运行错误或者崩溃。

发明内容
本发明针对现有技术中的内存泄露检测方法在嵌入式系统软件开发过程中存在 的配置不灵活、使用不方便、容易发生内存泄露误报和误释放的问题,提供了一种内存泄露 的检测方法,利用该方法,可实现对嵌入式系统内存泄露的分区检测,方法使用灵活、检测 效率较高。 为解决上述技术问题,本发明采用以下技术方案予以实现 —种嵌入式系统内存泄露的检测方法,包括跟踪内存分配的过程和跟踪内存释放 的过程的步骤,以及根据跟踪结果进行内存泄露检测的步骤; 所述内存分配的过程包括通过内存分配函数的参数获取该内存分配函数分配的
内存所对应的内存释放范围类型信息及内存释放位置信息并进行保存的步骤; 所述内存释放的过程包括根据所述的内存释放范围类型信息及内存释放位置信
息判断内存是否有效,并在内存有效时释放该内存的步骤。 根据本发明,所述内存释放范围类型具体包括下述8类本函数内,本文件内,本
文件夹内,本应用程序中,其他函数内,其他文件内,其他文件夹内以及不释放。 根据本发明,在所述内存释放范围类型为本函数内、本文件内、本文件夹内、本应
用程序中及不释放时,所述内存释放位置的值无效;在所述内存释放范围类型为其他函数
内时,所述内存释放位置的值为相应的函数名称;在所述内存释放范围类型为其他文件内
时,所述内存释放位置的值为相应的文件名称;在所述内存释放范围类型为其他文件夹内
时,所述内存释放位置的值为相应的文件夹名称。 根据本发明,为便于跟踪内存泄露的位置及发生泄露的条件,所述内存分配的过 程还包括下述步骤 通过内存分配函数的参数获取并保存内存分配函数所在的文件名、代码行号及函 数名信息; 查找与所述文件名和代码行号相对应的最大内存分配编号,将所述最大内存分配 编号加l,作为当前分配的内存的内存分配编号。 根据本发明,为有效防止隐式内存泄露造成的内存消耗,在所述跟踪内存分配的 过程中,若检测到内存分配编号超过设定值,则输出相应的报警信号。 根据本发明,为便于使用,所述内存释放范围类型信息、内存释放位置信息、内存
分配函数所在的文件名、代码行号及函数名信息以数据结构的形式存在于内存中。 根据本发明,为提高数据的安全性和管理的高效性,所述数据结构中还包括有校
验码,所述校验码的值在内存分配过程中根据所述内存释放范围类型信息、内存释放位置
信息、内存分配函数所在的文件名、代码行号及函数名的信息来确定,并在所述内存释放过
程中用于校验数据结构中的信息的有效性。
4
根据本发明,在所述内存释放的过程中,在根据所述的内存释放范围类型信息及 内存释放位置信息判断内存是否有效的步骤之前,首先根据所述数据结构中的校验码判断 数据结构中的信息是否正确;在数据结构中的信息正确后,再执行所述判断内存是否有效 的步骤。若根据校验码判断数据结构中的信息不正确,则认为不在管理范围之内,返回错误信息。 根据本发明,为便于跟踪内存分配和内存释放,所述数据结构中还包括有内存分 配函数所分配的内存的内存指针信息及内存大小的信息。 其中,所述内存分配函数所分配的内存包括程序本身所需的实际内存和所述数据 结构所占用的内存。 与现有技术相比,本发明的优点和积极效果是 1、本发明在内存分配过程中记录内存分配函数分配的内存所对应的内存释放范 围类型信息及内存释放位置信息,在内存释放过程中根据该内存释放范围类型信息和内存 释放位置信息判断是否释放内存,因此,内存泄露检测模块可以及时有效地跟踪内存应该 在何处释放、是否在不该释放的地方释放了内存等信息,并提供准确的内存泄露信息,有效 避免了嵌入式系统中内存泄露的误报、误释放等问题的发生,提高了检测效率和检测准确 率。 2、通过对内存释放范围类型及内存释放位置的跟踪,可以实现在不同文件内、不 同文件夹内及不同应用程序中的内存泄露检测,从而实现了对内存泄露的分区检测,提高 了检测的灵活性。 3、由于内存泄露检测模块可以及时有效地跟踪内存分配和内存释放过程,因此, 可以在嵌入式系统程序运行过程中的任一时刻根据需要进行内存泄露的分区检测,有效解 决了现有内存泄露检测需要在程序结束时进行、而嵌入式系统一般不存在程序结束因而无 法进行内存泄露检测的问题。


图1是本发明所述嵌入式系统内存泄露检测方法一个实施例的基本流程图;
图2是图1实施例中内存分配过程的具体流程图;
图3是图1实施例中内存释放过程的具体流程图。
具体实施例方式
下面结合附图对本发明作进一步详细的说明。 由于嵌入式系统软件一般是启动后一直运行,不存在程序结束,因此,若采用现有 的内存泄露检测方法,不仅使用不方便,而且容易出现误报、误释放等问题。针对嵌入式系 统的上述特点,本发明提供了一种应用于嵌入式系统的内存泄露检测方法,该方法的核心 是在内存分配过程中保存内存分配函数分配的内存所对应的内存释放范围类型信息及内 存释放位置信息,而在内存释放过程中,将根据所述内存释放范围类型信息和内存释放位 置信息判断释放的内存释放有效,只在内存有效时才进行内存的释放。在内存分配及内存 释放过程中,采用内存泄露检测模块来跟踪内存分配过程和内存释放过程,则内存泄露检 测模块可以及时有效地跟踪内存应该在何处释放、是否在不该释放的地方释放了内存等信息,并提供准确的内存泄露信息,有效避免了嵌入式系统中内存泄露的误报、误释放等问题 的发生,提高了检测效率和检测准确率。 图1示出了本发明所述嵌入式系统内存泄露检测方法一个实施例的基本流程图。 在该实施例中,内存释放范围类型信息和内存释放位置信息以数据结构的形式存在,用于 记录内存块的相关信息。当然,该数据结构中还包含其他一些与分配的内存有关的信息, 利用该信息,便于内存泄露检测模块对内存的跟踪和泄露的检测。该实施例的基本流程如 下 Sl :建立数据结构,以记录内存块的相关信息。 该实施例为便于内存泄露检测模块及时、有效地跟踪内存的分配和释放,以实现
对嵌入式系统内存泄露的准确检测,定义了一个内存泄露检测过程使用的数据结构,用来
记录内存块的相关信息。该数据结构中包括下述内容 分配的内存的内存指针用于标识分配到的内存地址; 分配的内存的内存大小即分配的内存所占用的内存空间; 内存分配函数所在的文件名路径用于标识内存分配函数所在的文件名信息;该 值可以通过宏获得; 内存分配函数所在的代码行号该值可以通过宏获得; 内存分配函数所在的函数名该值可以通过宏获得,用于标识内存分配函数在源 代码中所在的位置; 内存分配编号用于标识所对应的内存是第几次分配操作。在一个运行的程序中, 一个内存分配操作可能被调用多次,但是内存泄露可能只发生在其中的某次操作中。为了 确认问题所在,除了要知道泄露的位置之外,还必须要知道发生泄露的条件,即内存泄露是 在哪次内存分配中发生的,而通过跟踪内存分配编号就可以解决该问题。此外,由于存在隐 式内存泄露,为了防止一个地方不断进行内存分配,嵌入式系统会随时对内存分配编号进 行检查;如果检测到内存分配编号超过设定值,则输出相应的报警信号。 内存释放范围类型由于嵌入式系统不存在程序结束的过程,内存泄露检测模块 无法知道分配的内存应该在何处释放,所有就可能不知道已经分配的内存释放是泄露的内 存,也无法知道是否在不该释放的地方释放了内存,从而容易产生误报和误释放的问题。为 解决该问题,同时也为了使用方便,该实施例在数据结构中增加了"内存释放范围类型",且 根据嵌入式系统的程序特点,将内存释放范围类型划分为下述8类本函数内,本文件内, 本文件夹内,本应用程序中,其他函数内,其他文件内,其他文件夹内以及不释放。
内存释放位置内存释放位置是对上述内存释放范围类型的补充,目的是进一步 防止误报和误释放的问题。在该实施例中,在所述内存释放范围类型为本函数内、本文件 内、本文件夹内、本应用程序中及不释放时,所述内存释放位置的值无效;在所述内存释放 范围类型为其他函数内时,所述内存释放位置的值为相应的函数名称;在所述内存释放范 围类型为其他文件内时,所述内存释放位置的值为相应的文件名称;在所述内存释放范围 类型为其他文件夹内时,所述内存释放位置的值为相应的文件夹名称。 校验码用于校验整个数据结构中的信息是否有效,可以选用一个固定的32位整 数。如果根据校验码判断数据结构中的信息不正确,则认为不在管理范围之内,返回错误信 息,以提高数据的安全性和管理的高效性。
6
S2 :跟踪内存分配过程及内存释放过程。内存分配过程和内存释放过程可分别参 考图2和图3的流程图。
S3 :调用内存泄露检测模块进行内存泄露检测。 由于可以通过上述设定的数据结构及时有效地跟踪内存分配过程及内存释放过 程,避免了产生误报和误释放的问题,因此,在嵌入式系统软件运行过程中,可以根据需要 随时对内存泄露进行不同文件内、不同文件夹内及不同应用程序中的分区检测。例如,可以 在一个模块的退出函数中调用内存泄露检测模块中的显示函数对该模块进行内存泄露检 S4 :输出内存泄露检测结果。 内存泄露检测的关键是要跟踪内存分配和内存释放的过程,获得内存的分配与释 放的相关信息,以便于在调用内存泄露检测显示函数时能够正确获得内存泄露的信息。因 此,对内存分配过程及内存释放过程中内存信息的记录显得尤为重要。图2示出了图l实 施例中内存分配过程的具体流程图,图3示出了图1实施例中内存释放过程的具体流程图。 下面结合上述的数据结构,分别描述内存分配过程和内存释放过程的流程。
如图2所示,该实施例内存分配过程的具体流程如下 S201 :通过内存分配函数参数获取内存分配函数所在的文件名、代码行号及函数 名信息,并保存 S202 :通过内存分配函数参数获取内存分配函数分配的内存对应的内存释放范围 类型及内存释放位置信息,并保存。 S203 :查找与所述文件名和代码行号相对应的最大内存分配编号。 S204 :将查找到的最大内存分配编号加l,作为当前分配的内存的内存分配编号。 S205 :确定校验码的值,并保存。所述检验码为一个32位无符号整数,其值根据所
述内存释放范围类型信息、内存释放位置信息、内存分配函数所在的文件名、代码行号及函
数名的信息来确定。 S206 :利用内存分配函数分配相应的内存。所分配的内存的大小为用户指定的内 存大小加上数据结构所占内存的大小。 S207 :判断内存分配是否成功。在分配成功时,执行步骤S208 ;若分配失败,转至 步骤S210。 S208 :在内存分配成功后,保存所分配的内存的内存指针及内存大小。 S209 :额外保存当前内存分配函数所在的文件名、代码行号及当前内存分配编号
信息,以便于下次内存分配时计算相应的内存分配编号。 S210 :若内存分配失败,则返回空操作。
如图3所示,该实施例内存释放过程的具体流程如下 S301 :通过内存释放函数的参数获取内存释放函数所在的文件名、代码行号及函 数名信息,以及内存释放函数待释放的内存地址。
S302 :根据待释放的内存地址计算数据结构在内存中的位置。 结合图2流程中的内存分配过程,数据结构在内存中的地址应该为待释放的内存 地址减去数据结构所占内存的大小而得到的一个内存地址。 S303:根据数据结构地址获得数据结构,然后根据数据结构中的校验码判断数据结构的正确性。 S304 :判断数据结构是否正确。若正确,执行步骤S305 ;若不正确,转至步骤S311。
S305:在数据结构正确后,根据数据结构中的内存释放范围类型信息和内存释放 位置信息判断当前内存的有效性。 S306 :判断内存是否有效。在内存有效时,执行步骤S307 ;在内存无效时,转至步 骤S311。 S307 :判断是否为用户指定的内存和数据结构。为进一步防止内存的误释放,在内 存有效时,再根据内存释放函数所在的文件名、代码行号及函数名信息以及数据结构中的 内存释放范围类型及内存释放位置信息判断要释放的内存和数据结构是否为用户指定的 内存和数据结构。在判断结果正确时,执行步骤S308 ;若判断结果错误,转至步骤S311。
S308:在当前内存为用户指定的内存、当前数据结构为指定的数据结构时,释放该 指定的内存和数据结构。 S309 :判断释放是否成功。若释放成功,执行步骤S310 ;若释放失败,转至步骤 S311。 S310:返回释放成功。
S311 :返回释放失败。 采用上述实施例所述的内存分配过程和内存释放过程,可以有效避免误报和误释 放的问题。内存泄露检测模块通过对所述内存分配过程及所述内存释放过程进行跟踪,从 而能够正确检测内存泄露信息,而且,可以在嵌入式系统程序运行的任一时刻进行内存泄 露的分区检测,有效解决了目前嵌入式系统内存泄露检测过程存在的使用不便、检测效率 低的问题。 当然,以上所述仅是本发明的一种优选实施方式而已,应当指出,对于本技术领域 的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改 进和润饰也应视为本发明的保护范围。
权利要求
一种嵌入式系统内存泄露的检测方法,包括跟踪内存分配的过程和跟踪内存释放的过程的步骤,以及根据跟踪结果进行内存泄露检测的步骤;其特征在于,所述内存分配的过程包括通过内存分配函数的参数获取该内存分配函数分配的内存所对应的内存释放范围类型信息及内存释放位置信息并进行保存的步骤;所述内存释放的过程包括根据所述的内存释放范围类型信息及内存释放位置信息判断内存是否有效,并在内存有效时释放该内存的步骤。
2. 根据权利要求1所述的嵌入式系统内存泄露的检测方法,其特征在于,所述内存释 放范围类型包括本函数内,本文件内,本文件夹内,本应用程序中,其他函数内,其他文件 内,其他文件夹内以及不释放。
3. 根据权利要求2所述的嵌入式系统内存泄露的检测方法,其特征在于,在所述内存 释放范围类型为本函数内、本文件内、本文件夹内、本应用程序中及不释放时,所述内存释 放位置的值无效;在所述内存释放范围类型为其他函数内时,所述内存释放位置的值为相 应的函数名称;在所述内存释放范围类型为其他文件内时,所述内存释放位置的值为相应 的文件名称;在所述内存释放范围类型为其他文件夹内时,所述内存释放位置的值为相应 的文件夹名称。
4. 根据权利要求1至3中任一项所述的嵌入式系统内存泄露的检测方法,其特征在于, 所述内存分配的过程还包括下述步骤通过内存分配函数的参数获取并保存内存分配函数所在的文件名、代码行号及函数名 信息;查找与所述文件名和代码行号相对应的最大内存分配编号,将所述最大内存分配编号 加l,作为当前分配的内存的内存分配编号。
5. 根据权利要求4所述的嵌入式系统内存泄露的检测方法,其特征在于,在所述跟踪 内存分配的过程中,若检测到内存分配编号超过设定值,则输出相应的报警信号。
6. 根据权利要求4所述的嵌入式系统内存泄露的检测方法,其特征在于,所述内存释 放范围类型信息、内存释放位置信息、内存分配函数所在的文件名、代码行号及函数名信息 以数据结构的形式存在于内存中。
7. 根据权利要求6所述的嵌入式系统内存泄露的检测方法,其特征在于,所述数据结 构中还包括有校验码,所述校验码的值在内存分配过程中根据所述内存释放范围类型信 息、内存释放位置信息、内存分配函数所在的文件名、代码行号及函数名的信息来确定,并 在所述内存释放过程中用于校验数据结构中的信息的有效性。
8. 根据权利要求7所述的嵌入式系统内存泄露的检测方法,其特征在于,在所述内存 释放的过程中,在根据所述的内存释放范围类型信息及内存释放位置信息判断内存是否有 效的步骤之前,首先根据所述数据结构中的校验码判断数据结构中的信息是否正确;在数 据结构中的信息正确后,再执行所述判断内存是否有效的步骤。
9. 根据权利要求7所述的嵌入式系统内存泄露的检测方法,其特征在于,所述数据结 构中还包括有内存分配函数所分配的内存的内存指针信息及内存大小的信息。
10. 根据权利要求l所述的嵌入式系统内存泄露的检测方法,其特征在于,所述内存分 配函数所分配的内存包括程序本身所需的实际内存和所述数据结构所占用的内存。
全文摘要
本发明公开了一种嵌入式系统内存泄露的检测方法,包括跟踪内存分配的过程和跟踪内存释放的过程的步骤,以及根据跟踪结果进行内存泄露检测的步骤;所述内存分配的过程包括通过内存分配函数的参数获取该内存分配函数分配的内存所对应的内存释放范围类型信息及内存释放位置信息并进行保存的步骤;所述内存释放的过程包括根据所述的内存释放范围类型信息及内存释放位置信息判断内存是否有效,并在内存有效时释放该内存的步骤。利用本发明所述的内存泄露检测方法,可实现对嵌入式系统内存泄露的分区检测,方法使用灵活、检测效率较高。
文档编号G06F11/36GK101763305SQ20091025647
公开日2010年6月30日 申请日期2009年12月29日 优先权日2009年12月29日
发明者田友强 申请人:青岛海信宽带多媒体技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1