Domanda

Ho cercato di incidente memoria di debug in mia estensione Python C e ho cercato di eseguire script con valgrind. Ho trovato c'è troppo "rumore" nell'output valgrind, anche se io ho fatto funzionare semplice comando come:

valgrind python -c ""

uscita Valgrind pieno di informazioni ripetute in questo modo:

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

E 'un comportamento normale? Se è così allora valgrind forse è uno strumento inadeguato per il debug di errori di memoria in Python?

È stato utile?

Soluzione

Si potrebbe provare a utilizzare il file di soppressione che viene fornito con il sorgente Python

Python Valgrind README è una buona idea anche !

Altri suggerimenti

Questo è abbastanza comune, in qualsiasi sistema abbastanza grande. È possibile utilizzare di Valgrind sistema di soppressione per sopprimere in modo esplicito le avvertenze che non sei interessato a.

L'opzione più corretta è quella di dire Valgrind che dovrebbe intercettare funzioni di allocazione di Python. Si dovrebbe patchare valgrind / coregrind / m_replacemalloc / vg_replace_malloc.c aggiungendo i nuovi intercettori per PyObject_Malloc, PyObject_Free, PyObject_Realloc, per esempio:.

ALLOC_or_NULL(NONE,                  PyObject_Malloc,      malloc);

(si noti che il soname per funzioni di allocazione agli utenti dovrebbe essere NONE)

A seguito di link forniti da Nick sono stato in grado di trovare alcuni aggiornamenti su README.valgrind . In una parola, per Python> 3.6, è possibile impostare variabile d'ambiente PYTHONMALLOC=malloc per disabilitare in modo efficace gli avvisi. Per esempio, nella mia macchina:

export PYTHONMALLOC=malloc
valgrind python my_script.py

non produce alcun errore relativo a Python.

Sì, questo è tipico. sistemi di grandi dimensioni spesso lasciano la memoria non-liberata, che va bene finché si tratta di una quantità costante, e non proporzionale alla storia di funzionamento del sistema. L'interprete Python rientra in questa categoria.

Forse si può filtrare l'output Valgrind di concentrarsi solo su accantonamenti nell'estensione C?

C'è un'altra opzione che ho trovato. James Henstridge ha generazione personalizzata di pitone in grado di rilevare il fatto che Python in esecuzione sotto valgrind e in questo caso pymalloc allocatore è disabili, con PyObject_Malloc / PyObject_Free passando alla normalità malloc / libero, che valgrind sa come tenere traccia.

Il pacchetto disponibile qui: https://launchpad.net/~jamesh/+archive/python

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top