GDBを使用したPythonメモリデバッグ
質問
OpenSSLのPythonバインディングを使用するLinuxアプリケーションがあり、ランダムクラッシュを引き起こしていると思われます。時折、次のメッセージでクラッシュすることがあります:
Pythonの致命的なエラー:GCオブジェクトは既に追跡されています
これは、ライブラリの一部のプログラミングエラー、またはメモリ破損の兆候のいずれかと思われます。コアファイルを指定して、実行されたPythonソースコードの最後の行を知る方法はありますか?または、それがGDBに添付されている場合は?私はそれがおそらくすべてコンパイルされたバイトコードであることを知っていますが、私はそこに誰かがこれに対処したかもしれないことを望んでいます。現在、トレースモジュールがアクティブな状態で実行されており、再び発生することを期待していますが、しばらく時間がかかる可能性があります。
解決
はい、あなたはこの種のことをすることができます:
(gdb) print PyRun_SimpleString("import traceback; traceback.print_stack()")
File "<string>", line 1, in <module>
File "/var/tmp/foo.py", line 2, in <module>
i**2
File "<string>", line 1, in <module>
$1 = 0
Python
また、メモリの問題が疑われる場合、 valgrind
を使用できることに注意してください。再コンパイルする準備ができている場合は、Pythonを使用します。手順については、こちら
他のヒント
PythonでCライブラリをラップするためにCDLLを使用しており、これが64ビットLinuxである場合、CDLLラッパーが正しく構成されていない可能性が高くなります。 CDLLはデフォルトですべてのプラットフォームでint戻り値の型(64ビットシステムではlong longである必要があります)に正しい引数を渡すことを期待しています。この場合、CDLLラッパーを確認する必要があるかもしれません...
上記のすべてに加えて、トレースモジュール。