[英]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的輸出是目標文件不同部分的內存大小:
最后兩列( 十進制和十六進制 )分別是十進制和十六進制中其他三列(總大小)的總和。
您要求的大小是: 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.