Linux

查看 Linux 上的程序使用 malloc() 保留了多少記憶體

  • April 2, 2022

我知道如果一個程序malloc()在這個記憶體上做了一個但實際上並沒有寫,Linux 認為這個記憶體是空閒的並且可以被其他程序使用(overcommit)。

malloc()無論如何,有沒有辦法知道給定程序編輯了多少記憶體?(即使不使用)

此資訊存在於系統範圍內/proc/meminfo,但我想知道特定過程。

我挖了進去,/proc/<PID>/{smaps,stat,statm}但我不確定它是否顯示了這些資訊。

malloc()導致數據段大小改變的呼叫(不重新使用先前分配的記憶體——因此導致呼叫sbrk()or的分配mmap())顯示在/proc/$PID/statmand中/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資訊。

引用自:https://unix.stackexchange.com/questions/356532