4

重大なメモリリークを見つけようとしています(一度に15MBですが、このような割り当てを複数の場所で行っています)。最もわかりやすい場所を確認してからAQTimeを使用しましたが、それでも特定できません。今、私は2つのオプションが残っているのを見る:

1)SetProcessWorkingSetSizeを使用する:これを試しましたが、150MBを超えて使用しても、プロセスは正常に実行され続けます。

DWORD MemorySize = 150*1024*1024;
SetProcessWorkingSetSize( GetCurrentProcess(), MemorySize/2, MemorySize*2 );

2)一度に1MB以上を割り当てる場合は、ブレークポイントを設定します。これを行うにはどうすればよいですか、内部に「if> 1MB」を含む新しいオーバーロード演算子ですか?

4

6 に答える 6

1

SetProcessWorkingSetSizeは、それが何を意味すると思うかを意味するのではありません。これは、ディスクにページングするのではなく、「メモリ内」に保持するメモリの量に関するOSの手がかりです。最近のOSは、未使用のメモリをディスクにページングすることに関しては非常に積極的です。特にWindowsはそうです。

IBM Rational Purifyは、非常に徹底的なコード分析以外の唯一のソリューションです。Windowsでは、C / C ++の場合、メモリリークを見つけるための優れたツールはありません。MacまたはLinuxではvalgrindを使用できますが、AFAIKではまだWindowsでは機能していません。

于 2010-04-12T17:06:01.340 に答える
1

タグから、C++とVisualStudioを使用しています。

その場合、Microssoftが提供するcrtデバッグフックを使用するだけです。

msdnで_CrtSetAllocHookを検索します。

デバッグビルドでは、これによりすべての割り当てをインターセプトできます。小さな割り当てを無視して、ブレークポイントを設定するか、大きな割り当てで::DebugBreakを呼び出すことができます。

于 2010-04-12T21:57:47.657 に答える
0

1) SetProcessWorkingSetSize を使用します: 私はこれを試しましたが、150MB 以上を使用しても、プロセスは喜んで実行を続けます:

SetProcessWorkingSetSize は何を返しますか? 呼び出しは成功していますか?

2) 一度に 1MB 以上を割り当てる場合は、ブレークポイントを設定します。これを行うにはどうすればよいですか? 'if>1MB' を内部に持つ演算子 new をオーバーロードしますか?
はい、うまくいくはずです。

MSVC によって提供されるC ランタイム デバッグ ヒープによって提供されるツールを調べると役立つ場合があります。

于 2010-04-12T17:08:40.243 に答える
0

組み込み型システムでは、あなたが提案したとおりに実行します-特定のしきい値を超える new/memAlloc への呼び出しを中断し、free/delete で同じことを行います。面倒ですが、これで作業は完了です。サイズの条件付きブレークポイントは、あなたが望むことをするはずですが、削除では少し悪いです。

于 2010-04-12T17:10:40.487 に答える
0

申し訳ありませんが、提案された解決策はどれもうまくいきませんでした。AQTime と多くの debugoutput を使用して最終的に修正されました。リークはシャットダウン時にきれいになったので、干し草の山で針を探していました.

それでも、これを効率的に見つける方法に興味があります。new 演算子に条件付きブレークポイントを設定しようとしましたが、デバッガーは、単一の割り当てごとに「バイト > 1024 * 1024」を評価するのに時間がかかりました。

于 2010-04-16T23:09:30.873 に答える
0

UMDHを使用してみてください。これは、メモリ リークを検出できる無料の Microsoft ユーティリティです。

于 2010-04-12T17:15:14.843 に答える