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行的函數值得我們注意.
參考文獻
[1].https://launchpad.net/ubuntu/trusty/+package/massif-visualizer
[2].http://blog.csdn.net/unix21/article/details/9330571
[3].http://ju.outofmemory.cn/entry/1502