一种软件内存泄露的检查方法

文档序号:6580212阅读:420来源:国知局
专利名称:一种软件内存泄露的检查方法
技术领域
本发明涉及软件性能的测试方法,具体地说涉及到软件内存泄露的检查方法。
本发明的目的在于提供一种成本较低、能够在软件在线运行时进行检查的软件内存泄露的检查方法。
为达到上述目的,本发明提供的软件内存泄露的检查方法,包括a.确定应用程序申请的内存块,以及所申请的不同内存块被占用的时间;b.在应用程序运行时,记录其申请内存块和释放内存块的信息;c.确定超过占用时间尚未释放的内存块,通过上述内存块确定应用程序的内存泄露点。
所述方法还包括定义内存块记录表,以记录应用程序申请内存块和释放内存块的信息。
设置内存块计数器,用于对应用程序申请和释放的内存块进行管理。
上述方法通过在应用程序中嵌入内存泄露检查模块实现。
由于本发明在应用程序运行时,记录其申请内存块和释放内存块的信息,通过确定超过占用时间尚未释放的内存块来确定软件的内存泄露点,上述方法的实现可以通过在应用程序中嵌入专用的内存泄露模块完成,这样,采用本发明的方法不但适合对应用程序的内存泄露进行在线检查,还由于在应用程序运行时仅记录其申请内存块和释放内存块的信息,对应用程序具有较小地影响,且易于实现和成本低廉;因此,采用本发明有利于在应用程序运行过程中对可能产生的内存泄露进行长期检测,有助于发现一些实际环境下才出现的或者较隐蔽的内存泄漏错误;同时,通过专用的控制模块对内存泄露检查模块进行控制,使得内存泄露检查的各个步骤时间长短(主要是等待释放的状态或步骤的时长)得以控制,从而可以适应占用时长不同的内存块。另外,使用本方法进行的内存泄漏检查可以随时启动和停止,从而使检查对应用程序的影响可以得到进一步的控制,例如可以避开程序的事务繁忙期,在程序空闲时启动检查,或者缩短检查的时长等等。


图1是本发明所述方法的实施例流程图。图1所述方法的实质,是通过在应用程序中嵌入一个内存泄漏检查模块,使应用程序中所有的内存申请和释放操作都通过该模块进行,再通过该模块记录应用程序申请和释放的内存块的地址、时间等信息,来实现对内存使用状况的监视,从而完成应用程序内存泄露的检查。
按照图1实施本发明,首先经步骤1设置一个内存泄漏检查模块,并将其嵌入到应用程序中,并且定义一个内存块记录表来记录应用程序其他模块所申请的内存块和释放的内存块的信息,本例中的内存块记录表为哈希表。同时还设置一个内存块计数器,用于对哈希表中的内存块进行管理;设置内存泄露检查模块的控制模块。在哈希表中记录的内存块的信息包括内存块的起始地址、内存块大小、起始时间等,还可以记录一些调试信息,如执行申请操作的代码所在的文件、行号等,以内存块的起始地址作为哈希表的关键字,由于同一进程申请的两个内存块的起始地址不可能相同,因此可以保证哈希表中的元素关键字不重复。当程序中的其它模块调用内存泄漏检查模块申请内存时,首先调用操作系统提供的接口申请内存,若申请内存成功,则在哈希表中添加一条元素,记录该内存块的信息,并增加计数器的值。若应用程序中的其它模块调用内存泄漏检查模块释放内存,则以内存块起始地址为关键字到哈希表中查找相应的记录,找到后删除该记录并减少相应的计数器的值。
步骤1设置的内存泄漏检查模块内部逻辑结构参考图3。图3所示,在应用程序成功申请内存块后,通过内存泄露检查模块的申请内存接口在哈希表中插入一条内存块信息记录,同时更新计数器的值;在应用程序成功释放内存块后,通过内存泄露检查模块的释放内存接口在哈希表中删除一条相应的内存块信息记录,同时更新计数器的值。
在步骤1中设置的内存泄漏检查模块和应用程序其它模块以及控制模块的关系参考图2。图2所示,应用程序的其它模块在进行内存块的申请和释放操作时,都要经过内存泄露检查模块管理,即在调用操作系统进行内存块的申请和释放时要由内存泄露检查模块管理申请和释放的内存块;内存泄露检查模块由控制模块控制,并将检查结果送给控制模块分析处理。
然后在步骤2根据应用程序的具体情况确定应用程序需要申请的内存块,以及所申请的不同内存块被占用的时间,或者可能被占用的时间。接着运行应用程序,并在步骤3用哈希表记录应用程序申请内存块和释放内存块的信息;在需要进行内存泄露分析时,由控制模块在步骤4通过内存泄露检查模块确定的超过占用时间尚未释放的内存块,确定应用程序的内存泄露点。
为便于控制模块控制内存泄露检查模块进行应用程序内存泄露的检查,本例中在内存泄露检查模块另设一个状态字段来记录模块当前的状态,并据之进行相应的动作。在控制模块对内存泄漏模块进行控制进行内存泄漏检查时,通过向嵌入到应用程序中的内存泄露检查模块发送信号或消息,促使内存泄漏检测模块进行适合的状态迁移,执行内存泄漏检查操作。内存泄露检查模块的各个状态以及状态间的迁移关系如下1)空闲状态在此状态下,内存泄漏检查模块并不对内存申请和释放操作进行记录,这些操作都被透明地传递给操作系统,模块中的哈希表和计数器也处于清空状态。
2)操作记录状态在“空闲状态”下收到控制模块发来的“启动记录”信号时,进入此状态。在此状态下,内存泄漏检查模块按照前面的方法记录程序中的内存申请和释放操作。
3)等待释放状态在“操作记录状态”下收到到控制模块发来的“停止插入”信号时进入此状态。在该状态下,内存泄漏检查模块只对释放内存的操作进行记录,而不记录申请内存的操作。之所以要有这个阶段,是因为程序申请的内存块总是使用一段时间后才释放,为了完整的记录所申请的内存块的释放情况,防止出现误报,对释放操作的记录必须长于对申请操作的记录。需要说明的是,这个阶段的时间长度可以根据需要进行调整,原则是要有足够的时间让应用程序释放在“操作记录状态”中所申请的内存。经过这个阶段还未释放的内存就认为是可能的内存泄漏。例如,如果知道应用程序中申请的某部分内存资源最多使用一个小时后就会释放,首先让内存泄漏检查模块在“操作记录状态”记录一些内存申请,然后进入“等待释放状态”,等待一个小时,若还有这部分的内存资源没有释放,则可以认为是内存泄漏。
4)停止状态在“等待释放状态”下收到控制模块发来的“停止”信号时进入此状态。在该状态下,内存泄漏检查也不记录内存申请和释放操作,但哈希表和计数器中还保留着状态2和状态3时记录的数据,可以根据需要对这些数据进行查询或让内存泄漏检查模块将数据输出到文件由控制模块进行分析处理。
一次完整的内存泄漏检查中,内存泄漏检查模块要依次经过上面的四种状态,其状态的迁移参考图4。从图4可以看到,通过控制模块的控制,可以让内存泄漏检查模块在任何状态下直接回到空闲状态。各个状态之间的切换由控制模块发送的信号或消息控制,一次检查结束后,就可以根据哈希表中记录的还未释放的内存块的信息来分析应用程序中可能产生泄漏的地方。
在内存泄漏检查模块的具体实现中,可以选择不同的哈希算法,并根据程序中内存申请操作的频繁度来调整哈希表的大小,以适应各种检测环境的需要。同时,控制模块在内存泄露检查时的各个状态的时长可以控制,以满足实际的控制需要。
权利要求
1.一种软件内存泄露的检查方法,包括a.确定应用程序申请的内存块,以及所申请的不同内存块被占用的时间;b.在应用程序运行时,记录其申请内存块和释放内存块的信息;c.确定超过占用时间尚未释放的内存块,通过上述内存块确定应用程序的内存泄露点。
2.根据权利要求1所述的软件内存泄露的检查方法,其特征在于所述方法包括定义内存块记录表,以记录应用程序申请内存块和释放内存块的信息。
3.根据权利要求2所述的软件内存泄露的检查方法,其特征在于所述内存块记录表为哈希(HASH)表。
4.根据权利要求3所述的软件内存泄露的检查方法,其特征在于所述方法包括设置内存块计数器,用于对应用程序申请和释放的内存块进行管理。
5.根据权利要求1、2、3或4所述的软件内存泄露的检查方法,其特征在于所述方法通过在应用程序中嵌入内存泄露检查模块实现。
6.根据权利要求5所述的软件内存泄露的检查方法,其特征在于设置控制模块,以从应用程序外部控制内存泄露检查模块进行内存泄露的检查。
7.根据权利要求6所述的软件内存泄露的检查方法,其特征在于控制模块控制内存泄露检查模块按照下述步骤实现状态的迁移以进行内存泄露的检查(71)首先使内存泄露检查模块处于空闲状态,当需要进行内存泄露分析时,向内存泄露检查模块发送操作记录信号,使其进入操作记录状态记录应用程序的内存申请和释放操作;(72)记录一段时间后,向内存泄露检查模块发送停止插入记录信号,使其进入等待释放状态,只记录内存释放操作而不记录内存申请操作,等待哈希表中记录的尚未释放的内存块释放;(73)当需要确定是否存在内存泄露时,向内存泄露检查模块发送停止信号,使其进入停止状态以分析确定是否存在内存泄露;(74)当需要重新开始内存泄露检查时,向内存泄露检查模块发送复位信号,然后转步骤(71)进行新一轮的内存泄露检查。
全文摘要
本发明公开了一种软件内存泄露的检查方法,该方法首先确定应用程序申请的内存块,以及所申请的不同内存块被占用的时间,在应用程序运行时,记录其申请内存块和释放内存块的信息,最后确定超过占用时间尚未释放的内存块,通过上述内存块确定应用程序的内存泄露点;采用上述方案进行应用程序内存泄露的检查对应用程序具有较小地影响,且易于实现和成本低廉,有利于在应用程序运行过程中对可能产生的内存泄露进行长期检测,有助于发现应用程序在一些实际环境下才出现的或者较隐蔽的内存泄漏错误。
文档编号G06F11/36GK1466057SQ02121418
公开日2004年1月7日 申请日期2002年6月20日 优先权日2002年6月20日
发明者叶顺福 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1