私はリークを持っているようなC#アプリケーションを開発しています。 私はメモリプロファイラを使用し、すべてのヒープの私プライベートバイト(ネイティブメモリ)のリークを解決するには?
プライベートバイトキープ増加が、バイトは、おそらくそれはネイティブメモリが
をリークしています今、私がこだわっていることを意味し、ないことを発見しましたネイティブコードでメモリリークを見つけるにはどうすればよいですか?
私はリークを持っているようなC#アプリケーションを開発しています。 私はメモリプロファイラを使用し、すべてのヒープの私プライベートバイト(ネイティブメモリ)のリークを解決するには?
プライベートバイトキープ増加が、バイトは、おそらくそれはネイティブメモリが
をリークしています今、私がこだわっていることを意味し、ないことを発見しましたネイティブコードでメモリリークを見つけるにはどうすればよいですか?
これ以上の情報なしであなたに固い応答を与えるのは難しいですが、使用しようとしているライブラリのメモリリークがあるようです。書き込まれた言語に応じて、適切なツールを使ってlibにアクセスする必要があります。libのソースがない場合は、開発者に連絡してリークを修正させてください。
ライブラリの名前と一部のソースコード(ネイティブメソッドシグネチャと同様)を投稿できる場合は、より具体的なアドバイスを行うことができます。
.netフレームワークで管理されているヒープのプライベートバイトは、あなたのソースを分析するためにプロのツールを使用する必要があります。そのような赤いゲートメモリプロファイラを使用して、オブジェクトが作成されたが、処分されていないことを見つける。
管理対象アプリケーションでのネイティブメモリリークの診断は、他のネイティブアプリケーションでのメモリリークの診断と(少なくとも最初は)非常によく似ています。
通常、これらの問題にアプローチする方法は、大量のメモリをリークさせ、完全なプロセスダンプを取得し、ダンプを調べて最も多くのメモリを使用しているかどうかを確認することです。例えば、あなたのプロセスが〜20MBの通常/初期のプライベートバイトを持っていても、プライベートバイトが約200MBあるまでプロセスにメモリがリークする可能性がある場合、〜180MBのメモリが漏れてしまう可能性があります割り当てられたメモリが最も多いものはどこから探し始めるべきかです。
MicrosoftはDebugDiagと呼ばれる非常に便利なツールを持っている - 最初にメモリの問題を扱うときに、それは非常にvesatileツールであり、非常に便利IISでメモリリークの診断に使用するために開発します。クラッシュダンプを与えると解析が実行され、どのモジュールがそのメモリをすべて割り当てたのかがわかるはずです。そうすれば、そのモジュールがどのように使われているかを具体的に調べることができます。
通常、ANTS Memory Profilerを使用してメモリリークを検出すると、最良の結果が得られました。
(Or other tools、個人的に私はANTSで最高の経験を持っていた)
まずあなたが漏れプロセスのダンプを持っている場合、あなたはWinDbgの中でそれを開いて、コマンドを発行することができます。
-summaryを解決!これはネイティブのリークである場合、あなたは2つのオプションがあります:
使用DebugDiag:プロンプトを、「ネイティブメモリリークをリークハンドル」を選択、あなたが診断したいプロセスを選択し、メモリリークを実験するまで、アプリケーションの操作を開始してください。完了したら、アプリケーションの完全なダンプを生成します(リークルールを右クリックし、[フルユーザダンプ]を選択します)。生成されたダンプを分析することができます(これを効率的に機能させるには、適切なシンボルを設定する必要があります): 'advanced analysis'タブで 'Memory pressure analyser'を選択し、ダンプファイルを開き、 'Start analysis'を押します。これは、あなたが分析することができるレポートを生成し、HTMLします。詳細なウォークスルーについてはpageを参照してください。
Application Verifier/WinDbgを使用します。アプリケーション検証プログラムで、アプリケーション(.exe)を選択します。テストページで、[基本/ヒープ]が選択されていることを確認します。下のウィンドウで、[トレース]がtrueに設定されていることを確認します。構成が保存されたら、アプリケーションを再実行し、リークが発生したときに完全なダンプを生成します。ダンプが生成された後、アプリケーションフラグをクリーンアップすることを忘れないでください。次に、WinDbg内からダンプを開き、 '!heap'コマンドを使用してリークを調べることができます。特に、 '!heap -l'はリークしたブロックのリストを表示し、 '!heap -p -a'はブロックの詳細を表示します。
これは.NETリークの場合、トラブルシューティングするサードパーティのツールがあります。バージョン1.2以降、DebugDiagは.NETメモリリーク解析(これを試したことはありません)も実行できます。
リークはどこですか?私たちはコードなしであなたを助けることはできません... –
C#でネイティブコードを書くことはありません。確かにあなたができるのは、あなたがInterOpを適切に処理していることを確認することだけです。 –
これはプロファイラーでよく見られる問題です。成長するプライベートバイトは珍しいことではなく、安定するまでにはしばらく時間がかかることがあります。あなたは実際にOutOfMemory例外を受け取りますか?そうでなければ、無視するビットを反転させます。 –