2010-02-25 55 views
11

我正在創建一個c程序,我打算在短時間內在ARM處理器上運行。我想用我的全局變量來衡量我使用的內存量,同時忽略堆棧/堆的大小。有沒有辦法讓gcc在編譯時將其轉儲出來,或者從編譯後的二進制文件中檢索這些信息?如何測量我的全局變量的總大小?

回答

10

一個很好的方法來查看你的內存在哪裏去看鏈接器映射。鏈接器映射是由鏈接器生成並詳述程序的所有內存位置的文件。您可以在全局變量以及代碼的符號基礎上查看內存分配情況。過去,我使用鏈接器映射來處理對內存要求嚴格的項目。它們可以很容易地識別問題,如佔用大量空間的全局內存緩衝區。

添加此選項將gcc命令行來生成鏈接器映射:

-Wl,-Map = output.map

2

您需要使用objdump分析不同的內存段。有關文章請參閱here,關於此文章請參閱here以獲得更多詳細信息。

7

GNU binutils套件包含一個名爲「size」的程序,它是獲取所需數據的最簡單方法 - 或者至少是一個合理的近似值。對於典型的程序(在這種情況下,一個不小的內嵌一個),輸出可能類似於:

text data  bss  dec  hex filename 
332268 2200 19376 353844 56634 test-directory/add 

前三列是二進制的部分的大小:「文本」是可執行代碼, 「數據」是常量等等 - 包括用初始化變量表示初始變量的變量 - 而「bss」是隱含靜態初始化的所有變量的初始值。在一個典型的嵌入式程序中,這些靜態初始化程序幾乎專門用於全局變量(並且,出於您的目的,您可能希望在測量中包含其他靜態變量,因爲它們也不在堆棧或堆中)。

因此,我認爲你最終得到的「數據」和「bss」的總和實際上就是你想要的。 (在閱讀hlovdal鏈接的文章後,我比我更不確定;也許評論者可以添加確認?)

(之後,「dec」和「hex」是所有以十進制表示的總大小和「filename」當然是顯而易見的。)