版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VLD(Visual LeakDetector)内存泄露库的使用分类: Windows 编程2012-09-27 08:09 12300 人阅读 评论 收藏举报 vld目录(?)【+VLD简介由于C/C+语言没有所谓的垃圾收集器,内存的分配和释放都需要程序员自 己来控制,这会给C/C+程序员带来一定的困难。当您的程序越来越复杂时,它 的内存管理也会变得越来越困难。内存泄漏、内存越界是最常见的内存问题之一。内存泄漏如果不是很严重的话,在短时间内对程序不会造成太大的影响,而且在进程终止的时候,所有分配的内存都会释放掉。但是对于长时间运行的程序, 其破坏力是惊人的,从性能下降到内存耗尽,甚至会影响到
2、其它程序的正常运行。此外,内存问题存在一个共同的特点,它本身并不会有很明显的现象,当有 异常出现时就很难检查问题的原因所在,这给调试内存问题带来了很大的难度。VLD是一款用于VisualC+的免费内存泄漏检查工具。可以在 网站上找到,相比其它的内存泄漏哦给你根据, 他在检查内存泄漏的同事,还具 有如下特点:1 )可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在的文件及行号;2 )可以得到泄漏内存的完整数据;3 )恶意设置内存泄漏报告的级别;4 )它以动态库的形式提供,无需编译源代码,只需要很小的改动程序;5 )源代码使用GNU许可发布,并有详细的文档及其注释。从使用的角度讲,VLD
3、简单易用,对于使用者自己的代码中唯一需要修改的 地方是#include VLD的头文件后正常运行自己的程序就可以发现内存问题。从 研究角度上讲,如果输入到 VLD源代码,可以学习到堆内存分片与释放的原理、 内存检查的原理机器内存操作的常用技巧等。VLD使 用VLD 网址: nhance d-Memory-Leak-Detectio下载 Visual LeakDetector ,当前版本 223,打开 Visual C+ IDE 的"工 具"-"选项"-"项目和解决方案"-"VC+目录",在"包含文件&qu
4、ot;中增加VLD的头 文件路径"inelude" 路径,在"库文件"增加VLD库文件的"libWin32" 路径,此 外动态库的"binWin32"路径在安装时已经添加到环境变量里面了,若是未添加,则需要手动拷贝"binWin32"下的文件到可执行文件所在的目录中(拷贝的文件 有 dbghelp.dll/Microsoft.DTfW.DHL.manifest/vld_x86.dll/vld.ini)。接下来需要将VLD加入到自己的代码中。方法很简单,只要在包含入口函数 的.cpp文件中包含vl
5、d.h就可以。如果这个cpp文件中包含了 stdafx.h,则将 包含vld.h的语句放在stdafx.h的包含语句之后,否则放在最前面。示例程序:#include<vld.h>/ 包含 VLD的头文件#i nclude<stdlib.h>#i nclude<stdio.h>void f()int *p = new int(0x12345678);prin tf("p=%08x, ", p);int main()f();return 0;注:VLD只能在Windows下使用,在包含vld.h头文件时增加预编译选项。 注:在 Release
6、 模式下,不会链接 VisualLeak Detector 。注:Visual LeakDetector有一些配置项,可以设置内存泄露报告的保存地 (文件、调试器),拷贝"Visual Leak Detector"路径下的vld.ini文件到执行文件所在的目录下(在IDE运行的话,则需要拷贝到工程目录下),修改以下 项:ReportFile =.memory_leak_report.txtReportTo = bothVLD工具原理下面我们来看看 VLD是如何工作的。在VisualC+中内置工具CRTDebugHeap 工具,在使用Debug版本分配内存时,它会在内存块中记
7、录分配该内存的文件名 和行号。当程序退出时 CRT会在main函数返回时做一些清理工作,此时检查调试堆内存,如果仍然有内存没释放,则一定存在内存泄漏问题。从这些没有被释 放的内存块的头中可以得到文件名和行号。这种静态的方法可以检查出内存泄漏,但是不知道泄漏究竟是怎么发生的,也不知道该内存分配语句是如何被执行到的, 想要了解这些必须对内存分配过程进行动态跟踪。VLD就是这样做的,在每次内存分配的时候记录其上下文,当程序退出时对检测到的内存泄漏查找其上下文信 息,并转换成报告输出到Output中。初始化VLD 要记录每次的内存分配,它通过 Windows提供的分配钩子allocation hook
8、s来监视调试堆内存的分配。它是一个用户自定义的回调函数,在每次从堆 中分配内存之前被调用,在初始化是VLD使用_CrtSetAllocation注册这个钩子函数。全局变量在程序初始化时就初始化,如果将VLD作为一个全局变量就可以与程序 一起启动,但是C/C+并没有约定全局变量初始化的顺序,如果其它全局变量的 构造函数中有内存分配则可能无法检测到。因此,VLD使用C/C+提供的#pragmaini t_seg 来减少其它全局变量在它之前进行初始化。根据 #pragma init_seg 的 定义,全局变量初始化分为3个阶段,首先是compiler阶段,一般进行C语言 运行时库的初始化;然后是li
9、b段,一般用于第三方类库的初始化扽;最后是 user段,大部分的初始化都在这个阶段进行。记录内存分配一个内存分配钩子函数需要具有如下的定义:int AllocHook(i nt allocType, void*userData, size_t size,i nt blockType, long requestNumber, onst un sig ned char*file name, i nt lin eNumber);该函数需要在VLD初始化时被注册,每次从堆中分配内存前被调用,它需要 处理的事情就是记录下此时的调用堆栈和此时堆内存分配的唯一标识requestNumber。得到当前堆栈的二
10、进制表示并不是很复杂的事情, 但是因为不同的体系结构、不 同的编译器、不同的操作系统所产生的堆栈内容是不一样的,要解释堆栈并得到 整个函数的调用过程比较复杂。不过Windows提供了一个StackWalk64函数可以 获得堆栈的内容。VLD 是常用的C/C+内存泄漏检查工具,可以在ViusalC+中使用,在Viusal Studio 2008和2010中使用需要注意两点:1) 版本问题:VLD已经更新到2.2版本,修正了许多bug,而且在2010版本下工作良好,VisualC+ 6.0推荐使用1.0版本,1.9b版本不是很稳定不建 议使用,2.2版本的下载网址为 .2 )设置变化:VC+Dir
11、ectories设置已经变化位置,在 2010中设置过程如下:View | Other Win dow | Property Man agerGo to "VC+ Directories" setti ngsSet in clude folder pathSet lib folder path点OK我们就设置好了 include和lib目录问题 1: VLD 1.9在vista下使用vid的使用,总是出现错误无法正常工作,后来经过搜索, 在 上的评论中找到了解决的方法:评论“ Solution forrunning 1.9 beta on Visual Studio 200
12、8 with Vista 给出了解决方法: 评论1:VLD keptcrashi ng whe n trying to use 1.9g beta on Win dows Vista, visual studio 2008. Itried all the suggestions on here and nothing worked. But I fin ally figured itout.whe n you make a project in visual C+ 2008,it sets some stra nge adva need Lin ker properties that caus
13、e VLD to crash:I cha ngedL in ker->Adva nced->Ra ndomized Base Address from En able Image Ran domizatio n(/DYNAMICBASE) to Disable Image Ra ndomizati on (/DYNAMICBASE:NO)Then I changed Linker->Advanced->DataExecutionPrevention from Image iscompatible with DEP (/NXCOMPAT) to DefaultAnd no
14、w it works perfectlyPlease let me know if this helped you!It'll make me feel better for spe nding a whole day trying to get it work ing!-Nadav 评论2:The base address randomization seemsto benot necessary. Just disable DEP.大致的意思是说, 只需要禁用 DEP即可,在工程的“属性”-> “链接器”-> “高级”-> 数据执行保护(DEP,设为“默 认” (
15、default )或者“映像与DEP不兼容(/NXCOMPAT:NO)即可。(修改后 好像不可用)。注:这个选项只针对 Vista有效! !问题 2: VLD 223在项目中使用了 visual leak detector,调试时程序无法启动报错“应用程序正常启动失败(0xc0150002) ”。解决流程:查看vs输出信息最后一条是:Theprogram '3980 MobileSig nalA nalyzer.exe: Native' has exited with code-1072365566 (0xc0150002)在网上多方查找有:http:/blog.csd n.n
16、 et/evilswords/article/details/5698851 http:/blog.csd n.n et/brook0344/article/details/6685724这两篇有解决办法,就是把 VLD中的这两个复制到执行文件夹下就正常了Microsoft.VC90.CRT.ma nifestMicrosoft.DTfW.DHL.ma nifest产生原因:VC2003、VC2005 VC2008及其后续版本,对底层最基本的 CRT MFC ATL库都进行了重构,为了避免不同版本的库引起冲突,重构后的库文件一般放在C:/windows/WinSxS文件夹中,并用特定的文件夹/文件名称进行标识;与VC6不同,VC2003 VC2005 VC2008及其后续版本,引入了 manifest清 单的概念,即应用程序编译后会同时生成对应的.manifest文件,并将该.manifest文件作为资源编译到dll或者exe中去。.manifest
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年度上海房产买卖合同智能家居系统配套范本3篇
- 2024版郑州玻璃岗亭生产与供应链管理合同
- 2025年智能电网建设项目资金投入合同3篇
- 二零二五版豆腐品牌连锁加盟合同3篇
- 二零二五年度企业商业信用贷款还款合同3篇
- 二零二四年医疗器械生产许可合同
- 2025年绿色建筑项目瓦工力工劳务分包及节能减排合同3篇
- 2025年度大型活动临时演员招募服务合同4篇
- 年度豆浆粉战略市场规划报告
- 年度电子厨房秤竞争策略分析报告
- 中华人民共和国保守国家秘密法实施条例培训课件
- 管道坡口技术培训
- OQC培训资料教学课件
- 2024年8月CCAA国家注册审核员OHSMS职业健康安全管理体系基础知识考试题目含解析
- 体育赛事组织与实施操作手册
- 2024年浙江省公务员考试结构化面试真题试题试卷答案解析
- 2023年航空公司招聘:机场安检员基础知识试题(附答案)
- 皮肤储存新技术及临床应用
- 《现在完成时》语法复习课件(共44张-)
- 二年级下册语文《第3单元 口语交际:长大以后做什么》课件
- 2024年辽宁石化职业技术学院单招职业适应性测试题库必考题
评论
0/150
提交评论