专业的佛山网站建设,单县网站定制,广西桂林旅游必去十大景点,android写wordpress目录
1、VLD工具概述
2、下载、安装VLD
2.1、下载VLD
2.2、安装VLD
3、VLD安装目录及文件说明
3.1、安装目录及文件说明
3.2、关于32位和64位版本的详细说明
4、在工程中引入VLD
5、内存泄漏检测实例讲解
5.1、程序启动报错
5.2、启动调试#xff0c;查看内存泄漏报…目录
1、VLD工具概述
2、下载、安装VLD
2.1、下载VLD
2.2、安装VLD
3、VLD安装目录及文件说明
3.1、安装目录及文件说明
3.2、关于32位和64位版本的详细说明
4、在工程中引入VLD
5、内存泄漏检测实例讲解
5.1、程序启动报错
5.2、启动调试查看内存泄漏报告
5.3、vld.ini配置文件的使用
6、最后 VC常用功能开发汇总专栏文章列表欢迎订阅持续更新...https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程专栏文章列表欢迎订阅持续更新...https://blog.csdn.net/chenlycly/article/details/125529931C软件分析工具从入门到精通案例集锦专栏文章正在更新中...https://blog.csdn.net/chenlycly/article/details/131405795C/C基础与进阶专栏文章持续更新中...https://blog.csdn.net/chenlycly/category_11931267.html 内存泄漏是C/C程序一类常见的问题内存泄漏的危害比较大如果内存长时间的持续泄漏则会导致Out of memory内存耗尽异常程序进而发生崩溃闪退。对于大型软件来说业务模块众多、设计复杂排查起来可能会很费劲可能使用多种排查手段都难以定位。我们有必要掌握多种排查内存泄漏的方法在遇到问题时一种方法无法定位可以尝试使用其他手段去排查。今天我们来介绍一个内存泄漏工具Visual Leak Detector简称VLD详细讲述使用该工具排查内存泄漏问题的完整过程。本文考虑到很有朋友是开发新手会讲的比较详细一些。
1、VLD工具概述 Visual Leak Detector是一款用于C/C的免费开源的内存泄露检测工具。相比较其它的内存泄露检测工具它在检测到内存泄漏时有如下特点 1可以输出内存泄漏点的调用堆栈在函数调用堆栈中会显示具体的文件名及代码行号 2可以显示泄露内存中的完整数据 3它不是独立运行的exe程序是一个dll动态库需要在项目工程中引入该库并对代码进行重新编译 4它的源代码是开源的使用GNU许可发布并有详尽的文档及注释。对于想深入了解堆内存管理以及内存泄漏排查机制的读者是个不错的选择。 从使用的角度讲VLD简单易用对于使用者只要自己的代码中包含VLD的头文件并将VLD的dll库拷贝到exe主程序的目录中在debug下正常运行程序就可以检测内存泄漏问题了。从研究角度上讲VLD源代码是开源的深入到源码中可以学习堆内存分片与释放的原理、内存检查的原理机器内存操作的常用技巧等。
2、下载、安装VLD VLD当前的最新版本是2.5.1进入VLD的官方页面下载该版本即可。
2.1、下载VLD 如果找到微软关于VLD的官方页面https://marketplace.visualstudio.com/items?itemNameArkadyShapkin.VisualLeakDetectorforVisualC如下所示 点击“Get Stated”按钮进入VLD的github页面 在页面底部点击vld-2.5.1-setup.exe的超链接去下载中途会下载失败。 可以到 https://kinddragon.github.io/vld/ 页面点击“Download Installer”按钮去下载如下 2.2、安装VLD 先到网址上下载最新版本的Visual Leak Detector 2.5.1的安装包下载完直接安装就可以了。在安装过程中会让选择是否将VLD添加到环境变量和Visual Studio中此处不用勾选不需要自动帮我们配置我们在需要使用VLD时手动在项目中配置一下就好了。
3、VLD安装目录及文件说明 VLD并不是一个独立运行的exe程序只是一个dll库所以VLD安装包中包含的是VLD编译好的.h头文件、.lib和.dll库文件它并不是安装一个可以执行的exe程序只是将这些释放到安装目录中。
3.1、安装目录及文件说明 VLD默认是安装到路径C:\Program Files (x86)\Visual Leak Detector中的我们可以到安装目录中去看一下主要包含3个文件夹 include文件夹中放的是VLD库的头文件如下 lib文件夹中存放的是vld.lib文件有两个版本一个是Win32的vld.lib一个是Win64的vld.lib。bin文件夹中存放dll等二进制文件如下所示 同样也有32位和64位版本。 类似的安装包我们在编译libcurl开源代码时也会用到libcurl库内部会调用到openssl开源库接口但libcurl库源码中不提供openssl库我们可以到网址中下载openssl安装包该安装包中就是包含了openssl的库文件和头文件即安装目录下就是释放出来的库文件和头文件。
3.2、关于32位和64位版本的详细说明 使用IDE编译Windows程序时可以编译32位的对应x86也可以编译64位的对应x64。32位Windows系统中只能运行32位程序不能运行64位程序。64位Windows系统中可以运行64位程序也可以运行32位程序提供对32程序的兼容。 较老的Windows系统可能还是32位比如部分Win7系统还是32位的。不过比较新的Win10、Win11系统全部都是64位系统了。很多软件为了兼容32位Windows系统直接将软件编译成32位程序这样程序在32位和64位Windows系统中都可以运行。 也有不少程序分别提供了32位安装包和64位安装包这样用户可以根据自己的需要选择对应的版本安装。如果是32位Windows系统则只能安装32位安装包如果时64位Windows系统则32位和64位安装包都可以安装。 从开发者的角度有两点需要注意一下 1系统32位和64位程序进程分配的虚拟内存大小有较大差异 对于32位程序系统会给启动的程序分配2的32次方的虚拟内存即4GB。对于64位程序系统会给程序进程分配2的64次方的虚拟内存即虚拟内存非常大比32位程序4GB的虚拟内存要大的多。对于32位程序2GB是用户态的内存2GB是内核态的内存对于大型软件运行过程中会占用较大的内存空间有可能会出现虚拟内存不够用的情况如果虚拟内存不够用则会产生Out of memory内存耗尽的异常。之前我们在讲内存泄露时也讲到过这个内存耗尽的异常。2位数不同的exe和dll库不能混用 32位程序不能使用64位dll文件64位程序不能使用32位dll文件因为位数不同寻址范围是不同的。32位程序要选用32位dll文件64位程序要选用64位dll文件。所以VLD提供了32位和64位两个版本的库使用者根据自己程序的位数选择对应的版本。 4、在工程中引入VLD Visual Leak Detector不是一个exe可执行程序和能直接运行的工具有所不同它是一个dll动态库需要集成到我们的代码中重新编译代码然后在程序运行的过程中进行检测。 我们在引用VLD时就像引用普通的dll库一样先include库的头文件vld.h再引入库的.lib文件vld.lib编译链接时需要用到然后将dll文件拷贝到exe主程序的目录中。
1) 包含vld.h头文件用于编译 在包含vld.h头文件之前需要将vld.h头文件所在的路径设置到工程属性中C/C - 常规在附加包含目录中添加vld.h头文件所在的路径如下所示 这样编译代码时就会到上述路径下去找到vld.h头文件了。
2引入vld.lib文件用于链接 在引入vld.lib文件之前需要将vld.lib文件所在的路径设置到工程属性中链接器 - 常规在附加库目录中添加vld.lib文件所在的路径如下所示 这样编译链接时就会到上述路径中去找到vld.lib文件进行链接了。此处我们不用手动将vld.lib文件引入到工程代码中因为vld.h头文件中已经帮我们自动引入了如下所示 3拷贝vld.dll库文件到exe主程序目录中用于运行 到安装目录下的bin文件夹中将dll及其他的文件拷贝到exe主程序的目录中。 编译代码运行程序即可查看检测结果。
5、内存泄漏检测实例讲解 之前创建了一个win32控制台工程TestMemLeak然后在main函数中添加一行动态申请内存的代码如下所示 在main函数退出时故意没有释放内存测试一下VLD的检测效果。
5.1、程序启动报错 按上面讲的那样将头文件和.lib文件的路径设置到工程中然后将vld.h头文件包含进来。然后编译代码启动调试结果启动时报错了 弹出如下的提示框 程序无法启动对应的异常码为0xc0150002。 为了搞清楚这个错误码的含义直接在VS中输入之前熟悉的错误码宏STATUS_STACK_OVERFLOW 然后go到对应的系统异常码定义的头文件中对应的路径为C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\ntstatus.h 尝试在该头文件中搜索异常码0xc0150002果然找到了如下 系统无法处理应用程序中的绑定信息。难道是在拷贝bin目录下的文件时不仅要拷贝vld_x86.dll是不是要把目录下的其他文件也拷贝过去 于是手动又将bin目录下的dbghelp.dll和Microsoft.DTfW.DHL.manifest拷贝到exe主程序的目录中重新运行exe程序就好了就不再报错了。
5.2、启动调试查看内存泄漏报告 因为main函数比较简单进入后立即退出了程序也就退出了。然后在Visual Studio的输出窗口中看到了Visual Leak Detector detected memory leaks!即VLD检测到了内存泄漏如下所示 将发生内存泄漏的地址及大小打印了出来 ---------- Block 1 at 0x01497020: 1024 bytes ---------- 同时也将泄漏代码所在线程的函数调用堆栈打印出来了然后还将内存泄漏的那段内存中的内容显示出来了。双击图中的那行代码就跳转到发生内存泄漏的那行代码 5.3、vld.ini配置文件的使用 在VLD的安装目录中还有个vld.ini配置文件如下所示 这个配置文件中可以对VLD进行一些配置如果要用这个文件需要将之拷贝到exe主程序的目录中。 可以使用ReportTo配置项默认情况下分析报告是输出到Debugger调试器窗口中的如下所示 可以设置成both这样既会输出到调试器的窗口中也可以将检测报告输出到文件中。如果ReportTo选项设置为both还要设置ReportFile选项指定导出到的文件名称比如 还有其他的配置选项文件中有详细的注解感兴趣可以去自行试验一下。
6、最后 也可以使用Windbg中的umdh程序去检测内存泄漏我们在项目中用过效果还行。使用umdh检测内存泄漏的详细过程可以参见我之前写的文章使用Windbg定位Windows C程序中的内存泄漏https://blog.csdn.net/chenlycly/article/details/121295720使用umdh分析时不用重新编译代码比较方便。而使用VLD时需要重新编译代码会比较麻烦。特别是大型软件软件中包含了多个dll模块不同的dll模块是由不同的开发组维护的让所有模块都用VLD重新编译一下需要统筹协调也不是件容易的事。 另外这些内存泄漏检测工具不是万能的没法检测出所有场景下的泄漏。因为大型软件包含了多个模块代码比较繁琐复杂有些模块会一上来就会申请内存一直不释放有的可能使用到了内存池内存管理比较复杂。这会导致工具出现误检测到底是不是真正的内存泄漏点还要结合具体的代码和业务去分析。一个工具检测不出来还需要尝试使用其他工具甚至需要把很多工具都尝试一遍。 对于分析内存泄漏的工具若干年前有个强大的工具叫BoundsChecker但这个工具很久不维护了新版本的Visual Studio已经没法再使用了。此外Visual Studio 2019 V19.6版本开始引入了google的内存分析工具AddressSanitizer 也可以尝试使用AddressSanitizer。对于如何在VS中如何使用AddressSanitizer内存分析工具可以看一下微软官方文章的详细说明
在Visual Studio中使用AddressSanitizerhttps://docs.microsoft.com/zh-cn/cpp/sanitizers/asan?viewmsvc-170 要使用Visual Studio中集成的AddressSanitizer需要将IDE升级到Visual Studio 2019 V19.6或以上版本要将大型软件从上到下的多个模块统一升级到某个版本需要一定的时间和人力的。