サンドボクシングでは、メモリリーク状のサードパーティdll
-
02-10-2019 - |
質問
少なくとも私が使用しなければならない漏れやすいDLLの症状を治す方法を探しています。ライブラリ(OpenCascade)はメモリマネージャーを提供すると主張していますが、私はそれが割り当てられたメモリを解放することができないことをまだ持っています。
OCCモジュールがもう実行されていない間にアプリケーションがメモリを失わないようにするために、少なくともこのモジュールへの呼び出しを「サンドボックス」に入れたいと思います。
私の質問は次のとおりですが、そうするのは醜いハック(TM)になることに気づきますが、ライブラリが具体的に使用するメモリを具体的に使用するか、周りに何らかの砂箱を構築することは可能ですか。私が終わったときに自分でリリースするために使用した記憶の領域を追跡しますか?
それとも、それは醜いハックであるでしょう、そして、私はそれ以外の問題を解決しようとするべきですか?
解決
唯一の信頼できる方法は、ライブラリの使用を専用のプロセスに分離することです。そのプロセスを開始し、データとパラメーターを渡し、ライブラリコードを実行し、結果を取得します。メモリの消費が許容できなくなったら、プロセスを再起動できなくなります。
他のヒント
壊れていないライブラリを使用するのはおそらくはるかに簡単ですが、交換用のINSが利用できない場合は、割り当てコールをインターセプトしてみてください。ライブラリが「最適化されている」(特に関数インライン化)それほどひどくない場合は、それを分解して、mallocと自由関数を見つけることができます。読み込み時に、アドレスをエンコードする4つの(またはP64システムの8つのシステム)バイトシーケンスごとに、独自のメモリアロケーターを指すものと交換できます。ただし、これはバギーで読みにくいTimeSinkであることがほぼ保証されているため、作業代替品を見つけることができればこれを行わないでください。
編集:
@Sharptoothの答えを見ました。私はまだ代替品を見つけようとすることをお勧めします。
あなたはローマ・ライゴンの意見を聞くべきです - 彼はかつてOCCで働いていました。彼はメモリ管理に言及する少なくとも1つの投稿を持っています http://opencascade.blogspot.com/2009/06/developing-parallel-applications with_23.html.
あなたがうまく尋ねると、彼はMMGTの内部を説明する投稿を書くかもしれません。