Veja quanta memória foi reservada com malloc() por um processo no Linux

Veja quanta memória foi reservada com malloc() por um processo no Linux

Eu sei que se um processo faz um, malloc()mas na verdade não escreve nesta memória, o Linux considera que esta memória está livre e pode ser usada por outros processos (overcommit).

Enfim, existe uma maneira de saber quanta memória foi malloc()eliminada por um determinado processo? (mesmo que não seja usado)

Essas informações existem em todo o sistema /proc/meminfo, mas gostaria de saber para um processo específico.

Eu procurei, /proc/<PID>/{smaps,stat,statm}mas não tenho certeza se ele exibe essas informações.

Responder1

Chamadas para malloc()as quais fazem com que o tamanho do segmento de dados mude (ou seja, que não reutilizam a memória alocada anteriormente - portanto, as alocações que resultam em chamadas para sbrk()ou mmap()) aparecem em /proc/$PID/statme /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 utilizados).

Em stat, o campo a ser observado é vsize(o 23º campo atualmente).

(Veja as tabelas 1-3 e 1-4 noprocdocumentação.)

Observe que eles mostram o uso total da memória e o tamanho total dos segmentos de dados, portanto, você não pode distinguir entre a memória que foi malloc()editada e outro 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.) Então

$ ./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

André Henle apontou malloc_info(3), e você pode realmente usar isso em praticamente qualquer processo. Usando o programa de exemplo acima,sem nenhuma informação de depuração(só para mostrar que não é necessário):

$ gdb ./356532
> break free

(isso configura um ponto de interrupção na chamada to freedo programa - na verdade, qualquer chamada to free, mas vamos clicar em “nosso” primeiro; tentar fazer isso com mallocnão será tão útil porque o código de inicialização usa malloc)

> run

Quando gdbatinge um ponto de interrupção, você pode chamar malloc_infoassim:

> call malloc_info(0, stdout)

Isso irá despejar as mallocinformações.

informação relacionada