C程序的内存分析

memory profiling for C program

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

它应该包括足迹大小和 RAM 大小...

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

#include <stdio.h>

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 字节

需要专家的建议

此程序未定义:没有main函数。

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

求object

的内存大小

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

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

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

  • text:(代码段)可执行指令
  • data:(数据段)初始化全局变量
  • bss:(块以符号开头)statically-allocated 变量

最后两列,dechex,分别是其他三列(整体大小)的十进制和十六进制。

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

另请参阅这些帖子:http://www.cyberciti.biz/faq/linux-find-size-of-text-data-segment-bss-uninitialized-data/, how to know the memory footprint of my binary executable

查找内存占用

当提到软件应用程序时,footprint 表示 运行 进程消耗的内存大小(运行时内存要求)。

说的很清楚,当进程为运行时,你应该检查内存占用。我认为(和其他 posts 确认)唯一真正的选择是使用像 valgrind.

这样的工具

使用 valgrind 分析您的应用程序

您可以使用 Massif 工具分析内存。 Massif 是一个 heap 分析器,但也可以测量 stack.

的大小

valgrind --tool=massif --stacks=yes

这将为您提供 heapstack 内存使用情况。 然后这些信息都存储在文件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 手册 page,它看起来非常清楚。

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

有意思,好像没有“一个进程的实际内存使用量”: https://unix.stackexchange.com/questions/164653/actual-memory-usage-of-a-process.