Frage

Ich schreibe eine Python-Erweiterung, die Speicher zu undichten scheint. Ich versuche, die soure des Problems mit valgrind herauszufinden.

Allerdings scheint es, dass Python selbst Speicher nach valgrind ist undicht. Mit dem folgenden einfachen Skript:

hello.py

  print "Hello World!"

und tun

> valgrind --tool=memcheck python ./hello.py

(...)
==7937== ERROR SUMMARY: 580 errors from 34 contexts (suppressed: 21 from 1)
==7937== malloc/free: in use at exit: 721,878 bytes in 190 blocks.
==7937== malloc/free: 2,436 allocs, 2,246 frees, 1,863,631 bytes allocated.
==7937== For counts of detected errors, rerun with: -v
==7937== Use --track-origins=yes to see where uninitialised values come from
==7937== searching for pointers to 190 not-freed blocks.
==7937== checked 965,952 bytes.
==7937== 
==7937== LEAK SUMMARY:
==7937==    definitely lost: 0 bytes in 0 blocks.
==7937==      possibly lost: 4,612 bytes in 13 blocks.
==7937==    still reachable: 717,266 bytes in 177 blocks.
==7937==         suppressed: 0 bytes in 0 blocks.
==7937== Rerun with --leak-check=full to see details of leaked memory.

Hat jemand eine Erklärung für dieses Verhalten strage? Ist das Python-Interpreter wirklich Speicher undicht?

Welches Tool Python-Entwickler ihre Speicherlecks debuggen verwenden?

War es hilfreich?

Lösung

Es gibt eine ganze README.valgrind in dem Python Quellen, die die verschiedenen Einsprüche versuchen, verwenden Valgrind mit Python erklärt:

http://svn.python.org/projects/python/ trunk / Misc / README.valgrind

Python uses its own small-object allocation scheme on top of malloc,
called PyMalloc.

Valgrind may show some unexpected results when PyMalloc is used.
Starting with Python 2.3, PyMalloc is used by default.  You can disable
PyMalloc when configuring python by adding the --without-pymalloc option.
If you disable PyMalloc, most of the information in this document and
the supplied suppressions file will not be useful.  As discussed above,
disabling PyMalloc can catch more problems.

If you use valgrind on a default build of Python,  you will see
many errors like:

        ==6399== Use of uninitialised value of size 4
        ==6399== at 0x4A9BDE7E: PyObject_Free (obmalloc.c:711)
        ==6399== by 0x4A9B8198: dictresize (dictobject.c:477)

These are expected and not a problem. 

Andere Tipps

Das Leck wird höchstwahrscheinlich kommt von Ihrer eigenen Neben, nicht von Python. Große Systeme oft Ausgang mit dem Speicher noch zugewiesen, nur weil es sich nicht lohnt es explizit zu befreien, wenn der Prozess über ohnehin zu beenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top