2009-10-05 6 views
16

J'ai essayé de déboguer la mémoire crash dans mon extension Python C et j'ai 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:Est-il normal que l'exécution de python sous valgrind montre de nombreuses erreurs avec la mémoire?

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, valgrind est peut-être un outil inapproprié pour déboguer les erreurs de mémoire en Python?

Répondre

22

Vous pouvez essayer d'utiliser la suppression file qui vient avec la source python

La lecture du Python Valgrind README est une bonne idée aussi!

+0

Comme une note de haut niveau: En général, Valgrind a besoin d'aide avec les allocateurs personnalisés, car il ne peut pas comprendre le comportement d'un allocateur personnalisé, comme cela pourrait être le cas avec une implémentation standard. – Falaina

+0

donc, si je lis correctement le readme valgrind, je ne peux pas vraiment utiliser valgrind pour déboguer une extension python c sans compiler ma propre distribution python ?! –

0

Oui, c'est typique. Les grands systèmes laissent souvent la mémoire non libérée, ce qui est bien tant que c'est une quantité constante, et non proportionnelle à l'historique courant du système. L'interpréteur Python tombe dans cette catégorie.

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

2

Ceci est assez commun, dans n'importe quel système. Vous pouvez utiliser suppression system de Valgrind pour supprimer explicitement les avertissements que vous n'êtes pas intéressé par.

0

Il y a une autre option que j'ai trouvée. James Henstridge a une construction personnalisée de python qui peut détecter le fait que python s'exécute sous valgrind et dans ce cas l'allocateur pymalloc est désactivé, PyObject_Malloc/PyObject_Free passant à normal malloc/free, que valgrind sait suivre.

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

1

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 les soname pour les utilisateurs des fonctions d'allocation doit être NONE)

Questions connexes