2011-08-17 63 views
1

我正在尋找一種工具,它可以幫助可視化應用程序的內存使用情況,並顯示大部分內存的使用情況 - 即什麼類,多少對象等。還有類似thread討論Windows的同樣的問題,但我需要在Linux上做到這一點。C++ linux應用程序的內存可視化

+1

您提到的主題討論Valgrind可以解決問題 –

回答

3

Valgrind對Linux也是可以的。

+0

它可以提供這樣的信息嗎?我查看了http://valgrind.org/docs/manual/ms-manual.html,只看到堆棧和堆的信息,沒有其他的東西... – naumcho

+0

Valgrind是一個二進制儀器的框架。 Valgrind提供了大量工具,並且始終可以創建自己的工具。大多數人認識到默認情況下使用Valgrind分發的工具,但它們只是幾個例子中的很多選項。 :) –

1

你會想要使用Valgrind工具地塊(這是你已鏈接的文件)。它會定期拍攝堆的快照,並生成一個完整的堆棧跟蹤,其中哪些代碼行負責堆分配的百分比。

example.cpp:

struct Int_1 { int a; }; 
struct Int_2 { int a,b; }; 
struct Int_3 { int a,b,c; }; 
struct Int_4 { int a,b,c,d; }; 

int main(void) 
{ 
    for(int i = 0; i < 1000; ++i) 
    { 
     new Int_1(); // Line 10 
     new Int_2(); // Line 11 
     new Int_3(); // Line 12 
     new Int_4(); // Line 13 
    } 
    return 0; 
} 

你想使用調試符號編譯它,以便地塊可以給你確切的行號:

g++ -g example.cpp 

現在下Valgrind的-地塊運行它:

valgrind --tool=massif ./a.out 

這將生成一個文件massif.out.PID,其定期快照如下所示:

#----------- 
snapshot=59 
#----------- 
time=1487054 
mem_heap_B=38384 
mem_heap_extra_B=53752 
mem_stacks_B=0 
heap_tree=detailed 
n4: 38384 (heap allocation functions) malloc/new/new[], --alloc-fns, etc. 
n0: 15344 0x4005C3: main (MemExample.cpp:13) 
n0: 11520 0x4005B1: main (MemExample.cpp:12) 
n0: 7680 0x40059F: main (MemExample.cpp:11) 
n0: 3840 0x40058D: main (MemExample.cpp:10) 

該輸出被解釋爲「在任意時間單位1487054,有38384字節分配在堆上」。縮進表示這些38348字節的分層分解,您可以觀察比例以匹配給定的結構大小。使用更復雜的代碼,您會看到包含更多方法和構造函數的完整調用鏈。

然後,這個想法是,這個輸出中構造函數旁邊的字節數顯示該類的多少個實例通過該特定的堆棧跟蹤進行分配,例如:第10行分配了3840字節,這是一個Int_1對象的構造所以目前有960個實例。

+0

您想在手冊中仔細閱讀該部分:http://valgrind.org/docs/manual/ms-manual.html#ms-manual.thesnapshotdetails – lnqhien