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