2010-10-20 20 views

Respuesta

1

Sí se puede: hacer que tienen un objetivo para funcionar con valgrind - es el intérprete de Python en sí:

valgrind python foo.py 

Sin embargo, los resultados de la anterior puede ser muy satisfactorio - Python se construye en modo opt y con un malloc especial, que puede ahogarte en falsos positivos.

Es probable que obtenga mejores resultados construyendo primero una versión de depuración de Python. Comience here.

+0

¿Podría actualizar ese enlace, por favor? –

39

Sí, puede usar valgrind con Python. Solo necesita usar el archivo de supresión de valgrind provisto por los desarrolladores de Python, para que no tenga un montón de falsos positivos debido a las funciones de asignación/reasignación de memoria personalizadas de Python.

El archivo de supresión valgrind se puede encontrar aquí: http://svn.python.org/projects/python/trunk/Misc/valgrind-python.supp

IMPORTANTE: Es necesario quitar los comentarios de las líneas para PyObject_Free y PyObject_Realloc en el archivo de supresión *.

La sintaxis de uso recomendado es:

$ valgrind --tool=memcheck --suppressions=valgrind-python.supp \ 
              python -E -tt ./my_python_script.py 

Véase también el archivo README de la cesión temporal de Python SVN que describe las diferentes formas de utilizar Python con valgrind: http://svn.python.org/projects/python/trunk/Misc/README.valgrind

* - Como alternativa, Puede recompilar Python con PyMalloc deshabilitado, lo que le permite atrapar más pérdidas de memoria que no aparecerán si simplemente suprime PyMalloc.

+1

Python 2.7 parece bastante travieso. Un script vacío (valgrind --leak-check = yes --suppressions = valgrind-python.supp python -tt -E "") da "315 errores de 315 contextos (suprimido: 2 de 2)" en Fedora 16. – Ling

+1

@Ling ¿Recordó descomentar las líneas en 'Misc/valgrind-python.supp' que suprimen las advertencias para' PyObject_Free' y 'PyObject_Realloc'? –

+0

Lo hice. Por eso estaba sorprendido. – Ling

8

En Python 2.7 y 3.2 ahora existe un indicador de tiempo de compilación --with-valgrind que permite que el intérprete de Python detecte cuándo se ejecuta bajo valgrind e inhabilita PyMalloc. Esto debería permitirle controlar con mayor precisión las asignaciones de memoria que de otra manera, ya que PyMalloc solo asigna memoria en grandes porciones.

+0

es esto cuando ejecuta python o cuando está compilando python? Estoy ejecutando 2.7.1 y no pude hacer 'valgrind python --with-valgrind myscript.py' – oob

+2

Lo siento, debería haber sido más claro. Es una bandera en tiempo de compilación que configurará Python para detectar cuando se está ejecutando bajo valgrind.Algunos detalles están aquí: http://bugs.python.org/issue2422 –

Cuestiones relacionadas