
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:
Descubra o PID do processo que está causando vazamento de memória.
ps -aux
capture
/proc/PID/smaps
e salve em algum arquivo comoBeforeMemInc.txt
.- espere até que a memória aumente.
- capture novamente
/proc/PID/smaps
e salve ele temafterMemInc.txt
encontre a diferença entre o primeiro
smaps
e o segundosmaps
, por exemplo, comdiff -u beforeMemInc.txt afterMemInc.txt
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
use GDB para despejar memória no processo em execução ou obter o coredump usando
gcore -o process
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
agora, use
strings
o comando ouhexdump -C
para imprimir odump_outputfile.dump
strings outputfile.dump
Você obtém um formato legível onde pode localizar essas strings em seu código-fonte.
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_PRELOAD
para 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.