簡體   English   中英

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

需要專家建議

找到對象的內存大小

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

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

size的輸出是目標文件不同部分的內存大小:

  • text :(代碼段)可執行指令
  • data :(數據段)初始化的全局變量
  • bss :(由符號開始的塊)靜態分配的變量

最后兩列( 十進制十六進制 )分別是十進制和十六進制中其他三列(總大小)的總和。

您要求的大小是: 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 trace --trace-children=yes

有趣的是,似乎沒有“ 進程的實際內存使用情況 ”: https//unix.stackexchange.com/questions/164653/actual-memory-usage-of-a-process

該程序未定義:沒有main功能。

在這種情況下,編譯器保留不編譯任何內容的權利,因此導致占用空間和內存大小為零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM