メモリリーク検出
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)
---------------------------
- どこで確保したヒープが壊されたのかを知る。
- 上記メッセージ中の「Normal block (#169)」が肝。
- プログラムを再度デバッグ実行し、すぐに break。(ステップオーバーで開始すると良い)
- ウォッチに「{,,msvcr80d.dll}_crtBreakAlloc」を入れ、値を 169 にする。(式の意味は、vs メモリリークを参照のこと)
- デバッグを続行する。
- 169 番目にヒープが確保されようとした際にブレークがかかる。
- 呼び出し履歴を見て、new/malloc 等で確保されているソースを調べる。
- いつ壊されたのかを知る。
- 壊されたヒープが元々何バイトで確保されたのかをメモする(仮に 0x100 バイト)。
- 確保したヒープ領域へのアドレスをメモする(仮に 0x003b9578 )。
- メモしたアドレスとバイト数を足し算する(0x003b9578 + 0x100 = 0x003b9678)。
- 壊される瞬間にブレークポイントをはる。
- デバッグメニューから「ブレークポイントの作成」→「新しいデータブレークポイント」を選択
- 「アドレス」に先の計算で求めた「0x003b9678」を入れる。
- 「バイト数」は「1」~「24」くらいに設定する。
- 「言語」は「C」に設定する。
- デバッグ実行する。
- 0x003b9678 に書き込んだ瞬間にブレークするので、書き込み行った犯人を見つける。