VLD集成到CI自动化检测内存泄露

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中。

简单用法

  1. 下载及安装,假设安装在VldPath
  2. 配置VC的include路径:右键-属性-directory-include directory,增加VldPath\include
  3. 配置lib路径:右键-属性-directory-lib directory,,增加VldPath\lib\win32,如果是x64的系统,那么选择win64即可。
  4. 根据需要配置vld.ini
  5. 声明
1
2
#define VLD_FORCE_ENABLE    //2.3版本之后,支持release下检测内存泄露
#include "vld.h"
  1. 构建,运行,就会生成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/