使用TCMalloc的堆栈检查
2016-05-17 20:16
211 查看
Author:Echo Chen(陈斌)
Email:chenb19870707@gmail.com
Blog:Blog.csdn.net/chen19870707
Date:October 15th, 2014
在前一篇译文《TCMalloc:线程缓冲的Malloc》详细讲解了TCMalloc的工作原理和特点,今天翻译《heap-checking
using tcmalloc》,了解Tcmalloc堆栈检查。
这篇技术文档描述了如何使用C++程序来检查堆栈。这种能力对于自动的内存泄漏检测非常有用。
你可以对任何链接了tcmalloc的程序进行堆栈检查,并且不需要重新编译。
为了抓住所有的内存泄漏,tcmalloc必须被链接到你的可执行程序中。堆栈检查器可能误解列在它后面的链接库的一些内存。例如,它可能把这些库的内存误报为内存泄漏,而实际上并没有。
把tcmalloc链接到你的程序,即时你不想使用堆栈检查器来检查也是安全的。你的程序并不会运行的有任何一点缓慢,因为你没有用到任何一点堆栈检查的特性。
你可以通过LD_PRELOAD在那些不是你编译的程序中运行堆栈检查。
我们不建议这种使用。
对可执行程序启动内存检查有两种方法:
对于整个程序的堆栈检查,定义环境变量 HEAPCHECK为你需要的堆栈检查的类型:普通的、严格的或者苛刻的。例如: 对/bin/ls的内存检查:
对程序的部分代码进行堆栈检查,你需要修改你的代码。用HeapLeakChecker对象把要检查的代码部分包起来,在你需要检查程序的末尾调用
当检查器对象一分配,它就会创建一个堆栈数据文件。当checker.NoLeaks()结束,它会创建另一个堆栈数据文件,然后进行比较产生一个新的数据文件。如果这个新的数据文件显示有内存增长,NoLeaks()将返回假并且把程序终止。关于如何使用pprof命令来获取一个详细的内存泄漏分析的提示信息会被打印出来。
注意:pthread处理但钱并不完整。如果在构造或者内存检查的使其有phtread线程活跃,堆栈检查将错误的把它当作内存泄漏,对于全局堆栈检查的一个办法是 确保除了主线程外的所有现场都推出了在程序结束的时候。
-
Echo Chen:Blog.csdn.net/chen19870707
Email:chenb19870707@gmail.com
Blog:Blog.csdn.net/chen19870707
Date:October 15th, 2014
在前一篇译文《TCMalloc:线程缓冲的Malloc》详细讲解了TCMalloc的工作原理和特点,今天翻译《heap-checking
using tcmalloc》,了解Tcmalloc堆栈检查。
一、自动的内存泄漏检查
这篇技术文档描述了如何使用C++程序来检查堆栈。这种能力对于自动的内存泄漏检测非常有用。
1.链接堆栈检查器
你可以对任何链接了tcmalloc的程序进行堆栈检查,并且不需要重新编译。
为了抓住所有的内存泄漏,tcmalloc必须被链接到你的可执行程序中。堆栈检查器可能误解列在它后面的链接库的一些内存。例如,它可能把这些库的内存误报为内存泄漏,而实际上并没有。
把tcmalloc链接到你的程序,即时你不想使用堆栈检查器来检查也是安全的。你的程序并不会运行的有任何一点缓慢,因为你没有用到任何一点堆栈检查的特性。
你可以通过LD_PRELOAD在那些不是你编译的程序中运行堆栈检查。
1: $ LD_PRELOAD="/usr/lib/libtcmalloc.so" HEAPCHECK=normal
我们不建议这种使用。
2.开启堆栈检查
对可执行程序启动内存检查有两种方法:
对于整个程序的堆栈检查,定义环境变量 HEAPCHECK为你需要的堆栈检查的类型:普通的、严格的或者苛刻的。例如: 对/bin/ls的内存检查:
1: $ HEAPCHECK=normal /bin/ls
2: % setenv HEAPCHECK normal; /bin/ls # csh
对程序的部分代码进行堆栈检查,你需要修改你的代码。用HeapLeakChecker对象把要检查的代码部分包起来,在你需要检查程序的末尾调用
check.NoLeaks()。这将只对包含的代码区内的代码做内存检查。设置本地环境变量HEAPCHECK 来打开堆栈检查。
下面是第二种用法的一个例子。如果Foo泄漏任何内存,下面代码就会终止。
2: Foo();
3: assert(checker.NoLeaks());
当检查器对象一分配,它就会创建一个堆栈数据文件。当checker.NoLeaks()结束,它会创建另一个堆栈数据文件,然后进行比较产生一个新的数据文件。如果这个新的数据文件显示有内存增长,NoLeaks()将返回假并且把程序终止。关于如何使用pprof命令来获取一个详细的内存泄漏分析的提示信息会被打印出来。
注意:pthread处理但钱并不完整。如果在构造或者内存检查的使其有phtread线程活跃,堆栈检查将错误的把它当作内存泄漏,对于全局堆栈检查的一个办法是 确保除了主线程外的所有现场都推出了在程序结束的时候。
3.关闭已知的内存泄漏
有时候你的程序有一些你已经知道并且接受的内存泄漏,你希望当你检查程序时,堆栈检查器忽略它们,你可以通过合适的堆栈检查对象来实现这个需求1: #include
2: ...
3: void *mark = HeapLeakChecker::GetDisableChecksStart();
4: <leaky code>
5: HeapLeakChecker::DisableChecksToHereFrom(mark);
-
Echo Chen:Blog.csdn.net/chen19870707
相关文章推荐
- HDU 5612 dfs
- 打开某个(第三方应用)Activity,检查是否有Activity匹配
- 数据库的原理,一篇文章搞定(二)
- 深度学习在文本分类中的应用
- jsp一句话
- Percona XtraBackup 备份原理
- Javascript面向对象编程(二):构造函数的继承
- 使用TCMalloc进行堆栈分析
- LightOJ 1348 (树链剖分 + 线段树(树状数组))
- HDU 5616 枚举子集
- 归并排序算法
- 数据库的原理,一篇文章搞定(一)
- 我的强势股操作系统和规则详解
- poj1182 并查集+关系维护
- HDUOJ 最小公倍数1108
- 树的子结构——18
- TCMalloc 安装和使用
- poj1276多重背包
- Bzoj4196:[Noi2015]软件包管理器:树链剖分
- 48.构建乘积数组(不能用除法)