gpt4 book ai didi

c - C程序的内存分析

转载 作者:太空狗 更新时间:2023-10-29 17:22:02 24 4
gpt4 key购买 nike

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

需要专家的建议

最佳答案

查找对象的内存大小

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

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

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

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

最后两列,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

查找内存占用量

当提及软件应用程序时,占用空间 表示运行过程消耗的内存大小(运行时内存要求)。

这么说,很明显,你应该在进程运行时检查内存占用。我认为(和其他 posts 确认)唯一真正的选择是使用像 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 手册 page这看起来很清楚。

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

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

关于c - C程序的内存分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33609797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com