VLD简介
Visual Leak Detector is a free, robust, open-source memory leak detection system for Visual C++.
windows下VC常用开源内存泄露检测工具,代码在codeplex
原理
代码中include了vld.h,在开始运行时构建一个VisualLeakDetector g_vld的全局变量,接管申请内存和释放内存的操作。
此后会记录每次申请内存,并将地址及call stack存到一个set;
释放内存时会删除set中与之相匹配的内存申请记录。
在程序结束时,vld会遍历此set,如果set不为空,说明有内存泄露,会将泄露地址及call stack输出到report中。
简单用法
- 下载及安装,假设安装在
VldPath
- 配置VC的include路径:右键-属性-directory-include directory,增加
VldPath\include
- 配置lib路径:右键-属性-directory-lib directory,,增加
VldPath\lib\win32
,如果是x64的系统,那么选择win64即可。 - 根据需要配置vld.ini
- 声明
1 | #define VLD_FORCE_ENABLE //2.3版本之后,支持release下检测内存泄露 |
- 构建,运行,就会生成report。
集成到CI
其实就是用脚本来实现上面的步骤,由于项目暂时不允许上传lib和dll到svn,只能通过迂回的方法来实现。
vld.h
项目中有一个专门的目录存放开源代码的头文件,此时正好派上用场
copy /y vld.h %CODE_HOME%\opensrc\include\
:: /y表示默认覆盖同名文件
copy /y vld_def.h %CODE_HOME%\opensrc\include\
vld.lib
同样也有个存放开源代码lib的目录
copy /y vld.lib %CODE_HOME%\opensrc\lib\
dll
将vld_x86.dll拷贝到bin目录
copy /y vld_x86.dll %CODE_HOME%\bin\
vld.ini
将AggregateDuplicates设置为yes,表示将引起泄露同一行代码合并到一块。
将ReportFile设置为.\leak_report.txt,表示将结果输出到leak_report.txt中
再将ini拷贝到bin
copy /y vld.ini %CODE_HOME%\bin\
更新代码
svn revert -R .
svn update .
修改stdafx.h
由于stdafx.h会被预编译,只要在其包含vld.h,那么整个工程都会处于vld的监控之下。
:: 家里没有windows的系统,凭记忆写的,可能会有点小纰漏
FOR /F "delims=" %%i IN('dir /b /s stdafx.h') DO(
echo //>>"%%i"
echo #define VLD_FORCE_ENABLE>>"%%i"
echo #include "vld.h">>"%%i"
)
build
FOR /F "delims=" %%i IN('dir /b /s *.sln') DO(
msbuild.exe "%%i" /p:Configuration=Release /t:rebuild
)
运行
提示0xC0150002,无法正确启动程序,这是因为缺少manifest,还需要把vld目录下的microsoft.dtfw.dhl.manifest拷贝到bin目录
copy /y microsoft.dtfw.dhl.manifest %CODE_HOME%\bin\
在运行目录生成了一个leak_report.txt,如果有泄露,则会有一行提示WARNING:Visual Leak Detector detected memory leaks!
,并指出引起内存泄露的代码。
只要检测report就能知道是否有泄露。
加入到自动化测试套餐
将脚本调试好,自动构建出检测内存泄露的版本,然后运行自动化测试,最后检测leak_report的内容,如有泄露则告警。
PS
家里没有windows系统,有些命令记不清了,不知有没有写错。领会精神,不要在意这些细节。
囧rz
本博客欢迎转发,但请保留原作者信息
github:codejuan
博客地址:http://blog.decbug.com/