Pregunta

He tratado de accidente de memoria de depuración en mi extensión de Python C y trató de ejecutar secuencias de comandos bajo valgrind. He encontrado que hay demasiado "ruido" en la salida valgrind, incluso si he encontré con comandos simples como:

valgrind python -c ""

salida Valgrind lleno de información repetida de esta manera:

==12317== Invalid read of size 4
==12317==    at 0x409CF59: PyObject_Free (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x405C7C7: PyGrammar_RemoveAccelerators (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x410A1EC: Py_Finalize (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x4114FD1: Py_Main (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x8048591: main (in /usr/bin/python2.5)
==12317==  Address 0x43CD010 is 7,016 bytes inside a block of size 8,208 free'd
==12317==    at 0x4022F6C: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==12317==    by 0x4107ACC: PyArena_Free (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x41095D7: PyRun_StringFlags (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x40DF262: (within /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x4099569: PyCFunction_Call (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x40E76CC: PyEval_EvalFrameEx (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x40E70F3: PyEval_EvalFrameEx (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x40E896A: PyEval_EvalCodeEx (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x40E8AC2: PyEval_EvalCode (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x40FD99C: PyImport_ExecCodeModuleEx (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x40FFC93: (within /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x41002B0: (within /usr/lib/libpython2.5.so.1.0)

Python 2.5.2 en Slackware 12.2.

Es un comportamiento normal? Si es así, tal vez es valgrind herramienta inapropiada para la depuración de errores de memoria en Python?

¿Fue útil?

Solución

Se podría tratar de usar la archivo de supresión que viene con la fuente de Python

Python Valgrind README es una buena idea también !

Otros consejos

Esto es bastante común, en cualquier sistema bastante grande. Se puede utilizar de Valgrind sistema de supresión de para suprimir de forma explícita advertencias que no le interesa.

La opción más correcta es decirle Valgrind que debería interceptar las funciones de asignación de Python. Usted debe parchear valgrind / coregrind / m_replacemalloc / vg_replace_malloc.c la adición de los nuevos interceptores para PyObject_Malloc, PyObject_Free, PyObject_Realloc, por ejemplo:.

ALLOC_or_NULL(NONE,                  PyObject_Malloc,      malloc);

(tenga en cuenta que el soname para las funciones de asignación de usuarios debe NONE)

Tras enlaces a cargo de Nick yo era capaz de encontrar algunos cambios en README.valgrind. En una palabra, para Python> 3,6, se puede establecer la variable de entorno PYTHONMALLOC=malloc desactivar efectivamente las advertencias. Por ejemplo, en mi máquina:

export PYTHONMALLOC=malloc
valgrind python my_script.py

no se produce ningún error relacionado con Python.

Sí, esto es típico. Los sistemas grandes a menudo dejan la memoria no-liberados, lo cual está bien, siempre y cuando se trata de una cantidad constante, y no es proporcional a la historia de funcionamiento del sistema. El intérprete de Python entra en esta categoría.

Tal vez se puede filtrar la salida valgrind a centrarse sólo en las asignaciones hechas en su extensión C?

Hay otra opción que he encontrado. James Henstridge tiene estructura de encargo del pitón que puede detectar el hecho de que Python ejecuta en valgrind y en este caso asignador pymalloc está desactivada, la PyObject_Malloc / PyObject_Free que pasa a través a la normalidad malloc / libre, que valgrind sabe cómo realizar el seguimiento.

Paquete disponible aquí: https://launchpad.net/~jamesh/+archive/python

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top