2009-10-05 1 views
16

Python C拡張モジュールでメモリクラッシュをデバッグしようとしましたが、valgrindの下でスクリプトを実行しようとしました。valgrindの下でpythonを実行するとメモリに多くのエラーが発生するのは普通ですか?

==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:このような繰り返しの情報の完全な

valgrind python -c "" 

Valgrindの出力:私はのような簡単なコマンドを実行したにもあれば、valgrindの出力でも多くの「ノイズ」がある見つけました。 2 Slackware 12.2で。

正常な動作ですか?もしそうならば、valgrindはおそらくPythonのメモリエラーをデバッグするのに不適切なツールですか?

答えて

22

あなたのpythonソース

Python Valgrind READMEを読むこともいい考えですが付属していますsuppression fileを使用して試みることができます!

+0

ように高レベルの注記:一般的にValgrindはカスタムアロケータの動作を理解することができないため、カスタムアロケータの助けを必要とします。 – Falaina

+0

私はvalgrindのreadmeを正しく読めば、valgrindを使って自分のpythonディストリビューションをコンパイルせずにpythonのc拡張をデバッグすることはできませんか? –

0

はい、これが一般的です。大規模なシステムでは、メモリが解放されないことが多く、システムの実行履歴に比例しない一定量であれば問題ありません。 Pythonインタプリタがこのカテゴリに入ります。

おそらく、valgrindの出力をフィルタリングして、Cエクステンションでの割り当てにのみ集中することができますか?

2

これは大規模なシステムでは非常に一般的です。あなたはValgrindののsuppression systemが明示的にあなたに興味を持っていないなら、警告を抑制するために使用することができます。

0

私が見つけた別のオプションがあります。 James Henstridgeはpythonのカスタムビルドを持っています。これは、valgrindの下で実行されているpythonとこの場合のpymallocアロケータが無効で、PyObject_Malloc/PyObject_Freeが通常のmalloc/freeに渡っていることを検出できます。ここで利用可能

パッケージ:https://launchpad.net/~jamesh/+archive/python

1

最も正しいオプションは、Pythonの割り当て関数をインターセプトする必要があることValgrindのを伝えることです。 あなたが例えばPyObject_Malloc、PyObject_Free、PyObject_Realloc、のための新しいインターセプタ追加valgrindの/ coregrind/m_replacemalloc/vg_replace_malloc.cにパッチを適用する必要があります

ALLOC_or_NULL(NONE,     PyObject_Malloc,  malloc); 

(ユーザー割り当て関数のためのSONAMEがNONEでなければならないことに注意してください)

関連する問題