Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux应用程序的内存可视化_C++_Linux_Profiling - Fatal编程技术网

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

C++ Linux应用程序的内存可视化,c++,linux,profiling,C++,Linux,Profiling,我正在寻找一个工具,它可以帮助可视化应用程序的内存使用情况,并显示什么占用了大部分内存,即什么类、多少对象等。有一个类似的工具讨论了windows的相同问题,但我需要在linux上做这件事。对于linux也可以。对于linux也可以,也是。您需要使用Valgrind工具体量,它是您链接到的文档。它定期拍摄堆的快照,并生成完整的堆栈跟踪,其中哪些代码行负责堆分配的百分比 示例.cpp: struct Int_1 { int a; }; struct Int_2 { int a,b; }; stru

我正在寻找一个工具,它可以帮助可视化应用程序的内存使用情况,并显示什么占用了大部分内存,即什么类、多少对象等。有一个类似的工具讨论了windows的相同问题,但我需要在linux上做这件事。

对于linux也可以。

对于linux也可以,也是。

您需要使用Valgrind工具体量,它是您链接到的文档。它定期拍摄堆的快照,并生成完整的堆栈跟踪,其中哪些代码行负责堆分配的百分比

示例.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;
}
现在在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个实例。

您需要使用Valgrind工具massif,它是您链接到的文档。它定期拍摄堆的快照,并生成完整的堆栈跟踪,其中哪些代码行负责堆分配的百分比

示例.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;
}
现在在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个实例。

您提到的线程讨论了解决问题的Valgrind。您提到的线程讨论了解决问题的Valgrind。但是,它可以提供这类信息吗?我浏览了一遍,只看到了堆栈与堆的信息,其他的信息不多……Valgrind是一个二进制检测框架。有很多用Valgrind制作的工具,你可以自己制作。默认情况下,大多数人都会识别与Valgrind一起分发的工具,而这些工具只是几个示例,有很多选项:但它能提供这样的信息吗?我浏览了一遍,只看到了堆栈与堆的信息,其他的信息不多……Valgrind是一个二进制检测框架。有很多用Valgrind制作的工具,你可以自己制作。默认情况下,大多数人都会识别与Valgrind一起分发的工具,而这些工具只是几个示例,有很多选项:您希望在手册中仔细阅读的部分:您希望在手册中仔细阅读的部分: