簡體   English   中英

測量靜態,堆和堆棧內存? (c ++,Linux-Centos 7)

[英]Measure static, heap and stack memory ? (c++, Linux - Centos 7)

我想分別測量堆棧,堆和靜態內存,因為我對每個內存都有一些限制。

為了測量堆內存,我使用valgrind-> massif工具。 Massif也應該可以測量堆和堆棧內存,但是它顯示出奇怪的結果:

  • 沒有--stacks = yes的最后一個快照提供了total(B)= 0,有用堆(B)= 0,extra-heap(B)= 0(所以一切都很好)

  • 使用--stacks = yes的最后一個快照提供了total(B)= 2,256,有用堆(B)= 1,040,extra-heap(B)= 0,stacks(B)= 1,208(即使它是相同的命令和相同的二進制文件經過測試...不知道為什么...)

所以最后我需要一個工具來測量C ++二進制文件使用的堆棧和靜態內存,歡迎您提供一些幫助:)

謝謝你的幫助 !

-----------編輯--------------

除了Basile Starynkevitch注釋之外,為了解釋靜態,堆棧和堆內存的含義,我從Dmalloc庫文檔中獲取了它:

  • 靜態數據是其存儲空間已編譯到程序中的信息。

     /* global variables are allocated as static data */ int numbers[10]; main() { … } 
  • 堆棧數據是在運行時分配的數據,用於保存函數內部使用的信息。 該數據由系統在稱為堆棧空間的空間中管理。

     void foo() { /* if they are, the parameters of the function are stored in the stack */ /* this local variable is stored on the stack */ float total; … } main() { foo(); } 
  • 堆數據也在運行時分配,並為程序員提供了動態內存功能。

     main() { /* the address is stored on the stack */ char * string; … /* * Allocate a string of 10 bytes on the heap. Store the * address in string which is on the stack. */ string = (char *)malloc(10); … /* de-allocate the heap memory now that we're done with it */ (void)free(string); … } 

我想分別測量堆棧,堆和靜態內存,因為我對每個內存都有一些限制。

我無法想象為什么每個人都有單獨的約束。 他們都坐在虛擬內存中 順便說一句,您可以使用setrlimit(2)來設置限制(也許來自調用shell進程,例如內置bash ulimit )。

如果您考慮進程的實際虛擬地址空間 ,那么您的定義是幼稚的。

順便說一句, proc(5)使您可以查詢該空間,例如從程序內部使用/proc/self/maps (例如, /proc/1234/maps可以從終端查詢pid 1234的進程)。 您還可以使用/proc/self/status/proc/self/statm (順便說一句,在終端中嘗試cat /proc/self/mapscat /proc/$$/maps )。 在Linux上,您還可以使用mallinfo(3)malloc_stats(3)來獲取有關內存分配統計信息。

靜態數據可能在程序的數據段 (或BSS段)中。 但是線程本地空間呢? 這些數據段還包含各種庫內部的數據,特別是C標准庫libc.so (這算嗎?)。 當然,堆棧段通常比實際使用的堆棧大(因為頁面對齊)(從“底部”到當前%esp寄存器)。 線程進程具有多個堆棧(和堆棧段),每個線程一個。

堆棧數據當然在調用堆棧中,其中包含許多其他內容(返回地址,間隙,溢出的寄存器),而不僅僅是自動變量 (其中一些僅位於寄存器中或由編譯器優化,而沒有占用任何堆棧插槽) )。 他們算嗎? 另外,來自crt0 (調用main )的啟動代碼可能會占用一點堆棧空間(計數嗎?)...

堆分配的數據(可以從各種庫分配,甚至可以從動態鏈接器分配)不僅包含程序從malloc (和好友)獲取的內容,還包含必要的開銷。 這算嗎? 內存映射文件呢? 他們應該怎么算?

我建議查詢實際的虛擬地址空間(例如,通過讀取/proc/self/maps或使用pmap(1) ...),但是它們會帶來與您要求的有所不同的東西。

順便說一句,我在你回答之前找到了它:

  • 要測量堆內存,請使用valgrind-> massif

  • 要測量靜態內存,請使用二進制文件上的bash函數size

  • 要測量堆棧,可以使用堆棧

它提供了我想要的所有統計信息

暫無
暫無

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

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