Linux
查看 Linux 上的程序使用 malloc() 保留了多少記憶體
我知道如果一個程序
malloc()
在這個記憶體上做了一個但實際上並沒有寫,Linux 認為這個記憶體是空閒的並且可以被其他程序使用(overcommit)。
malloc()
無論如何,有沒有辦法知道給定程序編輯了多少記憶體?(即使不使用)此資訊存在於系統範圍內
/proc/meminfo
,但我想知道特定過程。我挖了進去,
/proc/<PID>/{smaps,stat,statm}
但我不確定它是否顯示了這些資訊。
malloc()
導致數據段大小改變的呼叫(即不重新使用先前分配的記憶體——因此導致呼叫sbrk()
or的分配mmap()
)顯示在/proc/$PID/statm
and中/proc/$PID/stat
。在
statm
中,第一個欄位顯示總程序大小,第六個欄位顯示數據頁數;這兩者都反映了記憶體分配(即使未使用)。在
stat
中,要查看的欄位是vsize
(目前第 23 個欄位)。
proc
(請參閱文件中的表 1-3 和 1-4 。)請注意,這些顯示總記憶體使用和總數據段大小,因此您無法區分已
malloc()
編輯的記憶體和其他記憶體使用情況。您可以通過以下程序看到這一點:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char **argv) { void *buf; puts("Waiting before allocating..."); sleep(20); buf = malloc(10*1024*1024*1024L); puts("Sleeping after allocating..."); sleep(20); free(buf); return 0; }
(一如既往地出色的錯誤處理。)然後
$ ./356532& [1] 4239 Waiting before allocating... $ cat /proc/4239/statm 1043 172 154 1 0 81 0 $ cat /proc/4239/stat | awk '{print $23}' 4272128 Sleeping after allocating... $ cat /proc/4239/statm 2622484 172 154 1 0 2621522 0 $ cat /proc/4239/stat | awk '{print $23}' 10741694464
Andrew Henle 指出
malloc_info(3)
,您實際上可以在幾乎任何過程中使用它。使用上面的範常式序,沒有任何調試資訊(只是為了表明它不是必需的):$ gdb ./356532 > break free
(這會在程序中的呼叫處設置一個斷點
free
——實際上是對 的任何呼叫free
,但我們會先點擊“我們的”;嘗試這個malloc
不會有用,因為啟動程式碼使用malloc
)> run
當
gdb
遇到斷點時,您可以malloc_info
這樣呼叫:> call malloc_info(0, stdout)
這將轉儲
malloc
資訊。