massif是Valgrind工具集中的一个堆栈分析器,它指示程序中使用了多少堆内存等信息,而massif visualizer就是将massif记录的内存使用情况可视化,也就是一个GUI工具。当你使用Valgrind附带 --tool=massif 选项来测试你的程序时,会在当前目录下自动生成一个文件massif.out.%pid,另外 Gzip or Bzip2压缩的massif文件也可以正常处理。可见,这个massif visualizer是一个具有相当威力的工具,它能够轻松地分析很多大型程序的内存使用情况,比如nginx,ATS,memcache,redis等等,非常值得我们熟悉和使用。
它的官网是https://projects.kde.org/projects/extragear/sdk/massif-visualizer
原来要将massif visualizer安装到Ubuntu上非常困难,可以参见一个老外的安装笔记
http://josh.gourneau.com/blog/2010/07/29/massif-visualizer-ubuntu-install-notes/
好在现在Ubuntu 14.04上有它对应的安装包了,所以我们直接下载deb包安装就可以了。进入下面的地址:https://launchpad.net/ubuntu/trusty/+package/massif-visualizer
根据自己系统的架构选择合适的安装包,我这里是amd64的,就下载64位deb包就可以了。
然后双击deb包,直接安装就ok了。
安装完成后, 在命令行终端启用sudo massif-visualizer, 我们找到一个massif.out.4041文件, 打开看到它的截图如下
也可以直接使用命令
massif-visualizer massif.out.4041
下面我补充一下这个massif.out.4041的由来. 我们在当前目录下新建一个massif_demo.c文件
//gcc -g massif_demo.c -o massif_demo
//
#include <stdlib.h>
#include <stdio.h>
int* fa(){
int* p = (int*)malloc(10000);
return p;
}
void fb(int* p){
free(p);
}
int main(int argc, char* argv[]){
printf("ok\n");
printf("really ok?\n");
int i = 0;
int* vec[10000] = {NULL};
for(i = 0; i < 10000; i++)
vec[i] = fa();
for(i = 0; i < 10000; i++)
fb(vec[i]);
return 0;
}
使用如下命令编译:
gcc -g massif_demo.c -o massif_demo
再使用
valgrind --tool=massif ./massif_demo
执行后会在当前目录下生成一个名为massif.out.4041的文件, 这里4041是该程序所在的进程pid, 我们使用massif_printf来解析这个输出文件:
ms_printf massif.out.4041
从上面的截图中可以看到, massif对上述程序的heap进行了83次snapshot取样, 其中heap peak在第39帧, 下面是每次的数据, 可以看到, 这种展现方式不利于我们分析问题,如果采用massif visualizer就很直观, 通过图形就可以看出heap随时间的变化, 通过分析每个快照下面的函数信息分析出究竟哪些函数占用了大量的内存, 显然第8行的函数值得我们注意.
Linux和Windows堆栈溢出利用对比:http://www.linuxdiyf.com/linux/13866.html
Linux下用jmap命令进行堆栈转储:http://www.linuxdiyf.com/linux/2285.html