Como posso encontrar um vazamento de memória de um processo em execução?

Como posso encontrar um vazamento de memória de um processo em execução?

Existe uma maneira de encontrar o vazamento de memória de um processo em execução? Posso usar o Valgrind para encontrar vazamentos de memória antes do início de um processo. Posso usar o GDB para anexá-lo a um processo em execução. Como eu poderia depurar vazamentos de memória de um processo em execução?

Responder1

Aqui estão as etapas que quase garantem a descoberta do que está vazando memória:

  1. Descubra o PID do processo que está causando vazamento de memória.

    ps -aux
    
  2. capture /proc/PID/smapse salve em algum arquivo como BeforeMemInc.txt.

  3. espere até que a memória aumente.
  4. capture novamente /proc/PID/smapse salve ele temafterMemInc.txt
  5. encontre a diferença entre o primeiro smapse o segundo smaps, por exemplo, com

    diff -u beforeMemInc.txt afterMemInc.txt

  6. anote o intervalo de endereços onde a memória foi aumentada, por exemplo:

       beforeMemInc.txt            afterMemInc.txt
    ---------------------------------------------------
    2b3289290000-2b3289343000   2b3289290000-2b3289343000  #ADDRESS
    Shared_Clean:    0 kB       Shared_Clean:    0 kB          
    Shared_Dirty:    0 kB       Shared_Dirty:    0 kB
    Private_Clean:   0 kB       Private_Clean:   0 kB
    Private_Dirty:  28 kB       Private_Dirty:  36 kB  
    Referenced:     28 kB       Referenced:     36 kB
    Anonymous:      28 kB       Anonymous:      36 kB  #INCREASE MEM
    AnonHugePages:   0 kB       AnonHugePages:   0 kB
    Swap:            0 kB       Swap:            0 kB
    KernelPageSize:  4 kB       KernelPageSize:  4 kB
    MMUPageSize:     4 kB       MMUPageSize:     4 kB
    Locked:          0 kB       Locked:          0 kB
    VmFlags: rd wr mr mw me ac  VmFlags: rd wr mr mw me ac
    
  7. use GDB para despejar memória no processo em execução ou obter o coredump usandogcore -o process

  8. Usei o gdb no processo em execução para despejar a memória em algum arquivo.

    gdb -p PID
    dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
    
  9. agora, use stringso comando ou hexdump -Cpara imprimir odump_outputfile.dump

    strings outputfile.dump
    
  10. Você obtém um formato legível onde pode localizar essas strings em seu código-fonte.

  11. Analise sua fonte para encontrar o vazamento.

Responder2

Eu pensomemleaxé exatamente o que você quer.

Ele depura o vazamento de memória de um processo em execução anexando-o, sem recompilar o programa ou reiniciar o processo de destino. É muito conveniente e adequado para ambiente de produção.

Funciona em GNU/Linux e FreeBSD.

OBSERVAÇÃO:Eu sou o autor, qualquer sugestão é bem vinda.

== EDITAR ==

Eu também escrevi outra ferramentavazamento, que conecta funções de memória por LD_PRELOAD.

Não há necessidade de modificar o programa de destino. Embora seja necessário reiniciar o progresso com LD_PRELOAD, você pode ativar/desativar a detecção durante a execução.

Há muito menos impacto no desempenho, pois não há interceptação de sinal.

Comparado com ferramentas semelhantes (como mtrace), ele imprime a pilha de chamadas completa em pontos suspeitos de vazamento de memória.

Responder3

No Linux, você pode ativarmtraceno seu programa, mas é uma mudança de código.

No OpenBSD, você poderia tentar oestatísticas de malloc.

do Googleverificador de vazamentotambém pode valer a pena dar uma olhada e, ao contrário do mtrace, você pode usar LD_PRELOADpara evitar a recompilação.

Responder4

da IBMPurificaré provavelmente a ferramenta mais antiga e sofisticada de todas. Ele sinalizará o número da linha no código que causa o vazamento de memória.

informação relacionada