
¿Hay alguna manera de 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?
Respuesta1
Estos son los pasos que casi garantizan encontrar la pérdida de memoria:
Descubra el PID del proceso que provoca la pérdida de memoria.
ps -aux
capture
/proc/PID/smaps
y guárdelo en algún archivo comoBeforeMemInc.txt
.- Espere hasta que la memoria aumente.
- capturar de nuevo
/proc/PID/smaps
y guardarlo tieneafterMemInc.txt
encontrar la diferencia entre el primero
smaps
y el segundosmaps
, por ejemplo condiff -u beforeMemInc.txt afterMemInc.txt
anote el rango de direcciones donde se aumentó la memoria, por ejemplo:
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 volcar la memoria en el proceso en ejecución u obtener el volcado central usando
gcore -o process
Utilicé gdb en el proceso en ejecución para volcar la memoria a algún archivo.
gdb -p PID dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
ahora, use
strings
el comando ohexdump -C
para imprimir eldump_outputfile.dump
strings outputfile.dump
Obtiene un formulario legible donde puede ubicar esas cadenas en su código fuente.
Analice su fuente para encontrar la fuga.
Respuesta2
Creomemleaxes exactamente lo que quieres.
Depura la pérdida de memoria de un proceso en ejecución adjuntándolo, sin volver a compilar el programa ni reiniciar el proceso de destino. Es muy conveniente y adecuado para entornos de producción.
Funciona en GNU/Linux y FreeBSD.
NOTA:Soy el autor, cualquier sugerencia es bienvenida.
== EDITAR ==
También escribí otra herramienta.libleak, que enlaza funciones de memoria mediante LD_PRELOAD.
No es necesario modificar el programa de destino. Aunque tienes que reiniciar el progreso con LD_PRELOAD, puedes 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.
Respuesta3
En Linux, puede habilitarrastroen su programa, pero es un cambio de código.
En OpenBSD, puedes probar elestadísticas de malloc.
de googlecomprobador de fugasTambién podría valer la pena echarle un vistazo y, a diferencia de mtrace, es posible que puedas usarlo LD_PRELOAD
para evitar la recompilación.
Respuesta4
IBMPurificarEs 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.