Frage

Ich habe in meinem Python C-Erweiterung zu debuggen Speicher Absturz versucht und versuchte Skript unter valgrind auszuführen. Ich fand es zu viel „Lärm“ in der valgrind Ausgang, auch wenn ich ran einfachen Befehl haben wie:

valgrind python -c ""

Valgrind Ausgang voller wiederholt info wie folgt aus:

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

Ist es ein normales Verhalten? Wenn ja, dann valgrind vielleicht unpassend Tool Speicherfehler in Python für das Debuggen?

War es hilfreich?

Lösung

Sie könnten versuchen, die Verwendung von Unterdrückung Datei dass kommt mit der python-Quelle

Lesen Sie die Python Valgrind README ist eine gute Idee zu !

Andere Tipps

Dies ist durchaus üblich, in jedem largish System. Sie können Valgrind die Verwendung Unterdrückungssystem explizit Unterdrückungs-Warnungen dass Sie nicht interessiert sind.

Die richtige Option ist Valgrind zu sagen, dass es Python Zuordnungsfunktionen abfangen sollte. Sie sollten valgrind / coregrind / m_replacemalloc / vg_replace_malloc.c Hinzufügen der neuen Abfangjäger für PyObject_Malloc, PyObject_Free, PyObject_Realloc, z Patch:.

ALLOC_or_NULL(NONE,                  PyObject_Malloc,      malloc);

(beachten Sie, dass die soname für Benutzer Zuordnungsfunktionen sollten NONE sein)

Nach Links gegeben durch Nick konnte ich einige Updates auf finden README.valgrind . In einem Wort, für Python> 3.6 können Sie PYTHONMALLOC=malloc Umgebungsvariable, um wirksam die Warnungen zu deaktivieren. Zum Beispiel in meiner Maschine:

export PYTHONMALLOC=malloc
valgrind python my_script.py

erzeugt keine Fehler zu Python.

Ja, das ist typisch. Große Systeme lassen oft Speicher un-befreit, was in Ordnung ist, so lange es eine konstante Menge ist, und nicht proportional zur Lauf Geschichte des Systems. Die Python-Interpreter in diese Kategorie fällt.

Vielleicht können Sie die valgrind Ausgabe filtern, um nur auf Zuweisungen in Ihrer C-Erweiterung gemacht zu konzentrieren?

Es gibt eine andere Möglichkeit, die ich gefunden. James Henstridge hat Maßarbeit von Python, die die Tatsache erkennen kann, dass Python unter valgrind läuft und in diesem Fall pymalloc allocator deaktiviert ist, mit PyObject_Malloc / PyObject_Free, die durch den normalen malloc / free, das valgrind weiß, wie zu verfolgen.

Package finden Sie hier: https://launchpad.net/~jamesh/+archive/python

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