Question

J'ai essayé de plantage débogage de mémoire dans mon extension Python C et essayé d'exécuter le script sous valgrind. Je trouve qu'il ya trop de « bruit » dans la sortie valgrind, même si j'ai couru commande simple:

valgrind python -c ""

Sortie Valgrind plein d'info répétée comme ceci:

==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 sur Slackware 12.2.

Est-ce un comportement normal? Si oui, alors peut-être est valgrind outil inapproprié pour le débogage des erreurs de mémoire en Python?

Était-ce utile?

La solution

Vous pouvez essayer d'utiliser le fichier de suppression est livré avec la source python

Lecture Python Valgrind README est une bonne idée aussi

Autres conseils

Ceci est assez fréquent, dans tout système largish. Vous pouvez utiliser système de suppression de Valgrind pour supprimer explicitement les avertissements que vous n'êtes pas intéressé par.

L'option la plus correcte est de dire Valgrind qu'il doit intercepter les fonctions d'allocation de Python. Vous devez patcher valgrind / coregrind / m_replacemalloc / vg_replace_malloc.c ajoutant les nouveaux intercepteurs pour PyObject_Malloc, PyObject_Free, PyObject_Realloc, par exemple:.

ALLOC_or_NULL(NONE,                  PyObject_Malloc,      malloc);

(notez que le soname pour les utilisateurs des fonctions d'allocation doit être NONE)

Après des liens donnés par Nick, j'ai pu trouver des mises à jour sur README.valgrind . En un mot, pour Python> 3.6, vous pouvez définir la variable d'environnement PYTHONMALLOC=malloc pour désactiver efficacement les mises en garde. Par exemple, dans ma machine:

export PYTHONMALLOC=malloc
valgrind python my_script.py

ne produit aucune erreur liée à python.

Oui, ce qui est typique. Les gros systèmes laissent souvent libéré un mémoire, ce qui est bien tant qu'il est une quantité constante, et non proportionnelle à l'histoire en cours d'exécution du système. L'interpréteur Python tombe dans cette catégorie.

Peut-être que vous pouvez filtrer la sortie valgrind de se concentrer uniquement sur les allocations faites dans votre extension C?

Il y a une autre option que j'ai trouvé. James Henstridge a version personnalisée de python qui peut détecter le fait que python fonctionnant sous valgrind et dans ce cas pymalloc allocateur est désactivé, avec passage PyObject_Malloc / PyObject_Free par la normale malloc / libre, qui valgrind sait comment suivre.

Forfait disponible ici: https://launchpad.net/~jamesh/+archive/python

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top