VisualStudio のデバッガ上で、アプリ終了時、出力ウインドウにメモリリークの表示が出たら、クリックすればアロケートした場所に飛んでくれます。すごく便利です。
しかしアロケートした場所に飛べないメモリリークだと少々厄介です。
そんな場合に、なんとか原因を調べたいと思う方へ、ちょっとした参考情報です。
以下の方法は VisualStudio 2005 の場合です。が、他のバージョンでも仕組みは同じで、アロケートしている箇所にブレークを張ってコールスタックを辿るという作業ですので、臨機応変にご対応下さい。
- 例えば出力ウインドウに
{155} normal block at 0x06C88AC8, 28 bytes long.
こんな感じで出たら、{155}ってのがアロケートしたカウントなので、まずこの値を覚えておきます。
- 以下のファイル
C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\dbgheap.c
の 453 行目あたりに、
pHead->lRequest = lRequest;
というの箇所があるハズなので、そこにブレークポイントを張って、ブレークポイントの条件で、
とします。
- おもむろにデバッグ実行します。
すると、メモリリークの対象のコードに来たら、ブレークしますので、そこでコールスタックを見れば、なんとなく分かるかもです。
ただ、このカウント値は、一意の値ではないかもなので、どう見ても違う箇所でブレークしちゃったときは、F5でさらに実行して下さい。
何度か、ブレークがかかる場合があります。
- なお、ここでキーにしているアロケートしたカウントは、カウンタなので、実行する度に毎回違うということもあり得ます。そんな場合は、出来るだけ毎回同じ処理になるように手順を工夫してみてください。カウンタが変動しなくなるかもです。
- それでもダメなようなら、アロケートサイズもブレーク条件に絡めてみて下さい。沢山ブレークに引っかかるかもですが、ドンピシャでブレークするかもしれません。