在Blade中结合gperftools检查内存泄露
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检查内存泄露的更多相关文章
- Android中使用Handler造成内存泄露的分析和解决
什么是内存泄露?Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用所指向 ...
- Android中使用Handler造成内存泄露
1.什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用 ...
- 如何让xcode自动检查内存泄露
在project-setting中找到 “Run Static Analyzer” 键,然后把值修改为“YES”.这样在编码的时候,xcode就可以自动为我们检查内存泄露了. 原图片:http://b ...
- iOS-如何让xcode自动检查内存泄露
在project-setting中找到 “Run Static Analyzer” 键,然后把值修改为“YES”.这样在编码的时候,xcode就可以自动为我们检查内存泄露了.
- Android 中 Handler 引起的内存泄露
在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.其实这可能导致内存泄露,代码中哪里可能导致内存泄露,又是如何导致内存泄露的呢?那我们就慢慢分析一下.http://w ...
- Android中Handler引起的内存泄露
在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.通常我们的代码会这样实现. 1 2 3 4 5 6 7 8 9 public class SampleActivit ...
- 关于 Unity 项目中的 Mono 堆内存泄露
关于 Unity 项目中的 Mono 堆内存泄露 题记:这是补一篇应该在将近一年前就应该写的记录,今天终于补上. 内存泄露是一个老话题了,之前我专门写过一篇 排查 Lua 虚拟机内存泄露 的文章,并且 ...
- vs 2010中如何检查内存泄露
首先,在文件头添加下面的内容: #ifdef _DEBUG#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)#else# ...
- Android Monkey 脚本编写与检查内存泄露
一.Monkey脚本编写 1.Monkey脚本格式 脚本优势: 简单快捷,不需要接触任何工具,只需要一个记事本文件 脚本缺点: 实现坐标.按键等基本操作的相应步骤,顺序脚本无逻辑性 脚本源码: \de ...
随机推荐
- 手机端MVC-js框架-Gillie-中文版本
译者声明: 1.代码库发布在http://pablovallejo.github.io/gillie/ 2.查看API介绍直接戳这里看整理. Gillie是一个轻型MVC框架,受Backbone的启发 ...
- 想追赶.Net的脚步?Java面前障碍重重
待到Java 8面世之时 .Net的进度时钟恐怕已经又走过了两到五年——届时微软做出的调整将使二者差距进一步拉大. 就在几周之前,我详细介绍了Java 8中值得期待的几大主要功能.不过当时我并没有提到 ...
- C# 根据IP查询地址归属地
必备文件:IPLocation.dll.QQWry.Dat 下载地址:http://pan.baidu.com/s/1jG1dlOy (可百度下载) 之前有过将 QQWry.Dat 转为 Access ...
- sublime3 插件pylinter的安装
1.首先sublime需要安装package control,之后安装pylinter插件,并进行简单的属性配置(网上教程很多,略) 2.之后是pylint_path的配置,我参照网上的配置失败,su ...
- 关于PHPstorm 使用技巧
慢慢更新,一点点积累,都是自己在使用中遇到的问题 设置:(2016.4.15) 1:注释模板,phpstorm 有非常强大的注释模板,可以根据自己的需求随时更改,并设置快捷键,非常方便 新文件注释 P ...
- MySql存储过程—2、第一个MySql存储过程的建立
看看如何创建一个存储过程.虽然通过命令行可以创建,但基本通过MySQL提供的Query browser来创建. 1.首先我们通过Administrator在test数据库中创建一个简单的表名叫”pro ...
- APP如何设计才能适配iphone6/plus和iphone5
随着苹果发布两种新尺寸的大屏iPhone 6,iOS平台尺寸适配问题终于还是来了,移动设计全面进入"杂屏"时代.看看下面三款iPhone尺寸和分辨率数据就知道屏幕有多杂了. 移动a ...
- NOIP[2015] 运输计划
传送门 题目描述 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球 ...
- setNeedsDisplay 和 setNeedsLayout-b
setNeedsDisplay: Marks the receiver’s entire bounds rectangle as needing to be redrawn. drawRect: Th ...
- spring获取properties
实际项目中,通常将一些可配置的定制信息放到属性文件中(如数据库连接信息,邮件发送配置信息等),便于统一配置管理.例中将需配置的属性信息放在属性文件/WEB-INF/configInfo.propert ...