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する方法はありますか?
私は答えを見つけました こちら 。
Pythonもデバッグモードでコンパイルする必要があります。
./configure --prefix=/home/dejan/workspace/python --without-pymalloc --with-pydebug --with-valgrind
さらに、numpyには suppresion file があり、余分なvalgrind警告を取り除きます。
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_
環境変数が役立つ場合があります)
こちらもご覧ください: