C ++ linux应用程序的内存可视化

时间:2011-08-17 21:32:21

标签: c++ linux profiling

我正在寻找一种工具,可以帮助可视化应用程序的内存使用情况,并显示大部分内存耗尽的内容 - 即什么类,有多少对象等。有类似的thread讨论Windows的同样问题,但我需要在linux上这样做。

2 个答案:

答案 0 :(得分:3)

Valgrind也可以用于Linux。

答案 1 :(得分: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;
}

您需要使用调试符号对其进行编译,以便massif可以为您提供准确的行号:

g++ -g example.cpp

现在在Valgrind-Massif下运行:

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个实例。