Existe uma maneira, eu posso 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. Eu posso usar o GDB para anexá-lo a um processo em execução. Como depurar vazamentos de memória de um processo em execução?
c
gdb
memory-leaks
howtechstuffworks
fonte
fonte
Respostas:
Aqui estão quase as etapas de garantia para encontrar quem está vazando a memória:
Descubra o PID do processo que está causando o vazamento de memória.
capturar
/proc/PID/smaps
e salvar em algum arquivo comoBeforeMemInc.txt
./proc/PID/smaps
e salvá-loafterMemInc.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 em que a memória aumentou, por exemplo:
use o GDB para despejar memória no processo em execução ou obter o coredump usando
gcore -o process
Eu usei o gdb no processo em execução para despejar a memória em algum arquivo.
Agora, use o
strings
comando ouhexdump -C
para imprimir odump_outputfile.dump
Você obtém um formulário legível onde pode localizar essas cadeias no seu código-fonte.
Analise sua fonte para encontrar o vazamento.
fonte
Eu acho que memleax é 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 o ambiente de produção.
Funciona no GNU / Linux e FreeBSD.
NOTA: Sou o autor, qualquer sugestão é bem-vinda
== EDIT ==
Escrevo outra ferramenta libleak , que conecta funções de memória por LD_PRELOAD.
Também não há necessidade de modificar o programa de destino. Embora você precise reiniciar o progresso com LD_PRELOAD, é possível 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 no ponto de vazamento de memória suspeito.
fonte
No Linux, você pode ativar o mtrace no seu programa, mas é uma alteração de código.
No OpenBSD, você pode tentar as estatísticas do malloc .
O verificador de vazamento do Google também pode valer uma olhada e, ao contrário do mtrace, você pode usar
LD_PRELOAD
para evitar a recompilação.fonte
Acho que sem fornecer suporte para o monitoramento da alocação após o início do programa diretamente no código-fonte, você está sem sorte. Aqui estão duas razões pelas quais posso pensar:
Se, no entanto, seu programa estiver sendo executado dentro de uma máquina virtual, esse ambiente poderá fornecer suporte para monitorar alocações. Eu sei que o Java tem várias ferramentas de monitoramento de alocação e coleta de lixo (como o visualVM ) que se conectam à execução de programas ou VMs.
fonte
O Purify da IBM é provavelmente a ferramenta mais antiga e sofisticada de todas. Ele marcará o número da linha no código que causa o vazamento de memória.
fonte