メモリリークの混合モードのC++/CLRアプリケーション
-
23-08-2019 - |
質問
私はこの問題は遅いのでメモリリークは私の混合モードのC++/CLR.純ます。
(このネイティブC++静的にリンクされるライブラリは、VS2008C++/CLR Windows Formsアプリの"/clr"コンパイラの設定)
典型的な行動:アプリとして利用開始30MB(民間をいたしました。その漏えいメモリslowishいるか、というとMBの一時間毎に実行する場合の下での模擬重負荷時のものです。これを模擬するシミュレーションアプリとライブのための日又は週間です。
された利用のためのツールを以下に、メモリリークを含むものCRTデバッグも付属しているのVisual Studio CRT lib.私も使用され、商用漏れ検知ツール"メモリValidator").
両報告を無視できるメモリリークでシャットダウン(干のエントリが金額-数KBしているところになっ内にあります。また、できることに追跡するメモリがあるようには見えません金額がいいと思うからできるメモリで開催され、完成されたアプリにしたいものです。私5MBのメモリの合計>30MB).
ツール(メモリバリデータはセットアップ-トラックすべてのメモリ使用量を含むmallocのための新た仮想メモリの割り当て、ビバップからハードバップのその他の種類のメモリ割り当て).基本的には、毎の設定をメモリにトラックが選択されています。
きます。純画像との報告を使用しておりますので周り1.5MBのメモリからperfmon).
こちらは最終的にビットの情報:してバージョンのアプリを走るとして、ネイティブコンソール-アプリケーション(純ネイティブなCLRるのです。これは95%と同じ混合モード以外のUI。このように見えませんメモリリーク、ピーク時5MB民間のバイトです。
なので基本的にはどのようにしているアではないと思い、ネイティブコードは漏洩します。
他のパズル:これはメモリリークの混合モードの用途をターゲットにする場合は2.0の枠組み(い): http://support.microsoft.com/kb/961870
残念ながら詳細はinfuriatingly sparseさんの投稿をしてください。かったので試しに向3.5枠組みではなく2.0も同じだった問題もなかったことです。
誰でもいう方に。
は数え上げればきりがないことがあった:
- その他の種類のメモリを割当てることん追跡?
- どのように表せん。私5MBのCRTのメモリ使用量1.5MB。純記憶のなかのアプリを使30MB民間のバイト?あるすべての巻き込みます。純させていただきます。なんでこれらの漏えいツールなのでしょうか?います。NETフレームワークがどの割り当てられたメモリ?
- その他の漏れ検知ツールや混合モードのアプリ?
感謝の手
ジョン
解決
OK、私は最終的に問題を発見しました。
これは、/ EH(例外処理)のための間違った設定によって引き起こされた。
基本的には、混合モードの.NETアプリで、あなたはすべて静的にリンクLIBSのは/ EHAの代わりに、デフォルトの/のEHしてコンパイルされていることを確認する必要があります。
(アプリ自体も/ EHAしてコンパイルする必要がありますが、これが与えられている - あなたはそれを使用しない場合、コンパイラはエラーを報告します、あなたが他の静的ネイティブLIBSにリンクする際に問題がある。。)
問題は、/のEHでコンパイルされたネイティブライブラリの中にスローされたアプリの管理ビットでキャッチ例外は、正しく例外を処理していない終わるということです。 C ++のオブジェクトのデストラクタは、その後、正しく呼び出されません。
それは見つけるために私の年齢を取った理由私の場合、これが唯一のため、まれな場所で発生します。
他のヒント
のようなスペンシ言っていたが、C++/CLI;)....
のためのanyオブジェクトで使っているC++/CLI,作成した場合は、そのオブジェクトのからだのC++コードを実際に試したほうがよいでしょう利用スタックの配分seymanticsものの、これはコンパイラのマジックトラムを乗り継いで行けるような設定メソッドは、入れ子の__try{}__最後に{}諸表に使用されることがあります。用からネイティブコードは設定のようなゆったり呼び出し処理).
上の仕上げの 第のコードでこのプロジェクト C++/CLIスタックの配分を意味論できるのはとても良いし、深さ約束を使用{}.
また、あなたを削除する必要のanyオブジェクトのことをimplment IDisposableとができませ------------処理のC++/CLI、削除はこのただいた場合には、ご使用しないスタックの意味..
私は普段通りに自の流れとして割り当てnullptrが私の仕上げたオブジェクトのだ。
また、チェックアウトしたいとし この記事のメモリの問題,perticularlyつのイベント、契約者の場合は割り当イベントへの物体ますので、漏れ...
として最も活発には、最初の、一つのことによって、過去のCLRプロファイラAPI この他の記事 どのようなこの作家さん(ジェイHilyard)の一例と回答;
- ます。ネットタイプに使用される方 多くのオブジェクトインスタンスが 配?
- のつくり、インスタンス 各タイプの?
- う通知 のGCを提供し を通じて収集う ができます。
- ただし一部のサービスについては、GC 収集のオブジェクトインスタンス?
はまようより一部の商品プロファイラ、のっている時には誤解を招きに応じて配分porofile(ちなみ.見出しのための大ヒープオブジェクト課題>~83kb物は、特殊な取り扱い、その場合は、今までの話は、の巨大オブジェクトのヒープ:).
され、より少しもの---
んの前にのみ用いて画像負荷のない充電やその他のdisernable統計を行うことが必要になる場合があり以下に、一部の対応やローダーの問題(ローダーロック最終的に)、その前に、お試しいただくことが可能であ 制約のある執行地域, も不思議にも残念なことに困難なレトロフィット以外の純粋なコードです。
この最近の MSDN Mag, 条文のコミュニケーションも楽しみのperfmon型メモリsperlunking(フォローアップのための この古い方).
から VS暴のブログ, れの利用方法を示しSOS visual studioできる、お手軽にウェブサイトの広告を表ュールDLLは、関連のポストはも良好です。
Maoniステファンブログ や 会社, たんの今の大半のケーチームがほぼ100%の投稿を基準として、GCくた場合のものを書いたします。
リックバイヤー はdev、CLR診断チームの多くはブログ-仲も良いソースは、しかし、私は強く示唆するも参照の上というまったく新しい dev/診断フォーラム.最近では、対象範囲を拡大します。
コード-カバレッジツール や トレース で、概略を知ることができるためのどを実際に走っています。
(具体的には、perticular statのせいただくことをグローバルビューのplaugingコードしている最近、私たものです。net4betaバイナリのプロファイラから この会社, では、なかなか良いが可能で派生するネイティブ-管理の漏えいからではのプロフィール痕跡きを正確にソースライン(た場合でも最適化され、一種のアナロジーで30日の試)))).
がんばってください。希望のあこれだけ新鮮な心として行っても同一の作品を今;)
試してみてください:<のhref = "http://www.microsoft.com/downloadS/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&displaylang=en" のrel = "nofollowをnoreferrer" タイトル=」 DebugDiags "> DebugDiags を。
いくつかのメモリを生成するダンプした後、それはあなたに割り当てられていたものを、メモリの素敵な夏を与えるだろう、とあなたはPDBのを見つけることに応じて、それはそれは、割り当てられた誰によってあなたを伝えることができます。
あなたは、ソフトウェアをプロファイリングANTSに見て、参照リークを有することができます。 蟻プロファイラする
参照リークがメモリリークの.NETと同等である、あなたはそれであることごみ収集を停止するオブジェクトへの参照を保持するため、使用中のあなたのメモリは、最大行くことに始まります。
それはあなたがあなたがGDI +と他の多くのAPIを使用している場合に発生することができ、いくつかのディスポーザーを見逃している可能です。
あなたの静的解析ツールFxCopのを実行している場合、それはあなたが処分と呼ばれる(または「使用」使用)のインターフェースを提供し、あなたのオブジェクト上の文をしましたかどうかをチェックするルールがあります。関数は、アンマネージコードを使用する場合は、リソース/メモリリークが発生しないようにするために.NETで、それは通常、廃棄またはcloseメソッドを提供します。