C/C++检测内存泄漏的工具 Visual Leak Detector223 的使用方法
Visual Leak Detector是一个免费的内存泄露检测工具,适用于Visual C++ debugger(Visual C++ 6\2003\2005 and 2008\2010)。
下载地址:http://vld.codeplex.com/releases/view/82311
说明及备用下载地址:http://www.xdowns.com/article/170/Article_3060.html
使用方法1:
1.安装vld,如果它说是否要打入到什么系统环境变量,点是。
2.将安装路径(我的是C:\Program Files\Visual Leak Detector)的.h文件(include文件夹内)、.lib文件(lib\win32) 拷贝到VC++的include、lib目录(我的是VS2008精简版:C:\Program Files\Microsoft Visual Studio 9.0\VC\include和C:\Program Files\Microsoft Visual Studio 9.0\VC\lib)。 PS:有的还说要设置你VC++工程的目录,我设置后去掉了,貌似没什么影响,因为我没有用vc++编译,用的是scons,设置VC目录参考:http://vld.codeplex.com/wikipage?title=Using%20Visual%20Leak%20Detector&referringTitle=Documentation
3.在你想要检测泄露的文件加上#include <vld.h>,网上的原话:In the source file containing your program's main entry point, include the vld.h header file.
需要注意的是:如果这个cpp文件包含了stdafx.h,则将包含vld.h的语句放在stdafx.h的包含语句之后,否则放在最前面。(在上面说明链接中有例子)
4.重新编译下,F5启动你的程序就会在调试输出框看到已加载的信息。下图可以看到VLD已经加载成功了。(我的不是控制台程序,是公司产品!)
5.在你的程序中做一些操作,然后退出(必须要退出,不是shift+f5停止调试。VLD will detect memory leaks in your program whenever you run the debug version under the Visual C++ debugger. A report of all the memory leaks detected will be displayed in the debugger's output window when your program exits.),你就会看到一些内存泄露信息。。。好多。。。
例如:
信息还是比较丰富的,不像自带的检测工具,可以双击堆栈查看问题代码,进一步修改。
使用方法2(安装到你的项目中):我用的就是这个方法。
1.安装vld,同上面使用方法的1.
2.第一种方法直接把.h和lib库拷贝到了VC++的目录中,换台电脑就不行了,考虑到我们项目的可移植性,我直接加到了我们项目的import文件夹中,这个import文件夹内有好多库,如wxWidgets、mysql等。我把Visual Leak Detector安装目录下的bin,include,lib,src文件夹全部放进了import,实际上src文件夹应该不需要。
3.同第一种方法3,加入头文件,不过路径要换下,我的是:#include "import/Visual Leak Detector/include/vld.h"
4. Scons编译器——修改scons编译脚本,由于我们公司编译用scons,需修改根目录的SConstruct文件,在LIBPATH上加lib的路径,否则编译时一直说找不到lib 库, 例:
projectEnv['LIBPATH'].append(projectEnv['IMPORTDIR'] + '/Visual Leak Detector/lib/' + projectEnv['PLATFORM'])
然后再修改子目录的SConstruct文件,也即import文件夹下的,加上dll的路径,以下是我们公司的示例:
importEnv.Install(importEnv['BINDIR'], 'Visual Leak Detector/bin/' + importEnv['PLATFORM'] + '/' + 'dbghelp.dll')
importEnv.Install(importEnv['BINDIR'], 'Visual Leak Detector/bin/' + importEnv['PLATFORM'] + '/' + 'vld_x86.dll')
importEnv.Install(importEnv['BINDIR'], 'Visual Leak Detector/bin/' + importEnv['PLATFORM'] + '/' + 'Microsoft.DTfW.DHL.manifest'),目的就是把3个文件安装到bin目录下,也就是程序的路径。
importEnv.Install(importEnv['BINDIR'], 'Visual Leak Detector/bin/' + importEnv['PLATFORM'] + '/' + 'vld_x86.dll')
importEnv.Install(importEnv['BINDIR'], 'Visual Leak Detector/bin/' + importEnv['PLATFORM'] + '/' + 'Microsoft.DTfW.DHL.manifest'),目的就是把3个文件安装到bin目录下,也就是程序的路径。
4.如果是VC++编译器,这个没有测试过。。
1).设置VC++的工程目录(如何设置,参考上面的链接),加上VLD的lib库路径和头文件路径,代码中可以写成
#include "..\include\vld.h"
#pragma comment(lib,"../lib/Win32/vld.lib")
#pragma comment(lib,"../lib/Win32/vld.lib")
2).把3个文件dbghelp.dll,vld_x86.dll,'Microsoft.DTfW.DHL.manifest'拷贝到你程序的bin目录下。
5.F5启动,你就会看到加载的vld_x86.dll等是你程序的路径了:
小结:无论是那种方法,你都要让你的程序知道,如何去加载vld的dll,第一种方法,直接加到vc的include和lib路径,在你的代码中加入vld.h,编译时自动搜索VC的lib路径,运行时就会找到那些dll了(至于怎么找,还不清楚),第二种方法,加到项目中,代码加入vld.h,设置下VC++的目录lib和头文件的路径(scons设置下LIBPATH),编译时会去找那个lib库,如果不设置,编译器就会说找不到那个vld.lib,在运行时,你的程序会根据lib库的信息,找到bin目录下vld的dll。
以上只是个人观点,如有错误,欢迎批评指正!