一种检测内存泄漏的方法及系统的制作方法

文档序号:6431873阅读:187来源:国知局
专利名称:一种检测内存泄漏的方法及系统的制作方法
技术领域
本发明涉及内存检测技术,尤其涉及一种检测内存泄漏的方法及系统。
背景技术
内存测试需要测试软件中的内存越界访问、内存资源泄漏情况。内存越界主要包括数组越界读写、“野指针操作”和堆栈溢出等。内存资源泄漏情况则包含较多的种类,如分配的内存没有释放、打开的文件没有关闭、socket没有关闭、Windows窗口句柄没有关闭等。内存越界和内存资源泄漏是普遍存在的严重问题,可以说如果解决了内存越界和内存资源泄漏问题,软件中的Bug就消除了一大半以上。针对内存测试的特点和待测试的内容,当前内存测试的主要手段包括以下几种 静态检查,即使用静态检查工具或代码评审检视等手段来发现问题;动态检查,即通过使用内存动态检查工具在软件运行时进行检查;手工测试,自行编写内存测试代码进行白盒测试和黑盒测试,设计专门的用例来检查可能存在的资源泄漏和内存越界等问题;使用内存监测工具进行监测,如Windows系统使用任务管理器来监测程序的内存使用情况、句柄等资源使用情况等。看是否存在资源泄漏等情况;通过路径分析方法来提高内存测试的质量, 分析可能出现的操作路径,对这些操作路径反复测试,可以利用动态检查方法进行测试;编写极端情况下的测试用例来模拟内存资源的最大消耗情况,看程序消耗的内存等资源是否会超越系统所能承受的极限。使用上述测试手段的任何一种时都存在某种程度的缺陷,例如静态检查可以检查内存中的堆栈溢出等比较浅显的问题,对复杂的内存使用情况无能为力;动态检查,鉴于测试用例对程序执行路径的覆盖很难做到完全,此时很难完全检查内存越界或内存泄漏。

发明内容
本发明要解决的技术问题在于针对现有技术中检测内存泄漏的方法单一,没有形成一套完善的检测内存泄漏的方法的缺陷,提供一种较完善的检测内存泄漏的方法及系统。本发明解决其技术问题所采用的技术方案是提供一种检测内存泄漏的方法,包括以下步骤Si、读取内存基本信息;S2、判断所读取的内存基本信息是否正确;S3、在所述内存基本信息正确时,根据所读取的内存基本信息,通过代码走读的方式来判断内存占用量是否持续增长;S4、在所述内存占用量持续增长时,获取内存分配和释放的函数调用数据;S5、根据所述函数调用数据获知每一块内存的生命周期,定位内存泄漏。本发明所述的检测内存泄漏的方法中,步骤Sl具体包括S11、在开机时,读取POST界面和BIOS下的内存容量;
S12、在dos下利用光盘版Memtest运行测试50次以上,读取内存容量和频率;S13、在RED Hat 5. 4和SuselO系统中读取内存容量;S14、在Iinux系统下运行STRESS 48小时以上,并读取内存基本信息;S15、在Windows系统中读取内存容量;S16、运行everest ultimate软件读取内存各种信息,包括内存容量、存取类型、存取速度和频率;S17、反复运行压力测试工具M小时以上,读取所述内存基本信息。本发明所述的检测内存泄漏的方法中,在所述内存基本信息正确时,还包括步骤读取内存带宽、延时和缓存信息进行性能测试,并在所读取的内存带宽、延时和缓存信息均正确无误时,再判断内存的大小是否持续增长。本发明所述的检测内存泄漏的方法中,在步骤Sl之前还包括步骤SO、对内存进行物理兼容性测试,以检测内存结构是否完整无损以及内存是否正确安装。本发明解决其技术问题所采用的另一技术方案是提供一种检测内存泄漏的系统,包括内存信息读取模块,用于读取内存基本信息;第一判断模块,用于判断所述内存信息读取模块所读取的内存基本信息是否正确;第二判断模块,用于在所述第一判断模块的判断结果为所述内存基本信息正确时,根据所述内存信息读取模块所读取的内存基本信息,通过代码走读的方式来判断内存占用量是否持续增长;函数调用数据获取模块,用于在所述第二判断模块的判断结果为所述内存占用量持续增长时,获取内存分配和释放的函数调用数据;内存泄漏定位模块,用于根据所述函数调用数据获取模块获取的所述函数调用数据获知每一块内存的生命周期,定位内存泄漏。本发明所述的检测内存泄漏的系统中,所述第二判断模块通过代码走读的方式来判断所述内存占用量是否持续增长。本发明所述的检测内存泄漏的系统中,所述内存信息读取模块包括第一读取子模块,用于在开机时,读取POST界面和BIOS下的内存容量;第二读取子模块,用于在dos下利用光盘版Memtest运行测试50次以上,读取内
存容量和频率;第三读取子模块,用于在RED Hat 5. 4和SuselO系统中读取内存容量;第四读取子模块,用于在Iinux系统下运行STRESS 48小时以上,并读取内存基本 fn息;第五读取子模块,用于在Windows系统中读取内存容量;第六读取子模块,用于运行everest ultimate软件读取内存各种信息,包括内存容量、存取类型、存取速度和频率;第七读取子模块,用于反复运行压力测试工具M小时以上,读取所述内存基本信息。本发明所述的检测内存 泄漏的系统中,该系统还包括性能测试模块,用于在所述第一判断模块的判断结果为所述内存基本信息正确时,读取内存带宽、延时和缓存信息进行性能测试,并在所读取的内存带宽、延时和缓存信息均正确无误时,再进入所述第二判断模块执行。本发明所述的检测内存泄漏的系统中,该系统还包括物理测试模块,用于对内存进行物理兼容性测试,以检测内存结构是否完整无损以及内存是否正确安装。本发明产生的有益效果是本发明通过代码走读的方式来判断内存占用量是否持续增长来确定是否发生内存泄漏,当发生内存泄漏时通过获取内存分配和释放的函数调用数据获知每一块内存的生命周期来迅速定位内存泄漏,从而提供了一种静态检查和动态检测相结合的检测内存泄漏的方法,更完善、有效地对内存泄漏进行测试。


下面将结合附图及实施例对本发明作进一步说明,附图中图1是本发明实施例检测内存泄漏的方法的流程图;图2是本发明实施例检测内存泄漏的系统的结构示意图;图3是本发明另一实施例检测内存泄漏的系统的结构示意图。
具体实施例方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。如图1所示,本发明实施例检测内存泄漏的方法,主要包括以下步骤Si、读取内存基本信息,内存基本信息包括内存名称、制造商、特性、内存容量、内存占用量、存取速率以及存取类型等比本信息;S2、判断所读取的内存基本信息是否正确;S3、在内存基本信息正确时,根据所读取的内存基本信息,判断内存占用量是否持续增长;可通过代码走读的方式来判断内存占用量持续增长。内存泄漏可通过代码检查即代码走读来发现和定位,也可以用专用的工具来测试和定位。实际上,对于内存泄漏,代码检查有时能比采用任何技术解决方案更快地找到问题所在。预防内存泄漏的唯一方法就是要求程序员在程序结束时,必须将每个申请的内存都释放。S4、在内存占用量持续增长时,获取内存分配和释放的函数调用数据;一般说来, 一个正常的系统在其运行稳定后其内存的占用量是基本稳定的,不应该是无限制的增长的。根据这样的基本假设,持续地获取系统运行时使用的内存的大小,如果内存占用量持续地增长,则说明系统存在内存泄漏。S5、根据函数调用数据获知每一块内存的生命周期,定位内存泄漏。一旦知道确实发生了内存泄漏,就需要更专业的工具来查明为什么会发生泄漏。在这个时候,通常需要使用一些开销较低的工具来监控和查找内存泄漏。查找内存泄漏的工具很多,这些工具提供了记录并检查所有内存分配的调试版堆栈,从而有利于分析内存泄漏和悬挂指针。每当应用程序成功的分配一块内存后,就把它的指针加入一个全局的list (序列)中;每当释放一块内存,再把它的指针从list中删除。这样,当程序结束的时候,list中剩余的指针就是指向那些没有被释放的内存,根据函数调用数据获知每一块内存的生命周期,从而可以找到那些没有被释放的内存,即可定位内存泄漏。进一步地,本发明实施例检测内存泄漏的方法中,步骤Sl主要在以下情况下读取内存的基本数据,具体包括Sl 1、在开机时,读取POST (接通电源后,系统将执行一个自我检查的例行程序)界面和BIOS (BIOS :Basic Input Output System即基本输入输出系统)下的内存容量;S12、在dos下利用光盘版Memtest (内存压力检测软件)运行测试50次以上,读取内存容量和频率;ECC(ECC =Error Correcting Code,即错误检查和纠正技术)支持是否都已经正确识别,测试完成后注意是否有错误,如有错误,应检查内存是否有对应插槽安装好,然后再检查内存金手指及内存上的硬件是否有问题,如有问题应跟供应商取得联系。假如内存本身没有问题,应该从主板,硬盘等其他硬件上给予检查。;S13、分别安装RED Hat 5. 4和SuselO系统,观察安装过程是否正常,并在RED Hat 5. 4和SuselO系统中读取内存容量;S14、在Iinux系统下运行STRESS (STRESS是适用于Iinux系统下的内存压力测试软件)48小时以上,检测系统是否有报错,并读取内存基本信息;如有错误,应检查内存是否有对应插槽安装好,然后再检查内存金手指及内存上的硬件是否有问题,如有问题应跟供应商取得联系。假如内存本身没有问题,应该从主板,硬盘等其他硬件上给予检查。S15、在Windows系统中,如Windows3中读取内存容量;S16、运行everest ultimate软件读取内存各种信息,该软件可以显示内存各种信息包括内存容量、存取类型、存取速度和频率;S17、反复运行压力测试工具(如SPEEDY+绞肉机,绞肉机也叫ETD,一种适用于 windows系统下的压力测试软件,SPEEDY也是适用于windows系统下的压力测试软件,两种软件结合同时测试效果比较好) 小时以上,读取内存基本信息。同时还可以运行REBOOT 软件测试,重启100次以上,观察是否有错误发生,如有错误,应检查内存是否有对应插槽安装好,然后再检查内存金手指及内存上的硬件是否有问题,如有问题应跟供应商取得联系。假如内存本身没有问题,应该从主板,硬盘等其他硬件上给予检查。进一步地,本发明实施例检测内存泄漏的方法中,在内存基本信息正确时,还包括步骤读取内存带宽、延时和缓存信息进行性能测试,并在所读取的内存带宽、延时和缓存信息均正确无误时,再判断内存的大小是否持续增长。如在Windows系统下使用 passmark软件测试内存各种性能,passmark为适用于windows下的测试内存性能并给出报告的软件;或者在Windows系统下使用Sisoftware Sandra(适用于windows下的检测软件,可更详细地对内存的带宽,延时和缓存进行检测并给出报告)对待测内存进行其带宽、 延时、缓存等性能的检测;或者使用stream软件(适用于Iinux系统下的内存性能报告软件)在RED Hat 5. 4系统下测试内存性能,其中,RED Hat 5. 4为一种Iinux系统。在以上各项测试均无错误产生,则测试通过,内存无泄漏。
进一步地,本发明实施例检测内存泄漏的方法中,在步骤Sl之前还包括步骤SO、对内存进行物理兼容性测试,以检测内存结构是否完整无损以及内存是否正确安装。包括检查内存上各元件焊接是否牢固,是否有漏焊,虚焊现象;检查芯片组丝印内容是否完整清晰;检查PCB板或原件是否有破损,划伤;主板插满内存,测试在内存插拔过程中内存插槽是否过松或者过紧。如图2所示,本发明实施例检测内存泄漏的系统包括内存信息读取模块10、第一判断模块20、第二判断模块30、函数调用数据获取模块40和内存泄漏定位模块50。其中,内存信息读取模块10,用于读取内存基本信息;内存基本信息包括内存名称、制造商、特性、内存容量、内存占用量、存取速率以及存取类型等比本信息;第一判断模块20,用于判断内存信息读取模块10所读取的内存基本信息是否正确;第二判断模块30,用于在第一判断模块20的判断结果为内存基本信息正确时,根据内存信息读取模块所读取的内存基本信息,判断内存占用量是否持续增长;本发明实施例检测内存泄漏的系统中,第二判断模块30可通过代码走读的方式来判断内存占用量是否持续增长。内存泄漏可通过代码检查即代码走读来发现和定位,也可以用专用的工具来测试和定位。实际上,对于内存泄漏,代码检查有时能比采用任何技术解决方案更快地找到问题所在。一般说来,一个正常的系统在其运行稳定后其内存的占用量是基本稳定的,不应该是无限制的增长的。根据这样的基本假设,持续地获取系统运行时使用的内存的大小,如果内存占用量持续地增长,则说明系统存在内存泄漏。函数调用数据获取模块40,用于在第二判断模块30的判断结果为内存占用量持续增长时,获取内存分配和释放的函数调用数据;内存泄漏定位模块50,用于根据函数调用数据获取模块40获取的函数调用数据获知每一块内存的生命周期,定位内存泄漏。每当应用程序成功的分配一块内存后,就把它的指针加入一个全局的list (序列)中;每当释放一块内存,再把它的指针从list中删除。 这样,当程序结束的时候,list中剩余的指针就是指向那些没有被释放的内存,根据函数调用数据获知每一块内存的生命周期,从而可以找到那些没有被释放的内存,即可定位内存泄漏。预防内存泄漏的唯一方法就是要求程序员在程序结束时,必须将每个申请的内存都释放。本发明实施例检测内存泄漏的系统中,如图3所示,内存信息读取模块10包括第一读取子模块11,用于在开机时,读取POST界面和BIOS下的内存容量;第二读取子模块12,用于在dos下利用光盘版Memtest运行测试50次以上,且最好保证50次测试均通过,并读取内存容量和频率;第三读取子模块13,用于在RED Hat 5. 4和SuselO系统中读取内存容量;第四读取子模块14,用于在Iinux系统下运行STRESS 48小时以上,并读取内存基本信息; 第五读取子模块15,用于在Windows系统中读取内存容量;第六读取子模块16,用于运行everest ultimate软件读取内存各种信息,包括内存容量、存取类型、存取速度和频率;
第七读取子模块17,用于反复运行压力测试工具M小时以上,读取内存基本信肩、ο本发明实施例检测内存泄漏的系统中,如图3所示,该系统还包括性能测试模块60,用于在第一判断模块20的判断结果为内存基本信息正确时,读取内存带宽、延时和缓存信息进行性能测试,并在所读取的内存带宽、延时和缓存信息均正确无误时,再进入执行第二判断模块30。如在Windows系统下使用passmark软件测试内存各种性能;或者在Windows系统下使用Sisoftware Sandra对待测内存进行其带宽、延时、 缓存等性能的检测;或者使用stream软件在RED Hat 5. 4系统下测试内存性能。在以上各项测试均无错误产生,则测试通过,内存无泄漏。本发明实施例检测内存泄漏的系统中,如图3所示,该系统还包括物理测试模块70,用于对内存进行物理兼容性测试,以检测内存结构是否完整无损以及内存是否正确安装。包括检查内存上各元件焊接是否牢固,是否有漏焊,虚焊现象; 检查芯片组丝印内容是否完整清晰;检查PCB板或原件是否有破损,划伤;主板插满内存, 测试在内存插拔过程中内存插槽是否过松或者过紧。本发明通过代码走读的方式来判断内存占用量是否持续增长来确定是否发生内存泄漏,当发生内存泄漏时通过获取内存分配和释放的函数调用数据获知每一块内存的生命周期来迅速定位内存泄漏,从而提供了一种静态检查和动态检测相结合的检测内存泄漏的方法,更完善、有效地对内存泄漏进行测试。本发明进一步地进行物理兼容性测试和内存性能测试,从而从多个方面对内存进行检测,适合批量检测。应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换, 而所有这些改进和变换都应属于本发明所附权利要求的保护范围。
权利要求
1.一种检测内存泄漏的方法,其特征在于,包括以下步骤51、读取内存基本信息;52、判断所读取的内存基本信息是否正确;53、在所述内存基本信息正确时,根据所读取的内存基本信息,通过代码走读的方式来判断内存占用量是否持续增长;54、在所述内存占用量持续增长时,获取内存分配和释放的函数调用数据;55、根据所述函数调用数据获知每一块内存的生命周期,定位内存泄漏。
2.根据权利要求1所述的检测内存泄漏的方法,其特征在于,步骤Sl具体包括 Sl 1、在开机时,读取POST界面和BIOS下的内存容量;512、在dos下利用光盘版Memtest运行测试50次以上,读取内存容量和频率;513、在REDHat 5. 4和SuselO系统中读取内存容量;514、在Iinux系统下运行STRESS48小时以上,并读取内存基本信息;515、在Windows系统中读取内存容量;516、运行everestultimate软件读取内存各种信息,包括内存容量、存取类型、存取速度和频率;517、反复运行压力测试工具M小时以上,读取所述内存基本信息。
3.根据权利要求1所述的检测内存泄漏的方法,其特征在于,在所述内存基本信息正确时,还包括步骤读取内存带宽、延时和缓存信息进行性能测试,并在所读取的内存带宽、延时和缓存信息均正确无误时,再判断内存的大小是否持续增长。
4.根据权利要求1所述的检测内存泄漏的方法,其特征在于,在步骤Sl之前还包括步骤SO、对内存进行物理兼容性测试,以检测内存结构是否完整无损以及内存是否正确安装。
5.—种检测内存泄漏的系统,其特征在于,包括 内存信息读取模块,用于读取内存基本信息;第一判断模块,用于判断所述内存信息读取模块所读取的内存基本信息是否正确; 第二判断模块,用于在所述第一判断模块的判断结果为所述内存基本信息正确时,根据所述内存信息读取模块所读取的内存基本信息,通过代码走读的方式来判断内存占用量是否持续增长;函数调用数据获取模块,用于在所述第二判断模块的判断结果为所述内存占用量持续增长时,获取内存分配和释放的函数调用数据;内存泄漏定位模块,用于根据所述函数调用数据获取模块获取的所述函数调用数据获知每一块内存的生命周期,定位内存泄漏。
6.根据权利要求5所述的检测内存泄漏的系统,其特征在于,所述内存信息读取模块包括第一读取子模块,用于在开机时,读取POST界面和BIOS下的内存容量; 第二读取子模块,用于在dos下利用光盘版Memtest运行测试50次以上,读取内存容量和频率;第三读取子模块,用于在RED Hat 5. 4和SuselO系统中读取内存容量;第四读取子模块,用于在Iinux系统下运行STRESS 48小时以上,并读取内存基本信息;第五读取子模块,用于在Windows系统中读取内存容量;第六读取子模块,用于运行everest ultimate软件读取内存各种信息,包括内存容量、存取类型、存取速度和频率;第七读取子模块,用于反复运行压力测试工具24小时以上,读取所述内存基本信息。
7.根据权利要求5所述的检测内存泄漏的系统,其特征在于,该系统还包括性能测试模块,用于在所述第一判断模块的判断结果为所述内存基本信息正确时,读取内存带宽、延时和缓存信息进行性能测试,并在所读取的内存带宽、延时和缓存信息均正确无误时,再进入所述第二判断模块执行。
8.根据权利要求5所述的检测内存泄漏的系统,其特征在于,该系统还包括物理测试模块,用于对内存进行物理兼容性测试,以检测内存结构是否完整无损以及内存是否正确安装。
全文摘要
本发明公开了一种检测内存泄漏的方法及系统,其中方法包括读取内存基本信息;判断所读取的内存基本信息是否正确;在所述内存基本信息正确时,根据所读取的内存基本信息,通过代码走读的方式来判断内存占用量是否持续增长;在所述内存占用量持续增长时,获取内存分配和释放的函数调用数据;根据所述函数调用数据获知每一块内存的生命周期,定位内存泄漏。本发明通过静态检查和动态检测相结合的检测方法,更完善、有效地对内存泄漏进行测试,及时发现和定位内存泄漏。
文档编号G06F11/36GK102279797SQ20111025233
公开日2011年12月14日 申请日期2011年8月30日 优先权日2011年8月30日
发明者吴昊 申请人:深圳宝德科技集团股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1