Áreas sem nome podem ser criadas por meio de um malloc
suficientemente grande:
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int *ip;
char *before, *after;
asprintf(&before, "cat /proc/%d/smaps > before", getpid());
asprintf(&after, "cat /proc/%d/smaps > after", getpid());
system(before);
ip = malloc(9999999);
if (!ip) abort();
system(after);
return 0;
}
Como mostrado por
$ CFLAGS=-g make ilikebigmallocs
cc -g ilikebigmallocs.c -o ilikebigmallocs
$ ./ilikebigmallocs
$ diff before after
64a65,80
> 7f97425ac000-7f9742f36000 rw-p 00000000 00:00 0
> Size: 9768 kB
> Rss: 4 kB
...
Assim, pelo menos algumas de suas áreas provavelmente foram criadas por malloc
ou equivalente (o que, de fato, chama mmap
). strace
(ou sysdig
) pode registrá-los:
$ strace -e trace=memory -o blah ./ilikebigmallocs
$ awk '/^mmap/{print $NF}' blah
0x7fc6193b1000
0x7fc6193a6000
...
$ grep 7fc6193b1000 after
7fc6193b1000-7fc6193b2000 rw-p 00000000 00:00 0
$
Eu acho que você poderia usar gdb
ou um rastreador malloc ou outros meios para resolver um backup mmap
específico para um código específico em seu processo que consome muita memória ...