[发明专利]一种内存泄漏探测方法无效
| 申请号: | 201010131849.4 | 申请日: | 2010-03-23 | 
| 公开(公告)号: | CN101814049A | 公开(公告)日: | 2010-08-25 | 
| 发明(设计)人: | 汪小林;罗英伟;刘毅;李晓明 | 申请(专利权)人: | 北京大学 | 
| 主分类号: | G06F11/34 | 分类号: | G06F11/34;G06F11/36 | 
| 代理公司: | 北京君尚知识产权代理事务所(普通合伙) 11200 | 代理人: | 冯艺东 | 
| 地址: | 100871 北*** | 国省代码: | 北京;11 | 
| 权利要求书: | 查看更多 | 说明书: | 查看更多 | 
| 摘要: | |||
| 搜索关键词: | 一种 内存 泄漏 探测 方法 | ||
技术领域
本发明属于虚拟化技术领域,涉及一种内存泄漏探测方法。
背景技术
内存泄露是指被申请的内存资源在程序运行的某一时刻后再也不被使用和释放。如果被泄露的是虚拟内存,则此程序本身能够使用的虚拟内存空间因此变少;如果被泄露的是物理内存,则整个系统减少了能够使用的物理地址。内存泄露会使应用程序申请动态内存失败,导致服务中止;严重时会导致整个系统因资源耗竭而崩溃。对于运行时间很短的程序,内存泄露一般不是问题;但是对于长期运行的程序,例如运行在服务器上的服务和操作系统本身,内存泄露会带来严重的后果,可能会导致系统服务中止。一直以来,内存泄露都是造成计算机安全事故的主要原因之一。
一些编程语言例如Java,通过垃圾回收等方式,自身提供了内存回收的机制。这种机制不但不能保证消除内存泄露,而且还会带来性能的损失。而另外执行效率很高的一些编程语言例如C和C++则将内存分配和释放的操作完全交付给程序员;在逻辑非常庞大的程序中,内存泄露很难避免。因为内存泄露探测的重要性,先前已经有很多这方面的工作。这些工作基本分为两类:第一类是静态检查程序语义。这类方法认为,正确的程序代码,应该符合预定的规则,例如,通过malloc函数申请的内存,在接下来运行的所有代码分支都应该有一个free函数。例如将代码的路径抽象为布尔限制路径,对动态内存的指针加以跟踪。对于大型的工程,这个方法比较耗时,例如分析GNU/Linux的内核代码需要一个处理器一整天的时间。也有将代码抽象为一个变量流通图的,图的边表示代码分支。这类方法直接对代码进行分析,实现复杂,目前还有一些难点尚未解决,例如循环的处理。另一类是运行时动态检测法。即在程序运行时记录程序动态分配的内存资源和释放信息,然后分析是否存在内存泄露。例如Purify和SafeMem,都属于这一类。动态检测法受限于测试程序,因为测试程序所覆盖的代码非常有限,无法激发出所有潜在的问题。本发明就是为了解决这些问题而提出的。
发明内容
针对现有技术方法所存在的问题,本发明的目的在于提供一种内存泄漏探测方法。本发明利用虚拟机管理器,透明地记录应用程序对资源的申请、释放以及使用情况,提供了探测内存泄露的辅助信息。此机制首先不需要修改或重新编译源程序;其次,带来的性能损失很小。两者结合可以构建在线内存泄露探测和汇报机制。不仅如此,基于虚拟环境的内存泄露探测还具备通用性,且不需要特殊的硬件支持。所有这些特性,是已有的解决方案所不能兼有的。实验结果表明:基于虚拟机环境的内存泄露探测机制具有实用性,性能损失也被控制在10%以内,能够运用在实际的生产环境中。
本发明的技术方案为:
一种内存泄漏探测方法,其步骤为:
1)虚拟机管理器截获内存资源的申请函数和释放函数的地址,从而获取分配的动态内存信息;所述动态内存信息包括动态内存的起始地址、长度、访问时间和调用IP地址;
2)根据动态内存的起始地址和长度,计算该动态内存所跨越的所有内存监控单元;
3)在影子页表中删除对所述内存监控单元的虚拟地址到机器地址的映射关系;
4)虚拟机陷入时,虚拟机管理器监测2)中的内存监控单元是否被访问;
5)监控策略模块将设定时间内未被应用程序访问的内存监控单元所在的动态内存项视为存在内存泄漏嫌疑的动态内存项。
进一步的,如果应用程序的某一调用IP地址持续申请动态内存且部分不释放,则将该IP地址所分配的内存项视为发生内存泄漏嫌疑的动态内存项。
进一步的,所述动态内存信息的获取方法为:
1)在函数地址处插入陷入指令;所述陷入指令为能够使得虚拟机陷入到虚拟机管理器的指令;该被植入陷入指令的函数称为受监控函数;
2)运行在虚拟机中的应用程序调用该受监控函数,陷入虚拟机管理器;
3)虚拟机管理器根据该受监控函数的类别更新应用程序占用内存资源的信息;该受监控函数如果是资源申请函数则增加内存占用信息,如果是资源释放函数则删除相应的内存信息;
4)虚拟机管理器模拟执行被替换指令,如果该受监控函数是资源申请函数,则在该陷入指令的下一条指令处再插入一陷入指令;函数地址中被所述陷入指令替换掉的指令称为被替换指令;
5)虚拟机管理器命令该虚拟机继续执行该受监控函数,虚拟机执行结束后,返回到调用处的下一条指令;
6)虚拟机返回到调用处的下一条指令,执行该指令时陷入虚拟机管理器,虚拟机管理器分析该受监控函数返回的结果得到动态内存的起始地址、长度、访问时间,同时根据返回处地址得到调用IP地址。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京大学,未经北京大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201010131849.4/2.html,转载请声明来源钻瓜专利网。





