¿Cómo puedo encontrar una pérdida de memoria de un proceso en ejecución?

¿Cómo puedo encontrar una pérdida de memoria de un proceso en ejecución?

¿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:

  1. Descubra el PID del proceso que provoca la pérdida de memoria.

    ps -aux
    
  2. capture /proc/PID/smapsy guárdelo en algún archivo como BeforeMemInc.txt.

  3. Espere hasta que la memoria aumente.
  4. capturar de nuevo /proc/PID/smapsy guardarlo tieneafterMemInc.txt
  5. encontrar la diferencia entre el primero smapsy el segundo smaps, por ejemplo con

    diff -u beforeMemInc.txt afterMemInc.txt

  6. 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
    
  7. use GDB para volcar la memoria en el proceso en ejecución u obtener el volcado central usandogcore -o process

  8. 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
    
  9. ahora, use stringsel comando o hexdump -Cpara imprimir eldump_outputfile.dump

    strings outputfile.dump
    
  10. Obtiene un formulario legible donde puede ubicar esas cadenas en su código fuente.

  11. 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_PRELOADpara 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.

información relacionada