2012-04-18 2 views
0

私はC#コードをいくつか持っています。私はusing(){}を使用していないか、またはdisposeを呼び出していないすべての場所を見つけるためにコード分析を使用します。それが行われます。それでもまだ漏れている。このコードでは、2つの関数(SetWindowPos、SetForegroundWindow)を除いてDllImportは呼び出されませんが、呼び出されることはありません(メインインスタンスでは使用されません。C#で何が漏れているのを見つけるには?

何とかこのコードが漏れています。どのようにして問題が見つかるのですか?

+0

あなたはコードがメモリをリークしていると思いますか?あなたのタイトルと質問には '[C#]'と書かれていますが、あなたのタグは '[C++]'と言います。 C++はここでは関係がありますか? –

+0

これは本当の質問ではないのですか? @Insilico:C++はタイプミスでした。 (うまくいけば、 'using'キーワードと.NETのタグ付けでそのことが分かりました)。私はそれが漏れていると思うのですか?メモリで1.5GBに達し、メモリ不足の例外がスローされるという事実は、私にその漏れがあると考えるようになります。過去に私はそれが80メガバイト以上行くことはなかった。 –

答えて

6

管理されたコードのメモリリークは、通常、オブジェクトが意図しない参照によってメモリに保持されているために発生します。イベントハンドラは一般的な犯人です。

あなたはメモリプロファイリングツールを手に入れたいと思うでしょう。 とRedGate's ANTSもどちらも良いですが、SciTech's .NET Memory Profilerがおそらく最高です。

マイクロソフトでは無料のプロファイリングツールCLR Profilerを使用していますが、もう少し複雑です。いくつかのガイダンスについては、hereおよびhereを参照してください。

DRONE profiler for .NETは無料の個人ライセンスを持っているようですが、私は自分でこのツールをよく知っていません。彼らは、プロファイラhereでメモリリークを見つけるための記事を持っています。

Visual Studioの上位バージョンには、プロファイリングツールも含まれています。 MSDNにはdocumentation on how to use themが含まれています。

+0

問題の原因を見つけたら一度受け入れるよ –

+0

メモリの例外が出るまでリストにパーズするページを置くことは決して終わっていないforループがあった。ループがリンクリストであったことを忘れてしまったので、私はそれを増やす必要があります。私はそれを書き直したので、ループの2行目でインクリメントします(最初は現在のリンクにptr/refを作成しています)。それにはsleep()があり、それが何分もかからず、CPUに気付かれる前にCPUを使い果たしてしまったのです。また、別のスレッド(非メイン)にもあります。バグ。 –

+0

おっと、私はwhileループを意味していました。私はSciTechの.NET Memory Profilerを使用し、それを使用する方法を考え出し、問題を追跡するために「メモリ保持」を使用しました。 –

1

Visual Studio(PremiumおよびUltimate)に組み込まれているプロファイラを使用してアプリケーションのプロファイルを作成するか、ANTSのようなツールに投資します。

+0

+1。私は、プロファイラーとVSにアクセスする必要があります。私は、私がC++を使っているときにメモリプロファイリングがあることを認識しませんでした。(漏れはなく、C++プロファイラはIIRCをしません)。私は問題を追跡するときに受け入れるよ –

関連する問題