2012-05-11 23 views
2

.NET Remotingを使用して複数のクライアントが主に接続されているサービスである.NET 2.0アプリケーションがあります。サービス中にクライアントのサイトでOutOfMemory例外がクラッシュするため、予期しないクラッシュを避けるため、現在は毎日強制的に再起動しています。ネイティブヒープ関連の.NETアプリケーションでのメモリリーク

以前は、マネージコード(静的コレクションに保存されているオブジェクトのクリーンアップではなく、論理スレッド番号が連続的に増加していた別のもの)でメモリリークの2つのケースを解決しました。だから私はかなりメモリダンプをキャプチャし、WinDbg + SOSでそれらを検索することに精通しています。

しかし、この場合、すべてのヒープ上のバイトが安定している間にプライベートバイトが上昇し、アンマネージドコードメモリリークを示します。私はそれがより明確になり、実際のOOM例外でクラッシュダンプを受け取っ:テスFerandezの.NETアプリケーションにアンマネージコードに漏洩に対処についてのブログだけでなく、周りのいくつかの他のリソースを確認する

!address -summary

ネットでは、ダイナミックアセンブリ、共通XmlSerializer号、またはサードパーティのネイティブDLL(何もありません)の多くの問題を除外しました。しかし、P/Invokeの数が多い。 2番目のコマンドは、同様にすべてのエントリを返さ

heaps

:今後、ヒープをチェックすると、次の私に戻りました。今、私は読んでいくつかのものによると、私はスタックを取得する!ヒープ-p -aを実行する必要がありますが、私が得るすべては、this questionに応じしかし、誤ったGFLAGSの使用などである

this

ですローカルでサービスを開始してデバッガを接続すると、現在ではなく、のオプションがあります。長い話を簡単に言えば、クライアントと同様の設定と負荷で環境をセットアップしなければなりません。これは準備ができていません。

だから、私はかなり固執しています。私はここからどこへ行くべきか、または私がその問題のトラブルシューティングに正しいアプローチを使用している場合でも、わからない。どのポインタも歓迎されている以上のものです。

編集#1:外部リソースを使用するスレッドのThread.abort。具体的には、OracleのODP.NETプロバイダによるデータベース接続です。それがネイティブヒープのリークの原因になりますか?

+0

さらにスタック情報を有効にするために、そのプロセスのgflagsにユーザーモードスタックトレースフラグを設定しましたか?例えばgflags.exe/i process.exe + ust – snowdude

+0

これは、メモリダンプがキャプチャされたクライアントでセットアップすることを意味しますか?はいの場合は、私はそれを見て、それは非常に難しい(それは技術的な理由を超えていないだろう)。 – nantito

+0

ええ、プロセスが実行されているマシン上で実行します。がんばろう。 – snowdude

答えて

2

しかし、起動/ Pのかなりの数があり

編集#1

周り:Thread.abort持っている条件の完璧な嵐だ外部リソース

を使用したスレッド上この種の問題。どちらも、制御不能なメモリリークを引き起こすだけで十分です。それは確かにすべてがあなたのdevのマシン上で素敵なように見えます。しかし、実際のマシンが処理している種類のデータロードを行使していないことは確かです。

あなたはツーリングから多くの助けを得るつもりはありません。間違いなく、スレッドの中断を完全に取り除くことから始めます。それだけでうまくいくわけではありません。特定のアドバイスをするためにこれを非常に難しくしている理由で文脈を与えなかった。確かに、偽の自動生成データを使用してデータベースを設定して、キュービクルの快適さの中でコードの調整を確認できます。あなたは十分に速く漏れないので、たくさんのデータが必要です。

問題が解決しない場合は、gflags.exeやumdh.exeのようなツールが必要です。これは、Windows用のデバッグツールで利用できます。現在はSDKの一部です。最後の手段として、デバッグシンボルだけでうまくいきます。オラクルはこれほど簡単ではありません。彼らのエコシステムは、あなたの問題を抱えている高額コンサルタントを移転させるのにも親しみがあります。あなたが正しいものを見つけたらうまくいくでしょう。

+0

あなたの答えをありがとう。私はこの事件のために受け取ったOOMクラッシュダンプだけで何もできないことを確かめたかったのです。ローカルで複製するか、またはクライアントのインスタンス上のプロセスに対してユーザーモードのスタックトレースを設定するかのどちらかです。それを難し​​くすることについては、私はどの方向に従うべきかはかなり分かりませんでした。火事によるバプテスマ! – nantito

関連する問題