C程序的内存分析

需要对我的C应用程序进行内存分析..

它应该包括占用空间大小和RAM大小……

例如,如果我的应用程序如下所示..

#include  int global = 10; /* initialized global variable */ int test_code(void) { static int i = 100; /* Initialized static variable*/ return 0; } 

输出:

 [putta@linux]$ gcc memory-layout.c -c memory-layout [putta@linux]$ ls -ltrh memory-layout.o 760 Nov 9 18:26 memory-layout [putta@linux]$ size memory-layout.o text data bss dec hex filename 67 8 0 75 4b memory-layout.o 

那么现在我应该考虑哪些内存用于分析足迹,以及加载程序时的RAM。

下面的分析是正确的吗? 占用内存= 760(即闪存或硬盘)RAM = 67 + 8 + 0 = 75字节

需要专家建议

找到对象的内存大小

如果你想知道你的程序在磁盘上的大小加上RAM中的文本和数据的大小,在Linux / Unix上你可以使用size命令:

 $> size /bin/cat text data bss dec hex filename 43422 1720 2472 47614 b9fe /bin/cat 

size的输出是目标文件不同部分的内存大小:

  • text :(代码段)可执行指令
  • data :(数据段)初始化全局变量
  • bss :(由符号开始的块)静态分配的变量

最后两列dechex分别是十进制和hex中其他三列(总大小)的总和。

您要求的大小是: ls的输出(它给出了磁盘上的大小)加上size命令输出的dec部分,它给出了RAM的大小。

另请参阅这些post: http : //www.cyberciti.biz/faq/linux-find-size-of-text-data-segment-bss-uninitialized-data/ , 如何知道我的二进制可执行文件的内存占用量

找到内存占用量

在引用软件应用程序时, 占用空间表示正在运行的进程所消耗的内存大小(运行时内存要求)。

说,显然你应该在进程运行时检查内存占用。 我认为(和其他post确认)唯一真正的选择是使用像valgrind这样的工具。

使用valgrind配置应用程序

您可以使用Massif工具分析内存。 Massif是一个分析器,但也可以测量堆栈的大小。

valgrind –tool = massif –stacks = yes

这将为您提供堆栈内存使用情况。 然后将信息存储在文件massif.out中。 你可以阅读

ms_print massif.out。?????

文件中的第一个输出是运行时内存使用情况的漂亮图表。

 -------------------------------------------------------------------------------- Command: ./myprog -f d5.ini Massif arguments: --stacks=yes ms_print arguments: massif.out.24377 -------------------------------------------------------------------------------- MB 5.292^ ## | @ : : @@ : : # :::: : : | @:::: :: : :@:@@::::::::::::@ :::::::::::::# ::::@::::@:::::::: | @:: ::: :::::::::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | ::@@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@:::::::: 0 +----------------------------------------------------------------------->Gi 0 1.030 

详细信息存储在文件中,位于不同的表中。 要完全理解输出,请参考Valgrind手册页 ,这看起来非常清楚。

跟踪子项的选项是: --trace-children=yes trace --trace-children=yes

有趣的是,似乎没有“ 进程的实际内存使用情况 ”: https : //unix.stackexchange.com/questions/164653/actual-memory-usage-of-a-process 。

该程序未定义:没有mainfunction。

在这种情况下,编译器保留不编译任何内容的权利,因此导致占用空间和内存大小为零。