使用Tcmalloc进行堆栈分析
在前一篇译文《使用TCmalloc的堆栈检查》,介绍了Tcmalloc进行堆栈检查,今天翻译《heap-profiling using tcmalloc》,了解如何 TCmalloc进行堆栈分析。
1.堆栈分析的用法:
这篇技术文档描述了如何使用C++程序来分析堆栈。可以用来做一下三条事情:
- 在任何时间了解程序的堆栈情况
- 定位内存泄漏
- 找到大量内存分配的位置
1.1 链接堆栈分析器
你可以对任何链接了tcmalloc的程序进行堆栈分析,并且不需要重新编译。
把tcmalloc链接到你的程序,即时你不想使用堆栈分析器来检查也是安全的。你的程序并不会运行的有任何一点缓慢,因为你没有用到任何一点堆栈分析的特性。
你可以通过LD_PRELOAD在那些不是你编译的程序中运行堆栈检查。
$ LD_PRELOAD="/usr/lib/libtcmalloc.so" HEAPPROFILE=...
我们不建议这种使用。
1.2 开启堆栈检查
定义HEAPPROFILE环境变量来确定生成分析文件的位置,例如生成在/usr/local/nmetscape:
$ HEAPPROFILE=/tmp/profile /usr/local/netscape # sh
% setenv HEAPPROFILE /tmp/profile; /usr/local/netscape # csh
分析对子进程也是有效的:每个子进程根据自己的名字得到它自己的分析文件(由HEAPPROFILE和进程ID组成)
出于安全的原因,堆栈检查将不会写道文件里,所以对于有setuid的程序,堆栈分析是不能使用的。
1.3 解压分析文件
如果堆程序中打开了堆栈分析,程序将会把分析文件生成到文件系统中,一系列分析文件的名字将被命名为如下:
<prefix>..heap
<prefix>..heap
<prefix>..heap
...
<perfix> 是HEAPPROFILE中定义的值。注意到如果没有定义文件的路径,文件将直接被生成到程序当前目录。
默认情况下,一个文件写满1GB换一个新的文件。写文件的频率可以在你的程序中调用HeapProfilerSetAllocationInterval()来控制。得出这样一个结论,每个文件的大小是一个确定的数值。
你也可以调用HeapProfile来在你程序的特定位置生成分析文件,例如:
extern const char* HeapProfile();
const char* profile = HeapProfile();
fputs(profile, stdout);
free(const_cast<char*>(profile));
1.4 分析了什么
这个分析系统说明了所有内存申请和释放。它保留了每次内存分配的一系列信息。内存分配定义为堆栈内活跃调用:malloc,calloc,realloc, or,new.
1.5 解析profile
可以通过把分析文件传给pprof工具来得到分析输出,pprof工具可以打印CPU和堆栈使用情况。解释如下:
这里是一些例子,这些例子假设二进制名字为gfs_master,一系列的堆栈分析文件名字如下:
profile..heap
profile..heap
...
profile..heap
1.6 为什么进程这样大
% pprof --gv gfs_master profile..heap
这个命令将会弹出一个显示分析信息的图表的窗口,如下是一个例子:

一些解释:
- GFS_MasterChunk::AddServer耗费掉256M内存,活跃内存为25%
- GFS_MasterChunkTable:UpdateState 消耗了176.2MB活跃内存,另外,它和被它调消耗了792MB。在输出边缘的标签上给出了每一个被调用者占用的内存。\
1.7 比较分析文件
你经常希望跳过程序在初始化阶段的内存分配来找到内存泄漏。一个简单的方法来实现这件事情是通过比较两个分析文件,这两个文件都是从程序开始到运行了一段时间。使用—baseoption来指定第一个文件,例如:
% pprof --base=profile..heap gfs_master profile..heap
profile.0004.heap 中的内存使用将会见到profile.0100.heap中的内存使用,并显示出结果。
1.8 文本输出
% pprof gfs_master profile..heap
255.6 24.7% 24.7% 255.6 24.7% GFS_MasterChunk::AddServer
184.6 17.8% 42.5% 298.8 28.8% GFS_MasterChunkTable::Create
176.2 17.0% 59.5% 729.9 70.5% GFS_MasterChunkTable::UpdateState
169.8 16.4% 75.9% 169.8 16.4% PendingClone::PendingClone
76.3 7.4% 83.3% 76.3 7.4% __default_alloc_template::_S_chunk_alloc
49.5 4.8% 88.0% 49.5 4.8% hashtable::resize
...
- 第一列包含了直接内存使用,单位是MB
- 第四列包含了它调用的模块的内存使用
- 第二列和第五列为第一列和第四列的百分比。
- 第三列为 第二列的 此行之前元素总和
1.9 忽略或聚焦到特定区域
如下的命令将会给出调用的图形显示,只包含了调用图中包含了DataBuffer表达式的那些路径:
% pprof --gv --focus=DataBuffer gfs_master profile..heap
同样的,下面的命令将忽略所有的路径。所有匹配了DataBuffer中的表达式的都会被忽略:
% pprof --gv --ignore=DataBuffer gfs_master profile..heap
1.10 所有的内存分配 + 对象信息
所有前面的例子已经说明了如何显示出空间使用,例如:那些分配了但未释放的数量。里可以获取其它信息用如下标志:
--inuse_space |
Display the number of in-use megabytes (i.e. space that has been allocated but not freed). This is the default. |
--inuse_objects |
Display the number of in-use objects (i.e. number of objects that have been allocated but not freed). |
--alloc_space |
Display the number of allocated megabytes. This includes the space that has since been de-allocated. Use this if you want to find the main allocation sites in the program. |
--alloc_objects |
Display the number of allocated objects. This includes the objects that have since been de-allocated. Use this if you want to find the main allocation sites in the program. |
1.11 注意事项
- 堆栈分析需要使用libcmalloc
- 如何程序链接了足够的符号信息的库,所有与之相关采样将会由上次在这个库之前发现的符号信息来负责,这就创造性的减少了符号的数量。
- 如果你在一台机器上运行程序,在另一台机器上分析,并且这两台机器共享的库是不同的,分析输出也许会不准。
- 一些库,如STL实现,由自己的内存管理。这回引起分析奇怪。你必须在STL库也使用tcmalloc。所以置只对少数STL实现有效。
原文链接:http://blog.csdn.net/chen19870707/article/details/40145565
使用Tcmalloc进行堆栈分析的更多相关文章
- GDB调试32位汇编堆栈分析
GDB调试32位汇编堆栈分析 测试源代码 #include <stdio.h> int g(int x){ return x+5; } int f(int x){ return g(x)+ ...
- 20145318 GDB调试汇编堆栈分析
20145318 GDB调试汇编堆栈分析 代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const sta ...
- 20145219 gdb调试汇编堆栈分析
20145219 gdb调试汇编堆栈分析 代码gdbdemo.c int g(int x) { return x+19; } int f(int x) { return g(x); } int mai ...
- 20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析
20145314郑凯杰<信息安全系统设计基础>GDB调试32位汇编堆栈分析 本篇博客将对第五周博客中的GDB调试32位汇编堆栈进行分析 首先放上以前环境配置的图: 图1: 测试代码: #i ...
- gdb运行时结合汇编堆栈分析
一.从源代码文件到可执行文件 从C文件到可执行文件,一般来说需要两步,先将每个C文件编译成.o文件,再把多个.o文件和链接库一起链接成可执行文件.但具体来说,其实是分为四步,下面以ex ...
- 【转】java线上程序排错经验2 - 线程堆栈分析
前言 在线上的程序中,我们可能经常会碰到程序卡死或者执行很慢的情况,这时候我们希望知道是代码哪里的问题,我们或许迫切希望得到代码运行到哪里了,是哪一步很慢,是否是进入了死循环,或者是否哪一段代码有问题 ...
- JMX堆栈分析
线程堆栈: 线程堆栈也称线程调用堆栈,是虚拟机中线程(包括锁)状态的一个瞬间快照,即系统在某一个时刻所有线程的运行状态,包括每一个线程的调用堆栈,锁的持有情况.虽然不同的虚拟机打印出来的格式有些不同, ...
- 20145310 GDB调试汇编堆栈分析
GDB调试汇编堆栈分析 由于老师说要逐条分析汇编代码,所以我学习卢肖明同学的方法,重新写了一篇博客. 代码: #include<stdio.h> short addend1 = 1; st ...
- Java线程堆栈分析
不知觉间工作已有一年了,闲下来的时候总会思考下,作为一名Java程序员,不能一直停留在开发业务使用框架上面.老话说得好,机会是留给有准备的人的,因此,开始计划看一些Java底层一点的东西,尝试开始在学 ...
随机推荐
- cnodejs社区论坛6--评论功能
- The template engine
Play has an efficient templating system which allows to dynamically generate HTML, XML, JSON or any ...
- 使用Sublime Text作为Markdown编辑器
Sublime Text 3作为一个优秀的文本编辑器,拥有很多的扩展插件.我们可以利用这些插件为Sublime Text 增加扩展的功能,在这里我们借助两个插件来将Sublime Text 3变成一个 ...
- Flex布局窥探(一)
一.Flex布局是神马? Flex是Flexible Box的缩写,意为‘弹性布局’,用来为盒模型提供最大的灵活性. 任何容器都能被指定为Flex布局: .box{ display: flex; } ...
- Javascript数组算法和技巧总结
Js-arrayMethod https://github.com/HerbertKarajan/Js-arrayMethod List unique an array 数组去重 random str ...
- CSS常用样式(三)
一.2D变换 1.transform 设置或检索对象的转换 取值: none::以一个含六值的(a,b,c,d,e,f)变换矩阵的形式指定一个2D变换,相当于直接应用一个[a,b,c,d,e,f] ...
- MSCRM 2013/2015 Ribbon Editor
由于新版本2015的解决方案与之前有变化,因此许多老的Tools已经不能使用,推荐给大家新的Ribbon Editor Tool. 下载地址: http://www.develop1.net/publ ...
- AWS EC2 复制实例后,自定义指标无法显示数据
从一个实例创建了一个AMI,然后通过这个AMI创建新的EC2实例,结果发票自定义指标不会显示: 系统一直在邮件中提示: print() on closed filehandle MDATA at Cl ...
- iOS 9 升级过程汇中白苹果 iPhone或iPad 解决方案
最近想必有很多朋友升级了iOS 9,不过有部分朋友在升级过程中遇到了白苹果问题.也就是卡在升级过程中,不限重启.这时,你只能通过dfu进行升级了. ios9怎么进入dfu模式: 1.将你的iPhone ...
- js document.createElement()的用法 (转)
document.createElement()的用法 分析代码时,发现自己的盲点--document.createElement(),冲浪一番,总结了点经验. document.createElem ...