Blade是我们开发的大规模C++项目构建工具。

gperftools是google开发的性能工具,由高效内存分配器,CPU性能分析器,堆分析器,堆检查器等工具组成。

和其他构建工具不同,结合gtest,Blade直接集成了对测试的支持,使得你可以像构建代码一样运行测试。

为了进一步提高测试的效果,我们还在测试中集成了gperftools的heapchecker,能够发现如下问题:

  • new和delete不匹配,比如new[]分配的用delete而不是delete[]释放。或者用free释放。
  • 堆内存写越界。
  • 内存泄露。

今天我们主要讲如何用blade测试来发现和分析内存泄露。

首先我们得写一个cc_test类型的blade构建目标。

然后我们运行这个测试:

blade test :xxx_test

不管测试成功失败,程序正常结束后(也就是没崩溃),如果有内存泄露,会出现这样的画面:

第一个红框内报告了泄露的位置,看不懂?我也看不懂,不过第二个红框内给了我们解谜的咒语:

我们把它拷下来,把结尾的--gv替换成--dot,然后执行,得到如下结果:

依然看不懂?下面这块是dot语言描述的图,我们可以用graphviz工具把它转为图形。把结尾换成--pdf就得到pdf,换成--svg就得到svg,都是矢量图,很方便查看。

可以用sudo yum install graphviz来安装,在我用的老旧的开发机上,因为缺乏包管理,安装比较麻烦,依赖一大堆东西。但是我通过搜索发现可以通过的这个网站在线把它转为图形:

把那段dot代码拷贝到左侧编辑区,稍等片刻,右侧就会出现图,如果不够大还可以另开个tab单独打开,就能很容易地看到内存泄露的代码位置和上下文了。如果dot太长可以先重定向到文件。

在Blade默认配置中,测试的HeapCheck功能没有开启,你可以在你的BLADE_ROOT文件中全局开启

其中的heap_check值请参考这里,一般设置成normal或者strict即可。

如果你的项目全局没开启,或者因为比如你的某个测试因为比如用了没有源代码但又不得不用的劣质某个第三方库等诸多原因问题而无法通过,可以在cc_test中单独设置这个属性,只对这个测试生效。设置为空字符串表示禁用。

通过这样的方式,内存泄露会导致测试失败,从而进一步保证了代码质量,只要有基本的单元测试,绝大多数内存泄漏都能在测试阶段发现。

不过,要消除内存泄漏,从代码风格上做更容易,比如用智能指针保存局部对象或者聚合的子对象,用string取代C字符串,用vector代替new数组,在现代风格的C++代码中,应该很少见到裸露的delete语句才对,这才是更基本的解决办法。

在Blade中结合gperftools检查内存泄露的更多相关文章

  1. Android中使用Handler造成内存泄露的分析和解决

    什么是内存泄露?Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用所指向 ...

  2. Android中使用Handler造成内存泄露

    1.什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用 ...

  3. 如何让xcode自动检查内存泄露

    在project-setting中找到 “Run Static Analyzer” 键,然后把值修改为“YES”.这样在编码的时候,xcode就可以自动为我们检查内存泄露了. 原图片:http://b ...

  4. iOS-如何让xcode自动检查内存泄露

    在project-setting中找到 “Run Static Analyzer” 键,然后把值修改为“YES”.这样在编码的时候,xcode就可以自动为我们检查内存泄露了.

  5. Android 中 Handler 引起的内存泄露

    在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.其实这可能导致内存泄露,代码中哪里可能导致内存泄露,又是如何导致内存泄露的呢?那我们就慢慢分析一下.http://w ...

  6. Android中Handler引起的内存泄露

    在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.通常我们的代码会这样实现. 1 2 3 4 5 6 7 8 9 public class SampleActivit ...

  7. 关于 Unity 项目中的 Mono 堆内存泄露

    关于 Unity 项目中的 Mono 堆内存泄露 题记:这是补一篇应该在将近一年前就应该写的记录,今天终于补上. 内存泄露是一个老话题了,之前我专门写过一篇 排查 Lua 虚拟机内存泄露 的文章,并且 ...

  8. vs 2010中如何检查内存泄露

    首先,在文件头添加下面的内容: #ifdef _DEBUG#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)#else# ...

  9. Android Monkey 脚本编写与检查内存泄露

    一.Monkey脚本编写 1.Monkey脚本格式 脚本优势: 简单快捷,不需要接触任何工具,只需要一个记事本文件 脚本缺点: 实现坐标.按键等基本操作的相应步骤,顺序脚本无逻辑性 脚本源码: \de ...

随机推荐

  1. 二叉树中序遍历 (C语言实现)

    在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构.二叉树是每个节点最多有两个子树的有序树.通常子树被称作“左子树”(left subtre ...

  2. C++函数覆盖的思考

    最近碰到一些问题,一开始很难调试和解决,最后发现原来是在基类函数的模板方法中对子类需要重写的函数没有使用virtual,如下 class Base { public: void say(){test( ...

  3. jquery cookies(2)用法实现

    example $.cookie('name', ‘value'); 设置cookie的值,把name变量的值设为value example $.cookie('name', ‘value', {ex ...

  4. php网站判断用户是否是手机访问的方法

    PHP网站判断用户是否用手机访问,如果是手机的话,就跳转到指定的手机友好页面.随着移动设备的普及,网站也会迎来越来越多移动设备的访问.用适应PC的页面,很多时候对手机用户不友好,那么有些时候,我们需要 ...

  5. Expires、Last-Modified、Etag缓存控制

    当请求一个页面时,如果浏览器使用本地缓存,因此我们经常会看到一个HTTP请求为304状态.或者显示200状态,在chrome下标注是from cache,在火狐下会标注BFCache: 我们希望在服务 ...

  6. TCP\UDP链接的异同

    简单的说TCP与UDP的区别是有无连接状态.TCP是有连接状态的,而UDP没有,所以TCP是一种比较安全的通讯协议,而UDP则比较方便 TCP 127.0.0.1:1026 0.0.0.0:0 LIS ...

  7. The formatter threw an exception while trying to deserialize the message in WCF

    有一个WCF应用, 主要功能是存储doc, txt等类型文件到database,当文件的大小在16kb之内,调用WCF service能正常工作:但如果文件大小超出16KB之外, 它将抛出这样一个错误 ...

  8. /etc/fstab自动挂载文件系统

    打开 /etc/fstab 文件 [root@www ~]# vi /etc/fstab 默认情况下,fstab中已经有了当前的分区配置,内容可能类似: # <file system> & ...

  9. Java---多线程的加强(1)

    简单应用: 首先来看一个简单的例子: 两个线程,分别实现对1-100内的奇数,偶数的输出. 第一种方法:通过接口 MyRun类: package thread.hello; /** * 通过实现Run ...

  10. [Java] TreeMap - 源代码学习笔记

    TreeMap 实现了 SortedMap 和 NavigableMap 接口,所有本文还会记录 SortedMap 和 NavigableMap 的阅读笔记. SortedMap 1. 排序的比较应 ...