欢迎来到天天文库
浏览记录
ID:24351282
大小:50.50 KB
页数:3页
时间:2018-11-13
《基于钩子函数的c++内存泄露检测方法》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、基于钩子函数的C++内存泄露检测方法本文提出了一种基于钩子函数的C++内存泄露检测方法。方法在分析内存泄露和钩子函数的基础上,通过在内存分配时使用钩子函数记录当时现场。在程序结束时,方法检测和定位内存泄露,并给出其详细信息。关键词:内存泄露;钩子函数;C++1引言 内存泄露是指由动态分配的内存在使用结束后,由于某种原因没有被及时释放,使得这些动态内存不能再被程序使用,导致可用内存数量减少,甚至耗尽。内存泄漏导致系统性能下降甚至引起程序运行失败、系统宕机。 一些高级语言如JAVA通过垃圾回收的方式自动回收不再使用的内存,但是这种机制并不能完全
2、保证消除内存泄露,还可能会带来性能的损失。但是在C++中内存分配和释放完全由程序员操作,因此在逻辑庞大的程序中很难避免内存泄露。 常见的静态内存泄露检测方法通过检查程序语义来实现。这类方法认为,正确的程序代码,应该符合预定的规则,例如,通过malloc函数申请的内存,在接下来运行的所有代码分支都应该有一个free函数。可将代码的路径抽象为布尔限制路径,对动态内存的指针加以跟踪。静态检测方法的缺陷是对于大型的工程检测比较耗时;而且这类方法直接对代码进行分析,实现复杂,目前还有一些难点尚未解决,例如循环的处理。 为此本文给出了一种动态的内存泄露
3、检测方法,在每次内存分配时使用钩子函数记录下当时的现场,当程序退出时,对于检测到的内存泄漏,查找其记录下来的现场信息,并将其转换成报告输出。该方法能够定位内存泄露发生的位置,并且给出内存泄露的详细信息。2钩子函数 钩子(Hook)是E64,反复调用该函数,便可以得到内存分配点的调用堆栈了。关键代码如下: //oduleBase64,NULL)){ //Couldn'ttracebackthroughanymoreframes. break; } if(frame.AddrFrame.Offset==0){ //Endofstack
4、. break; } //Pushthisframe'sprogramcounterontotheprovidedCallStack. callstack->push_back((DemBlockHeader结构,在此结构中就可以获得这个链表。代码如下: char*pheap=neBlockHeader*pheader=pHdr(pheap)->pBlockHeaderNext; deletepheap; //其中pheader则为链表首指针。(4)生成报告 最后,使用SymGetLineFromAddr64()及SymFrom
5、Addr()函数将钩子函数得到的信息转化为可读的报告。4结束语 内存泄露具有微细性、积累性的特点,影响程序的执行速度。本文针对内存泄露的实际情况,提出了一种基于钩子函数的动态监测方法。为了验证方法的有效性,将方法用C++语言在onitorBasedOnHOOKTechnique[J].[2]BartoszMile].北京:人们邮电出版社.2007.[3]邵叶秦.有效的C++内存泄露检测方法[J].[4]汪小林,王振林等.利用虚拟化平台进行内存泄露探测[J].计算机学报.2010.3.
此文档下载收益归作者所有