2013-10-28 83 views
0

我有一個運行在我的計算機上的C代碼程序,我需要檢查程序在運行時使用了多少內存。有什麼工具可以使用嗎?檢查我的程序使用了多少內存

PS:在這種情況下,地塊工具(valgrind)能夠工作嗎?我已經運行過它,但我不知道如何解釋由它創建的圖形。

PPS:我正在使用Linux(eOs)。

+0

你在什麼操作系統上?無論如何,「top」可以告訴你一個進程正在使用多少內存...... – rogerdpack

+0

你正在使用哪個操作系統? – David

回答

3

Massif是一個很棒的工具,可以顯示您的程序隨着時間的推移使用了多少內存。但它有一些缺點:

  • 所有Valgrind工具都很慢;如果你的程序很慢,Massif會進一步減慢速度(我認爲是十倍)。
  • 你必須重新啓動你的程序才能使用它,如果你的程序已經運行,你不能用Valgrind(和Massif)攔截它。
  • 如果您希望Massif報告顯示代碼內存中的位置,您必須使用'-g'標誌編譯程序。

如果你與你的程序運行的地塊,就可以運行

ms_print massif.out.1234 > output 

你沒有本質需要「output'部分,但我發現很容易用更少的解釋結果(或一些其他的文本文件閱讀器),而不僅僅是滾動瀏覽終端歷史記錄。在輸出的頂部,您會看到一段時間內的內存消耗圖。在此之下,您將看到來自任意時間間隔的一些快照,您可以從哪裏找到佔用大部分內存的代碼中的位置。

有一些圖形工具來解釋Massif結果,但我從來沒有覺得我需要它們。研究ms_print的報告,您將學習解釋其結果。

祝你好運!

1

,如果你使用的是Linux,使用一些命令,你可以看到你的程序的內存消耗,像

top -p Process id 
pmap pid 
ps aux 

簡單的內存消耗,您可以檢查使用MEMCHECK Valgrind的工具。 要解釋地塊圖,您應該仔細閱讀詳細手冊。 如果你在窗口,我想你的任務管理器會是一個很好的援助。請通過此article以供參考。

+0

我正在使用linux,因爲程序運行速度非常快,所以我無法使用top。 – Guilherme

0

一種方法是,捕獲所有對堆函數(如malloc,realloc,calloc)的調用,然後總計總大小。如果您的程序中沒有這種機制,那麼您仍然可以在不使用linux的LD_PRELOAD機制來更改程序的情況下執行此操作。你只需要編寫一個小的共享庫, 它具有以下功能

void* malloc (size_t size); 
void* calloc (size_t num, size_t size); 
void* realloc (void* ptr, size_t size); 

然後你就可以實現的功能來捕捉大小

void* malloc (size_t size) { 
    totalCount += size; 
    real_malloc (size_t size) 
} 

的實現細節,你也可以在看以前的答案Overriding malloc with LD_PRELOAD。就我個人而言,我會說在你的程序中執行這個機制,並在內部捕獲調用並計算你分配的內存。

相關問題