【问题标题】:memory profiling for C programC程序的内存分析
【发布时间】:2016-02-10 03:19:33
【问题描述】:

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

需要专家的建议

【问题讨论】:

  • 如下所述,它不是一个程序。无论正在运行的程序可以分配哪些内存(即 malloc),都将计入已用内存(当然在二进制文件中不可见)。
  • 您必须定义“内存占用”。 Afaik,它的意思是总的RAM使用量,包括:程序代码、静态存储变量、堆栈使用量和堆使用量。
  • 是的,因为堆取决于我想在没有堆和堆栈的情况下计算的实时数据......所以在我的情况下,我需要计算如下 RAM = 程序代码、静态和全局变量, FLASH = 存储程序所需的总内存(常驻内存)
  • 我编辑了我的答案以满足您的问题。

标签: c memory memory-layout


【解决方案1】:

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

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

【讨论】:

  • 实际上我正在将我的功能作为一个动态库..我现在不需要堆栈和堆内存..我只需要计算将程序存储在闪存中所需的内存和所需的内存当我将库加载到 RAM 中执行时..
  • 那么您为什么将您的代码称为“应用程序”? :-)
【解决方案2】:

查找对象的内存大小

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

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

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

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

最后两列 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,这似乎很清楚。

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

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

【讨论】:

  • 我只需要计算将程序存储在磁盘中所需的内存和加载程序所需的 RAM .. 在我的应用程序堆和堆栈中取决于用户实时数据,因此到目前为止我想要只计算这些东西..
  • 磁盘上的实际字节大小(就像你对 ls 所做的那样)+ dec(大小输出)..它正确吗? ls 获取完整的目标文件大小(包括所有部分的大小),因此它应该是“仅磁盘上的实际大小(以字节为单位) ls,对吗?
  • 是的,我的意思是“磁盘上的实际大小 = ls”+“RAM 上的大小 = dec”。我编辑了文本希望现在更清楚。
  • 为了更好地可视化 valgrind 的输出,有一个很好的 GUI 应用程序 massif visualizer。它可以使用apt install massif-visualizer 安装在基于 debian 的系统上。然后运行massif-visualizer massif.out.?????,另见this
猜你喜欢
  • 2013-05-30
  • 1970-01-01
  • 2014-06-21
  • 2014-10-27
  • 2015-12-28
  • 2013-05-10
  • 2013-05-04
  • 1970-01-01
相关资源
最近更新 更多