O que são entradas sem nome em / proc / pid / smaps?

2

Estou tentando descobrir o que consome muita memória em um processo, portanto, tentei ler /proc/pid/smaps (onde pid é o pid do processo).

O que me impressiona é que algumas entradas não têm nomes. Por exemplo:

4805d000-4805e000 rwxp 0001d000 00:0b 19674210   /lib/ld-2.6.so
Size:                  4 kB
Rss:                   4 kB
Pss:                   4 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         4 kB
Referenced:            4 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
4805e000-4805f000 ---p 00000000 00:00 0 
Size:                  4 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
4805f000-4885e000 rwxp 00000000 00:00 0 
Size:               8188 kB
Rss:                8188 kB
Pss:                8188 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:      8188 kB
Referenced:         8188 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

Acima, a primeira entrada tem o nome /lib/ld-2.6.so , mas a segunda e a terceira não têm nome. Então, quais são essas entradas sem nome? Como descobrir qual biblioteca os criou?

Por curiosidade, há algo mais (além de valgrind) para tentar descobrir o que come memória em um programa?

Depois de cavar o código do kernel, descobri que essas entradas não podem ser mapeadas para nenhum arquivo (fs / proc / task_mmu.c). Mas a questão ainda permanece: o que são eles? mmap () como uma forma de alocar memória?

    
por BЈовић 04.05.2017 / 17:58

1 resposta

2

Á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 ...

    
por 04.05.2017 / 20:08