メニュー
ブログ更新履歴
コンテンツ更新履歴
リンク
  • Magome
  • クラウドベースのMIDIシーケンサ
    音楽制作に興味のある方を対象に、スタンドアロンでも使え、ネットならではの面白さも兼ね備えた音楽制作アプリの提供を目指しています。
twitter

VisualStudio のデバッガ上で、アプリ終了時、出力ウインドウにメモリリークの表示が出たら、クリックすればアロケートした場所に飛んでくれます。すごく便利です。
しかしアロケートした場所に飛べないメモリリークだと少々厄介です。
そんな場合に、なんとか原因を調べたいと思う方へ、ちょっとした参考情報です。

以下の方法は VisualStudio 2005 の場合です。が、他のバージョンでも仕組みは同じで、アロケートしている箇所にブレークを張ってコールスタックを辿るという作業ですので、臨機応変にご対応下さい。

  1. 例えば出力ウインドウに
    {155} normal block at 0x06C88AC8, 28 bytes long.
    こんな感じで出たら、{155}ってのがアロケートしたカウントなので、まずこの値を覚えておきます。
  2. 以下のファイル
    C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\dbgheap.c
    の 453 行目あたりに、
    pHead->lRequest = lRequest;
    というの箇所があるハズなので、そこにブレークポイントを張って、ブレークポイントの条件で、
    lRequest==155
    とします。
  3. おもむろにデバッグ実行します。
    すると、メモリリークの対象のコードに来たら、ブレークしますので、そこでコールスタックを見れば、なんとなく分かるかもです。
    ただ、このカウント値は、一意の値ではないかもなので、どう見ても違う箇所でブレークしちゃったときは、F5でさらに実行して下さい。
    何度か、ブレークがかかる場合があります。
  • なお、ここでキーにしているアロケートしたカウントは、カウンタなので、実行する度に毎回違うということもあり得ます。そんな場合は、出来るだけ毎回同じ処理になるように手順を工夫してみてください。カウンタが変動しなくなるかもです。
  • それでもダメなようなら、アロケートサイズもブレーク条件に絡めてみて下さい。沢山ブレークに引っかかるかもですが、ドンピシャでブレークするかもしれません。

Front page   Freeze Diff Backup Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 1732, today: 3, yesterday: 2
Princeps date: 2016-04-29 (Fri) 01:02:16
Last-modified: 2016-04-29 (Fri) 01:02:16 (JST) (1152d) by takatsuka