C程序的内存分析

put*_* ks 6 c memory memory-layout

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

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

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

#include <stdio.h>

int global = 10; /* initialized global variable */

int test_code(void)
{
    static int i = 100; /* Initialized static variable*/
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

[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
Run Code Online (Sandbox Code Playgroud)

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

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

需要专家建议

ter*_*ill 5

查找对象的内存大小

如果要了解磁盘上程序的大小以及RAM中文本和数据的大小,请在Linux / Unix上使用size命令:

$> size /bin/cat
text       data     bss     dec     hex filename
43422      1720    2472   47614    b9fe /bin/cat
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

查找内存占用量

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

话虽如此,很明显,当进程运行时,您应该检查内存占用量。我认为(和其他帖子证实了这一点),唯一真正的选择是使用valgrind这样的工具。

用valgrind分析您的应用程序

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

valgrind --tool = massif --stacks =是

这将使您同时使用堆栈内存。然后将信息存储在文件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
Run Code Online (Sandbox Code Playgroud)

详细信息存储在文件中的不同表中。要完全了解输出,请参阅Valgrind手册该页看起来确实很清楚。

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

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