python memory-leaks valgrind

¿Cómo usar valgrind con python?



memory-leaks (2)

Desde python 3.6, hay una variable de entorno PYTHONMALLOC que está disponible en versiones de lanzamiento, sin necesidad de recompilar.

PYTHONMALLOC=malloc python3 foobar.py

Esto deshabilitará pymalloc y simplemente usará el libc malloc directamente, haciéndolo valgrind-friendly. Esto es equivalente a --without-pymalloc (y es tan lento)

Si valgrind es demasiado lento, otros valores pueden ser útiles. PYTHONMALLOC=debug y PYTHONMALLOC=malloc_debug añaden los PYTHONMALLOC=malloc_debug depuración a los PYTHONMALLOC=malloc_debug predeterminados y los asignadores de libc, respectivamente. Sus efectos, de los documentos:

  • La memoria recién asignada se llena con el byte 0xCB
  • La memoria liberada se llena con el byte 0xDB
  • Detecta violaciones de la API del asignador de memoria de Python. Por ejemplo, PyObject_Free () invocó un bloque de memoria asignado por PyMem_Malloc ().
  • Detectar escrituras antes del inicio de un búfer (desbordamientos del búfer)
  • Detectar escrituras después del final de un búfer (desbordamientos de búfer)
  • Compruebe que el GIL se retiene cuando se invocan las funciones del asignador de los dominios PYMEM_DOMAIN_OBJ (por ejemplo: PyObject_Malloc ()) y PYMEM_DOMAIN_MEM (por ejemplo: PyMem_Malloc ()).

Esto captará algunas lecturas no inicializadas, algunas después de liberadas, algunas de almacenamiento intermedio / desbordamiento excesivo, etc., pero no informará las fugas y no tocará la memoria que no está asignada a través de python (Cuando se usan glibc, las variables de entorno MALLOC_PERTURB_ y MALLOC_CHECK_ podría ayudar allí)

Ver también:

Estoy tratando de memcheck una extensión python C que estoy escribiendo, pero estoy teniendo problemas para configurar valgrind para trabajar con Python. Realmente agradecería algunos consejos. Solo por contexto, esto es Ubuntu 13.10, Python 2.7.5+ y valgrind 3.8.1.

Según la recomendación de Readme.valgrind , hice lo siguiente.

1) Descargó la fuente de Python con

sudo apt-get build-dep python2.7 apt-get source python2.7

2) Aplicado el parche de código, es decir, "Descomentamiento Py_USING_MEMORY_DEBUGGER en Objetos / obmalloc.c".

3) Aplicado el parche de supresión, es decir, "Descomenta las líneas en Misc / valgrind-python.supp que suprimen las advertencias para PyObject_Free y PyObject_Realloc"

4) Python compilado con

./configure --prefix=/home/dejan/workspace/python --without-pymalloc make -j4 install

Tenga en cuenta que hice 2 y 3, mientras que README.valgrind dice que hacer 2 o 3 ... más no puede doler.

Ahora, test.py esto en un ejemplo de código python en test.py

print "Test"

Vamos a ejecutar valgrind en python con este script

valgrind --tool=memcheck --leak-check=full --suppressions=python2.7-2.7.5/Misc/valgrind-python.supp bin/python test.py

Inesperadamente, todavía hay muchos informes de valgrind, siendo el primero (y muchos más)

==27944== HEAP SUMMARY: ==27944== in use at exit: 857,932 bytes in 5,144 blocks ==27944== total heap usage: 22,766 allocs, 17,622 frees, 4,276,934 bytes allocated ==27944== ==27944== 38 bytes in 1 blocks are possibly lost in loss record 24 of 1,343 ==27944== at 0x4C2A2DB: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==27944== by 0x46B8DD: PyString_FromString (stringobject.c:143) ==27944== by 0x439631: PyFile_FromFile (fileobject.c:157) ==27944== by 0x4E9B4A: _PySys_Init (sysmodule.c:1383) ==27944== by 0x4E29E9: Py_InitializeEx (pythonrun.c:222) ==27944== by 0x4154B4: Py_Main (main.c:546) ==27944== by 0x577DDE4: (below main) (libc-start.c:260)

¿Estoy haciendo algo mal? ¿Hay alguna manera de valgrind una secuencia de comandos python que no se filtre y obtenga una salida limpia de valgrind?


Encontré la respuesta here .

Python también necesita compilarse en modo de depuración, es decir,

./configure --prefix=/home/dejan/workspace/python --without-pymalloc --with-pydebug --with-valgrind

Además, numpy tiene un archivo de supresión que elimina las advertencias adicionales de valgrind.