¿Hay alguna manera, puedo encontrar la pérdida de memoria de un proceso en ejecución? Puedo usar Valgrind para encontrar pérdidas de memoria antes del inicio de un proceso. Puedo usar GDB para adjuntarlo a un proceso en ejecución. ¿Cómo podría depurar las pérdidas de memoria de un proceso en ejecución?
c
gdb
memory-leaks
howtechstuffworks
fuente
fuente
Respuestas:
Aquí hay pasos casi garantizados para encontrar quién está perdiendo la memoria:
Descubra el PID del proceso que causa la pérdida de memoria.
capturar
/proc/PID/smaps
y guardar en algún archivo comoBeforeMemInc.txt
./proc/PID/smaps
y guardarlo tieneafterMemInc.txt
encuentre la diferencia entre primero
smaps
y segundosmaps
, por ejemplo condiff -u beforeMemInc.txt afterMemInc.txt
anote el rango de direcciones donde aumentó la memoria, por ejemplo:
use GDB para volcar la memoria en el proceso en ejecución u obtenga el coredump usando
gcore -o process
Usé gdb en el proceso en ejecución para volcar la memoria en algún archivo.
ahora, use el
strings
comando ohexdump -C
para imprimir eldump_outputfile.dump
Obtiene un formulario legible donde puede ubicar esas cadenas en su código fuente.
Analice su fuente para encontrar la fuga.
fuente
Creo que memleax es exactamente lo que quieres.
Depura la pérdida de memoria de un proceso en ejecución al adjuntarlo, sin volver a compilar el programa o reiniciar el proceso de destino. Es muy conveniente y adecuado para el entorno de producción.
Funciona en GNU / Linux y FreeBSD.
NOTA: Soy el autor, cualquier sugerencia es bienvenida
== EDITAR ==
Escribo otra herramienta libleak , que engancha funciones de memoria por LD_PRELOAD.
Tampoco hay necesidad de modificar el programa de destino. Aunque debe reiniciar el progreso con LD_PRELOAD, puede habilitar / deshabilitar la detección durante la ejecución.
Hay mucho menos impacto en el rendimiento ya que no hay trampa de señal.
En comparación con herramientas similares (como mtrace), imprime la pila de llamadas completa en un punto sospechoso de pérdida de memoria.
fuente
En Linux, puede habilitar mtrace en su programa, pero es un cambio de código.
En OpenBSD, puedes probar las estadísticas de malloc .
El comprobador de fugas de Google también puede valer la pena, y a diferencia de mtrace, puede usarlo
LD_PRELOAD
para evitar la compilación.fuente
Creo que sin brindar soporte para la supervisión de la asignación después del inicio del programa directamente en el código fuente, no tienes suerte. Aquí hay dos razones por las que puedo pensar:
Sin embargo, si su programa se ejecuta dentro de una máquina virtual, ese entorno puede proporcionar soporte para las asignaciones de monitoreo. Sé que Java tiene varias herramientas de supervisión de asignación y recolección de basura (como visualVM ) que se conectan a programas en ejecución o máquinas virtuales.
fuente
IBM's Purify es probablemente la herramienta más antigua y sofisticada de todas. Marcará el número de línea en el código que causa la pérdida de memoria.
fuente