それはvalgrindの下で実行されているPythonはメモリを多くのエラーが表示されていることを正常ですか?
-
19-09-2019 - |
質問
私は自分のPython C拡張でデバッグメモリクラッシュしようとしたとvalgrindの下にスクリプトを実行しようとしました。
:私はのような簡単なコマンドを実行したにもあれば、valgrindの出力でも多くの「ノイズ」があるましたvalgrind python -c ""
このような繰り返しの情報の完全なValgrindの出力:
==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)
のSlackware 12.2上のPython 2.5.2ます。
これは正常な動作ですか?そうならば、valgrindの、多分、Pythonでメモリエラーをデバッグするための不適切なツールです?
解決
あなたは抑制ファイルを使用して試みることができることPythonのソースが付属しています。
のPythonのValgrindのREADME を読むことは、あまりにも良いアイデアです!
他のヒント
これは、任意の大きめのシステムでは、非常に一般的です。あなたは明示的に警告を抑制するためのValgrindの抑制システムを使用することができますあなたに興味がないこと。
最も正しいオプションは、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
されるべきであることに注意してください)
以下のリンクREADME.valgrindする
。一言で、Pythonの> 3.6のために、あなたは効果的に警告を無効にするにはPYTHONMALLOC=malloc
環境変数を設定することができます。例えば、私のマシンでます:
export PYTHONMALLOC=malloc
valgrind python my_script.py
のpythonに関連するすべてのエラーを生成しません。
はい、これが典型的です。大規模なシステムは、多くの場合、メモリの未解放され、そうであれば、一定量、およびシステムの実行中の歴史に比例していないようで結構ですままにしておきます。 Pythonインタプリタは、このカテゴリに分類されます。
おそらく、あなたは、あなたのC拡張で行われた割り当てに集中するvalgrindの出力をフィルタリングすることができますか?
私が見つけた他のオプションがあります。ジェームズ・ヘンストリッジはvalgrindの下にあり、この場合のpymallocアロケータで実行されているPythonがPyObject_Malloc / PyObject_Freeはvalgrindのを追跡する方法を知っている通常のmalloc /無料に通過すると、無効になっていることを検出することができますのpythonのカスタムビルドを持っています。
ここで入手可能パッケージ: https://launchpad.net/~jamesh/+archive/python の