12

私は、多くのオープン ソースのサードパーティ ライブラリを使用する Python アプリケーションに取り組んでいます。ライブラリの 1 つは に基づいておりctypes、最近 10 を超える個別のメモリ リークが見つかりました。これらのリークの原因は、明示的なデストラクタ ( Python ではガベージ コレクションができないc_char_p) を持つオブジェクトの循環参照から、非 const 文字配列を返す関数の戻り値の型としての使用(文字配列が Python 文字列に自動的に変換され、元の C 割り当て配列は決して解放されません。)

見つけたリークを修正し、ライブラリの作成者にプル リクエストを送信しました。ループ内でオブジェクトを作成および削除し、その際の Python のメモリ使用量を監視することで、非常に非公式なテストをいくつか行いました。すべてのリークを見つけたと思います。ただし、このライブラリをオープンソースにしたいアプリケーションで使用することを計画しており、できれば他の人に使用してもらいたいので、それ以上に確信したいと思います。だから私の質問は:ベースのライブラリでメモリリークを見つける体系的な方法はありますか?ctypes

すでに見つかったリークを修正する過程で、Heapyobjgraphを試しましたが、どちらもこの目的には特に役に立ちませんでした。私が知る限り、どちらも Python ヒープに割り当てられたオブジェクトのみを表示するため、C ライブラリによって割り当てられたヒープ領域の不適切な処理によるリークを見つけるのには役に立ちません。C ヒープの割り当てを表示できる Python で使用できるツールはありますか?

4

1 に答える 1

5

Valgrindでアプリケーションを実行してみてください。Valgrindは、コンパイルされたアプリケーションでのメモリ使用をプロファイリングするための便利なツールです。これにより、少なくともリンクが検出され、そのソースが報告されます。

Pythonの呼び出しから間違いなく誤検知が発生します。特定の種類のエラーを明確に無視できる抑制の使用方法の詳細については、このサイトを確認してください。Pythonの事前に作成された抑制のリスト(ここ)、およびそれらが必要な理由の説明(ここ)も参照してください。

于 2012-10-01T01:34:02.077 に答える