Chama para malloc()
que causa a alteração do tamanho do segmento de dados ( ie , que não reutiliza memória alocada anteriormente - portanto, alocações que resultam em chamadas para sbrk()
ou mmap()
) aparecem em /proc/$PID/statm
e /proc/$PID/stat
.
Em statm
, o primeiro campo mostra o tamanho total do programa e o sexto campo mostra o número de páginas de dados; ambos refletem alocações de memória (mesmo quando não usadas).
Em stat
, o campo a ser observado é vsize
(o 23º campo atualmente).
(Veja as tabelas 1-3 e 1-4 na % documentação deproc
. )
Observe que eles mostram o uso total de memória e o total de tamanhos de segmento de dados, por isso você não pode distinguir entre a memória que foi malloc()
ed e o restante uso de memória.
Você pode ver isso em ação com o seguinte programa:
#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;
}
(excelente tratamento de erros como sempre).
$ ./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 apontou malloc_info(3)
, e você pode realmente usar isso em praticamente qualquer processo. Usando o programa de exemplo acima, sem informações de depuração (apenas para mostrar que não é necessário):
$ gdb ./356532
> break free
(isso configura um ponto de interrupção na chamada para free
no programa - na verdade, qualquer chamada para free
, mas vamos acessar "nosso" primeiro; tentar isso com malloc
não será tão útil porque o código de inicialização usa malloc
)
> run
Quando gdb
atinge um ponto de interrupção, você pode chamar malloc_info
assim:
> call malloc_info(0, stdout)
Isso despejará as informações malloc
.