Wie benutze ich Valgrind mit Python?

Ich versuche, eine C-Python-Erweiterung zu überprüfen, die ich schreibe, aber ich habe Probleme, valgrind für die Arbeit mit Python einzurichten. Ich würde mich sehr über einen Rat freuen. Nur für den Kontext ist dies Ubuntu 13.10, Python 2.7.5+ und Valgrind 3.8.1.

Gemäß Empfehlung vonReadme.valgrind Ich habe folgendes gemacht.

1) Lade die Python-Quelle mit herunter

sudo apt-get build-dep python2.7
apt-get source python2.7

2) Wendet den Code-Patch an, d. H. "Kommentar zu Py_USING_MEMORY_DEBUGGER in Objects / obmalloc.c entfernen".

3) Wendet den Unterdrückungs-Patch an, d. H. "Kommentiere die Zeilen in Misc / valgrind-python.supp aus, die die Warnungen für PyObject_Free und PyObject_Realloc unterdrücken".

4) Kompilierte Python mit

./configure --prefix=/home/dejan/workspace/python --without-pymalloc
make -j4 install

Beachten Sie, dass ich sowohl 2 als auch 3 gemacht habe, während README.valgrind 2 oder 3 sagt ... mehr kann nicht schaden.

Jetzt testen wir dies an einem Beispiel-Python-Code intest.py

print "Test"

Lassen Sie uns mit diesem Skript Valgrind auf Python ausführen

valgrind --tool=memcheck --leak-check=full --suppressions=python2.7-2.7.5/Misc/valgrind-python.supp bin/python test.py

Unerwarteterweise gibt es immer noch jede Menge Berichte von valgrind, von denen der erste (und viele weitere folgen) ist.

==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)

Mache ich etwas falsch? Gibt es eine Möglichkeit, ein Python-Skript zu valgrinden, das nicht leckt und eine saubere valgrind-Ausgabe erhält?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage