一种内存泄露的定位方法及装置的制作方法

文档序号:6601001阅读:214来源:国知局
专利名称:一种内存泄露的定位方法及装置的制作方法
技术领域
本发明涉及软件检测领域,尤其涉及一种内存泄露的定位方法及装置。
背景技术
在计算机科学中,内存泄漏是指由于疏忽或错误造成程序未能释放已经不再使用 的内存的情况。内存泄漏会因为减少可用内存的数量从而降低计算机的性能,在最糟糕的 情况下,过多的可用内存被分配掉会导致全部或部分设备停止正常工作,或者应用程序崩 溃。VLD(Visual Leak Detector,Visual 检漏仪)是一款用于 Visual C++的免费内 存泄露检测工具,VLD通过对程序本身的内存申请函数进行监测,并判断所述内存申请函数 对应的内存是否有释放,来检测是否存在内存泄露,并定位到所在代码行。但是,由于VLD是基于对内存申请函数的监测来实现内存检漏与定位,所以当内 存泄露是由于非代码引起的或者其他一些非常规情况引起的情况下,VLD并不能够很好的 完成内存泄露的检测与定位。

发明内容
本发明所要解决的问题在于,提供一种内存泄露的检测方法及装置,根据被测程 序运行前后所消耗的内存值的记录、计算与判断,判定被测程序是否出现内存泄露,并在出 现内存泄露时,定位该被测程序。为了解决上述问题,本发明实施例提供了一种内存泄露的定位方法,包括记录被测程序运行前的初始内存值,以及所述被测程序运行退出后的剩余内存 值;根据所述初始内存值和所述剩余内存值,计算所述被测程序运行过程中所消耗的 消耗内存值;根据所述消耗内存值,判定所述被测程序是否存在内存泄露,当判定结果为是时, 定位所述被测程序。相应的,本发明实施例提供了一种内存泄露的定位装置,包括记录单元,用于记录被测程序运行前的初始内存值,以及所述被测程序运行退出 后的剩余内存值;计算单元,用于根据所述记录单元记录的初始内存值和所述剩余内存值,计算所 述被测程序运行过程中所消耗的消耗内存值;判定单元,用于根据所述计算单元计算得到的消耗内存值,判定所述被测程序是 否存在内存泄露;定位单元,用于当所述判定单元判定所述被测程序存在内存泄露时,定位所述被 测程序。本发明通过对程序运行过程中的内存的变化情况,来判定所述程序是否存在内存泄露,以在存在内存泄露时定位该程序,方便用户了解到存在内存泄露的位置。本发明实施 例是基于对内存变化情况的记录、计算以及判定来检测内存泄露并定位,并非基于所述程 序本身进行内存泄露的检测与定位,从而不仅能够实现由程序代码本身引起的内存泄露的 检测与定位,而且实现了当内存泄露是由于非程序代码引起的或者其他一些非常规情况引 起的情况下,仍然能够很好的完成内存泄露的检测与定位。


图1是本发明实施例的内存泄露的定位装置的结构组成示意图;图2是本发明内存泄露的定位方法的第一实施例流程示意图;图3是本发明内存泄露的定位方法的第二实施例流程示意图。
具体实施例方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完 整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于 本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他 实施例,都属于本发明保护的范围。图1是本发明实施例的内存泄露的定位装置的结构组成示意图,如图1所示,该装 置包括记录单元1,用于记录被测程序运行前的初始内存值,以及所述被测程序运行退出 后的剩余内存值。在运行被测程序前,可根据需要对测试环境进行检测即对移动终端系统 进行检测,当确定测试环境无内存泄露时,即可运行所述被测程序,以检测所述被测程序是 否引起内存泄露。所述记录单元1在运行所述被测程序之前,记录终端的内存的初始内存 值,并当所述被测程序运行退出后,记录终端内存此时的剩余内存值。所述记录单元1可根 据需要,记录所述被测程序每一次运行前的初始内存值以及相应的每一次所述被测程序运 行退出后的剩余内存值。例如,当用户运行所述被测程序n次时,所述记录单元1相应的记 录第一次运行前的初始内存值dwBeginl,第一次运行退出后的剩余内存值dwEndl ;第二 次运行前的初始内存值dWBegin2,第二次运行退出后的剩余内存值dwEnd2,直到第n次的 初始内存值dwBeginn和剩余内存值dwEndn,此时,n值越大越好。计算单元2,用于根据所述记录单元1记录的初始内存值和所述剩余内存值,计 算所述被测程序运行过程中所消耗的消耗内存值。所述计算单元2可将所述记录单元1 记录的初始内存值以及剩余内存值进行减法运算,得到所述消耗内存值,例如当记录的 初始内存值为128M,剩余内存值为120M,则可以计算得到消耗内存值为8M。另外,当所 述记录单元1记录的相应内存值包括多个时,如当记录的相应的内存值包括dwBeginl、
dwEndl, dwBegin2> dwEnd2> ......、 dwBeginn> dwEndn Ijf^if2 )(寸—flj禾呈
次运行过程中的消耗内存值的计算方式为AdwMeml = dwBeginl-dwEndl, A dwMem2 =
dwBegin2-dwEnd2, ......, A dwMemn = dwBeginn-dwEndn,同时,还可以根据所述 dwBeginl
和dwEndn,计算得到总的消耗内存值A dwMemTotal = dwBeginl-dwEndn。判定单元3,用于根据所述计算单元2计算得到的消耗内存值,判定所述被测程序 是否存在内存泄露。其中,可当所述消耗内存值不为零时,判定所述被测程序存在内存泄
4露,如上述的当所述计算单元2计算得到的消耗内存值为8M时,则说明所述被测程序运行 后有8M内存未被释放,存在内存泄露;若所述消耗的内存值为零时,则说明所述被测程序 运行后,内存均相应的释放,不存在内存泄露的问题。在实际情况中,由于误差的存在可能会影响所述判定单元3的判断,导致误判的 发生,可通过多次运行被测程序的方式进行相应的内存泄露的判定来避免误判的发生。运 行多次被测程序,所述记录单元1和所述计算单元2进行多次运行过程中相应的内存值的 记录与计算,得到相应的每一次运行消耗内存值和/或多次运行后总的消耗内存值(所述 每一次运行消耗内存值和/或多次运行后总的消耗内存值的获取如上述),分析所述每一 次运行消耗内存值和/或总的消耗内存值,若得到的多次运行后的每一次消耗内存值全部 或者大部分均 不为零时,或者多次运行后的总的消耗内存值不为零且随着运行次数的增加 而加大,或者每一次运行消耗内存值全部或者大部分均不为零且所述总的消耗内存值不为 零且随着运行次数的增加而不断加大,则所述判定单元3可判定存在内存泄露;否则,不存 在内存泄露。定位单元4,用于当所述判定单元3判定所述被测程序存在内存泄露时,定位所述 被测程序。一旦判定被测程序出现内存泄露,则定位该被测测序,以使用户了解到是那段程 序存在内存泄露。进一步的,如图1所示,该装置还包括显示单元4,用于显示程序运行时的内存使用信息,并发出多次运行所述程序的提 示。在所述被测程序运行过程中,可通过所述显示单元4实时显示程序运行时的内存使用 信息,如每一次被测程序运行前的初始内存值以及运行后的剩余内存值,以及消耗内存值 等,并显示需重复多次运行所述被测程序等提示以提示用户需对被测程序反复运行以避免 误判。所述被测程序可以是主程序、主程序中的功能程序、功能程序中的类程序中的任 意一种或多种,通过运行相应的被测程序并采用所述内存泄露的定位装置进行相应的记 录,计算,判定和定位,可以使得用户清楚的知道导致内存泄露的是那个主程序,或者是主 程序中的某段功能程序,或者主程序某段功能程序中的某个类程序,用户可进行相应的修 改等处理,避免内存泄露的发生。用户可采用所述内存泄露的定位装置依次检测程序运行时的内存情况,若所述主 程序出现内存泄露,则定位所述主程序;定位所述主程序后,检测所述主程序中的各功能程 序运行时的内存情况,若一个或者多个功能程序出现内存泄露时,则定位相应的存在内存 泄露的功能程序;定位到功能程序后,检测每一个被定位的所述功能程序中的各个类程序 运行时的内存情况,若一个或者多个类程序出现内存泄露时,则可定位到相应的存在内存 泄露的类程序。用户只需对定位到的相应的类程序进行修改等处理即可避免内存泄露的产 生,而不需要对整个程序进行检查修改。通过上述实施例的描述,本发明实施例具有以下优点通过检测程序运行过程中 的内存的变化情况,来判定所述程序是否存在内存泄露,以在存在内存泄露时定位该程序, 方便用户了解到存在内存泄露的位置。本发明实施例是基于对内存值的变化情况进行内存 泄露的检测并定位,并非基于所述程序本身进行内存泄露的检测与定位,从而不仅能够实 现由程序代码本身引起的内存泄露的检测与定位,而且实现了当内存泄露是由于非程序代码引起的或者其他一些非常规情况引起的情况下,仍然能够很好的完成内存泄露的检测与 定位。图2是本发明内存泄露的定位方法的第一实施例流程示意图,如图2所示,该方法 包括S201 记录被测程序运行前的初始内存值,以及所述被测程序运行退出后的剩余 内存值。在被测程序运行以及进行相应内存记录前,可进行测试环境(即移动终端系统)有 无内存泄露的检测,当确定测试环境无内存泄露时,进行被测程序的运行以及相应内存的 记录。具体的,可记录所述被测程序每一次运行前的初始内存值以及相应的每一次所述被 测程序运行退出后的剩余内存值。例如,当用户运行所述被测程序n次时,相应的记录为 第一次运行前的初始内存值dwBeginl,第一次运行退出后的剩余内存值dwEndl ;第二次运 行前的初始内存值dWBegin2,第二次运行退出后的剩余内存值dwEnd2、……、第n次运行 前的初始内存值dwBeginn,第n次运行退出后的剩余内存值dwEndn。S202 根据所述初始内存值和所述剩余内存值,计算所述被测程序运行过程中所 消耗的消耗内存值。通过将步骤S201中记录的初始内存值与剩余内存值进行减法运算, 得到所述消耗内存值,例如由步骤S201所列的例子得到第一消耗内存值的计算方式为 A dwMeml = dwBeginl-dwEndl,第二消耗内存值为 A dwMem2 = dwBegin2_dwEnd2,依次类 推;或者计算运行过程中总的消耗内存值AdwMemTotal = dwBeginl-dwEndn。具体的,也 可同时采用上述两种计算方式分别计算出相应的消耗内存值。S203 根据所述消耗内存值,判定所述被测程序是否存在内存泄露,当判定结果为 是时,定位所述被测程序。具体的,如步骤S202中采用第一种方式计算得到的消耗内存值 全部或者大部分不为零和/或采用第二种方式计算得到的总的消耗内存值不为零且随着n 值的增加而增大,可判定出现内存泄露,定位该被测程序,该被测程序即是引起内存泄露的 位置。所述被测程序可包括主程序,主程序中的各功能程序,功能程序中的各个类程序 等。采用上述3个步骤,可分别检测主程序,或者主程序中的各功能程序,或者功能程序中 的各个类程序是否出现内存泄露,并判定出现内存泄露时,定位该出现内存泄露的程序。也 可按先后顺序对主程序、所述主程序中的各功能程序、所述功能程序中的各个类程序进行 内存泄露的检测与定位,以定位到某个主程序中出现内存泄露的类程序,以方便用户修改 相应的类程序以避免内存泄露的发生,而不必对整个程序进行检查修改。采用本发明方法第一实施例,通过对程序运行过程中内存值的记录与计算,不仅 实现了由代码本身引起的内存泄露的检测与定位,而且实现了当内存泄露是由于非代码 引起的或者其他一些非常规情况引起的情况下,仍然能够很好的完成内存泄露的检测与定 位。下面以检测判定某一主函数是否存在内存泄露,并且定位到所述主程序中存在内 存泄露的类程序为例,对本发明的内存泄露的定位方法进行说明。图3是本发明内存泄露的定位方法的第二实施例流程示意图,如图3所示,该方法 包括S301 记录主程序运行前的初始内存值,以及所述主程序运行退出后的剩余内存 值,并根据所述初始内存值和所述剩余内存值计算所述主程序运行过程中消耗的消耗内存值。运行至少两次所述主程序,且运行的次数越多,可使得后续的对内存泄露的判定越准确。记录每次运行所述主程序前的初始内存值为dwBeginl、dwBegin2、……、dwBeginn,相 应的记录每次所述主程序运行退出后的剩余内存值为dwEndl、dwEnd2,……、dwEndn,将 所述初始内存值与相应的所述剩余内存值进行减法运算,即可得到相应的每次运行所述主
禾呈 白勺fflH内 Δ dwMeml = dwBeginl-dwEndU Δ dwMem2 = dwBegin2-dwEnd2> ......、
AdwMemn = dwBeginn-dwEndn ;也可以将所述主程序第一次运行前的初始内存值dwBeginl 与运行η次所述主程序退出后的剩余内存值dwEndn作减法运算,AdwMemTotal = dwBeginl-dwEndn的方式得到运行过程中总的消耗内存值AdwMemTotal。S302:根据所述消耗内存值,判断主程序是否存在内存泄露。可通过判断计 算得到的所述消耗内存值是否为零来判定所述主程序是否存在泄漏,为零时,判定不存 在内存泄露,不为零时,则判定存在内存泄露。具体的,如上述例子所述,当AdwMeml、
AdwMem2、......、Δ dwMemn全部或者大部分不为零时,和/或当Δ dwMemTotal不为零,并
且随着η值的增大相应加大时,即可判定所述主程序存在内存泄露。当判定该主程序存在 内存泄露时,执行步骤S303,若该主程序不存在内存泄露,则结束退出。S303:当判定所述主程序存在内存泄露时,分别记录定位的所述主程序中的各功 能程序运行前的初始内存值,以及所述各功能程序运行退出后的剩余内存值,根据所述初 始内存值和所述剩余内存值,分别计算所述各功能程序运行过程中所消耗的消耗内存值。 当判定所述主程序存在内存泄露时,分别运行所述主程序中的各功能程序,并对每一个功 能程序运行过程中的相应内存进行记录与计算,其中,所述记录与计算与步骤S301中的主 程序的相应内存值的记录与计算过程相同,在此不赘述。S304 根据所述消耗内存值,判断功能程序是否存在内存泄露。可通过判断计算 得到的所述消耗内存值是否为零来判定所述主程序中的各个功能程序是否存在泄漏,为零 时,判定不存在内存泄露,不为零时,则判定存在内存泄露。具体的,可能判定存在多个功能 程序存在内存泄露的情况,可分别定位到每一个存在内存泄露的功能程序。具体的,功能程 序是否存在内存泄露判定方式与步骤S302的方式相同,在此不赘述。S305:当判定所述功能程序存在内存泄露时,分别记录定位的所述功能程序中的 各个类程序运行前的初始内存值,以及所述各个类程序运行退出后的剩余内存值,根据所 述初始内存值和所述剩余内存值,分别计算所述各个类程序运行过程中所消耗的消耗内存 值。当判定功能程序存在内存泄露时,分别运行各个存在内存泄露的功能程序中的各个类 程序,并做相应的内存记录与计算,其中,所述记录与计算与步骤S301中的主程序的相应 内存值的记录与计算过程相同,在此不赘述。此时,对其他不存在内存泄露的功能程序不需 作任何处理。S306:根据所述消耗内存值,判断类程序是否存在内存泄露。可通过判断计算得到 的所述消耗内存值是否为零来判定相应的类程序是否存在泄漏,为零时,判定不存在内存 泄露,不为零时,则判定存在内存泄露。具体的,类程序是否存在内存泄露判定方式与步骤 S302的方式相同,在此不赘述。S307 定位所述类程序。定位到存在内存泄露的所述类程序后,便于用户对存在内 存泄露的类程序的修改,以消除所述主程序存在内存泄露的情况。本发明方法第二实施例,通过依次运行主程序,主程序中的功能程序,功能程序中的类程序,并记录各个运行过程中内存值的变化情况,来判定相应的主程序、主程序中的功 能程序、功能程序中的类程序是否存在内存泄漏,以定位到所述主程序中存在内存泄露的 类程序,并不需要基于所述程序本身进行内存泄露的判定与定位,从而不仅实现了由代码 本身引起的内存泄露的判定与定位,而且实现了当内存泄露是由于非代码引起的或者其他 一些非常规情况引起的情况下,仍然能够很好的完成内存泄露的检测与定位。
以上所揭露的仅为本发明的较佳实施例而已,当然不能以此来限定本发明之权利 范围,因此依本发明权利要求所作的等同变化,仍属于发明所涵盖的范围。
权利要求
一种内存泄露的定位方法,其特征在于,包括记录被测程序运行前的初始内存值,以及所述被测程序运行退出后的剩余内存值;根据所述初始内存值和所述剩余内存值,计算所述被测程序运行过程中所消耗的消耗内存值;根据所述消耗内存值,判定所述被测程序是否存在内存泄露,当判定结果为是时,定位所述被测程序。
2.如权利要求1所述的方法,其特征在于,所述根据所述初始内存值和所述剩余内存 值,计算所述被测程序运行过程中所消耗的消耗内存值的步骤之后,还包括显示所述被测程序运行时的内存使用信息,并提示是否需要多次运行所述被测程序。
3.如权利要求1或2所述的方法,其特征在于,所述被测程序包括主程序、主程序中的 功能程序、功能程序中的类程序。
4.一种内存泄露的定位装置,其特征在于,包括记录单元,用于记录被测程序运行前的初始内存值,以及所述被测程序运行退出后的 剩余内存值;计算单元,用于根据所述记录单元记录的初始内存值和所述剩余内存值,计算所述被 测程序运行过程中所消耗的消耗内存值;判定单元,用于根据所述计算单元计算得到的消耗内存值,判定所述被测程序是否存 在内存泄露;定位单元,用于当所述判定单元判定所述被测程序存在内存泄露时,定位所述被测程序。
5.如权利要求4所述的装置,其特征在于,还包括显示单元,用于显示所述被测程序运行时的内存使用信息,并显示是否需要多次运行 所述被测程序的提示。
6.如权利要求4或5所述的方法,其特征在于,所述被测程序包括主程序、主程序中的 功能程序、功能程序中的类程序。
全文摘要
本发明提供了一种内存泄露的定位方法,包括记录被测程序运行前的初始内存值,以及所述被测程序运行退出后的剩余内存值;根据所述初始内存值和所述剩余内存值,计算所述被测程序运行过程中所消耗的消耗内存值;根据所述消耗内存值,判定所述被测程序是否存在内存泄露,当判定结果为是时,定位所述被测程序。相应的,本发明提供了一种内存泄露的定位装置,采用本发明,不仅能够实现由代码本身引起的内存泄露进行判定和定位,而且当内存泄露是由于非代码引起的或者其他一些非常规情况引起的情况下,仍然能够很好的完成内存泄露的检测与定位。
文档编号G06F11/22GK101819549SQ201010150939
公开日2010年9月1日 申请日期2010年4月13日 优先权日2010年4月13日
发明者刘伟 申请人:东莞宇龙通信科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1