web-dev-qa-db-ja.com

pythonでvalgrindを使用するには?

C python私が書いている拡張機能をmemcheckしようとしていますが、pythonで動作するようにvalgrindをセットアップするのに問題があります。本当にアドバイスをいただければ幸いです。 13.10、python 2.7.5+、およびvalgrind 3.8.1。

Readme.valgrind 私は次のことをしました。

1)pythonソースをダウンロード

Sudo apt-get build-dep python2.7
apt-get source python2.7

2)コードパッチ、つまり「Objects/obmalloc.cでPy_USING_MEMORY_DEBUGGERのコメントを解除する」を適用しました。

3)抑制パッチ、つまり「PyObject_FreeおよびPyObject_Reallocの警告を抑制するMisc/valgrind-python.suppの行のコメントを解除する」を適用しました

4)コンパイル済みpython with

./configure --prefix=/home/dejan/workspace/python --without-pymalloc
make -j4 install

README.valgrindが2または3を実行するように指示している間、私は2と3の両方を実行したことに注意してください。

それでは、いくつかのサンプルでこれをテストしてみましょうpython code in test.py

print "Test"

このスクリプトでpythonでvalgrindを実行しましょう

valgrind --tool=memcheck --leak-check=full --suppressions=python2.7-2.7.5/Misc/valgrind-python.supp bin/python test.py

意外なことに、valgrindからのレポートがまだたくさんあります。最初のものは(そしてさらに多くの)

==27944== HEAP SUMMARY:
==27944==     in use at exit: 857,932 bytes in 5,144 blocks  
==27944==   total heap usage: 22,766 allocs, 17,622 frees, 4,276,934 bytes allocated
==27944== 
==27944== 38 bytes in 1 blocks are possibly lost in loss record 24 of 1,343
==27944==    at 0x4C2A2DB: malloc (in /usr/lib/valgrind/vgpreload_memcheck-AMD64-linux.so)
==27944==    by 0x46B8DD: PyString_FromString (stringobject.c:143)
==27944==    by 0x439631: PyFile_FromFile (fileobject.c:157)
==27944==    by 0x4E9B4A: _PySys_Init (sysmodule.c:1383)
==27944==    by 0x4E29E9: Py_InitializeEx (pythonrun.c:222)
==27944==    by 0x4154B4: Py_Main (main.c:546)
==27944==    by 0x577DDE4: (below main) (libc-start.c:260)

私は何か間違っていますか? pythonリークせず、クリーンなvalgrind出力を取得しないスクリプトをvalgrindする方法はありますか?

43

私は答えを見つけました こちら

Pythonもデバッグモードでコンパイルする必要があります。

./configure --prefix=/home/dejan/workspace/python --without-pymalloc --with-pydebug --with-valgrind

さらに、numpyには suppresion file があり、余分なvalgrind警告を取り除きます。

43

python 3.6)なので、PYTHONMALLOC環境変数があり、リリースビルドで再コンパイルせずに使用できます。

PYTHONMALLOC=malloc python3 foobar.py

これにより、pymallocが無効になり、libc mallocが直接使用されるだけで、valgrindフレンドリーになります。これは--without-pymallocと同等です(同じくらい遅いです)

Valgrindが遅すぎる場合は、他の値が役立つ場合があります。 PYTHONMALLOC=debugおよびPYTHONMALLOC=malloc_debugは、それぞれデフォルトおよびlibcアロケーターの上にデバッグフックを追加します。ドキュメントからの効果:

  • 新しく割り当てられたメモリはバイト0xCBで埋められます
  • 解放されたメモリはバイト0xDBで埋められます
  • PythonメモリアロケータAPIの違反を検出します。たとえば、PyObject_Free()は、PyMem_Malloc()によって割り当てられたメモリブロックで呼び出されます。
  • バッファーの開始前に書き込みを検出します(バッファーアンダーフロー)
  • バッファの終了後の書き込みを検出(バッファオーバーフロー)
  • PYMEM_DOMAIN_OBJ(例:PyObject_Malloc())およびPYMEM_DOMAIN_MEM(例:PyMem_Malloc())ドメインのアロケーター関数が呼び出されたときにGILが保持されていることを確認します。

これにより、初期化されていない読み取り、解放後の使用、バッファアンダー/オーバーフローなどがキャッチされますが、リークは報告されず、python(When glibcを使用すると、MALLOC_PERTURB_およびMALLOC_CHECK_環境変数が役立つ場合があります)

こちらもご覧ください:

18
dequis