Visual C++ でのデバッグ

Last-modified: 2009-01-14 (水) 16:05:58

メモリリーク検出

HEAP CORRUPTION DETECTED

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Error!
Program: ...
HEAP CORRUPTION DETECTED: after Normal block (#169) at 0x003B9578.
CRT detected that the application wrote to memory after end of heap buffer.
(Press Retry to debug the application)
---------------------------
中止(A)   再試行(R)   無視(I)
---------------------------
  1. どこで確保したヒープが壊されたのかを知る。
    1. 上記メッセージ中の「Normal block (#169)」が肝。
    2. プログラムを再度デバッグ実行し、すぐに break。(ステップオーバーで開始すると良い)
    3. ウォッチに「{,,msvcr80d.dll}_crtBreakAlloc」を入れ、値を 169 にする。(式の意味は、vs メモリリークを参照のこと)
    4. デバッグを続行する。
    5. 169 番目にヒープが確保されようとした際にブレークがかかる。
    6. 呼び出し履歴を見て、new/malloc 等で確保されているソースを調べる。
  1. いつ壊されたのかを知る。
    1. 壊されたヒープが元々何バイトで確保されたのかをメモする(仮に 0x100 バイト)。
    2. 確保したヒープ領域へのアドレスをメモする(仮に 0x003b9578 )。
    3. メモしたアドレスとバイト数を足し算する(0x003b9578 + 0x100 = 0x003b9678)。
    4. 壊される瞬間にブレークポイントをはる。
      1. デバッグメニューから「ブレークポイントの作成」→「新しいデータブレークポイント」を選択
      2. 「アドレス」に先の計算で求めた「0x003b9678」を入れる。
      3. 「バイト数」は「1」~「24」くらいに設定する。
      4. 「言語」は「C」に設定する。
    5. デバッグ実行する。
    6. 0x003b9678 に書き込んだ瞬間にブレークするので、書き込み行った犯人を見つける。