7

需要对我的 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 字节

需要专家的建议

4

2 回答 2

5

查找对象的内存大小

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

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

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

  • text:(代码段)可执行指令
  • 数据:(数据段)初始化的全局变量
  • 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=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

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

于 2015-11-09T14:18:24.817 回答
2

这个程序是未定义的:没有main功能。

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

于 2015-11-09T13:07:55.487 回答