18

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でメモリエラーをデバッグするための不適切なツールですか?

4

6 に答える 6

22

Pythonソースに付属の抑制ファイルを使用してみてください

Python Valgrind READMEを読むのも良い考えです!

于 2009-10-05T11:45:32.207 に答える
2

これは、大規模なシステムでは非常に一般的です。Valgrindの抑制システムを使用して、関心のない警告を明示的に抑制することができます。

于 2009-10-05T11:29:16.783 に答える
1

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

ALLOC_or_NULL(NONE,                  PyObject_Malloc,      malloc);

(ユーザー割り当て関数の soname は である必要があることに注意してくださいNONE)

于 2009-12-18T09:22:51.340 に答える
0

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

おそらく、valgrind出力をフィルタリングして、C拡張機能で行われた割り当てのみに焦点を当てることができますか?

于 2009-10-05T11:23:35.140 に答える
0

私が見つけた別のオプションがあります。James Henstridge は、Python が valgrind の下で実行されているという事実を検出できるカスタム ビルドを持っています。この場合、pymalloc アロケータが無効になっています。

ここで入手可能なパッケージ: https://launchpad.net/~jamesh/+archive/python

于 2009-12-02T12:20:27.270 に答える