開発覚え書き

ソフトウェアシステムの開発に関わるさまざまなことの覚え書き

Visual Studio上のVisual C++のデバグでの注意(ヒープ関係)

2005-09-21 15:04:53 | Weblog
最近以前書いたC++のプログラムのチェック、修正、動作をやっている。
単なるコンソールアプリなのだが、楽なのでVisual StudioでVisual C++
を使ってやっている。
Visual Studio のVisual C++のデバグで最近気づいたことがある。
malloc や new などのヒープ関係のメモリ要求では、デバグ時に
ランタイムライブラリのソースにある dbgheap.cpp 内の
_heap_alloc 関数が呼ばれ、さらに _heap_alloc_dbg 関数が呼ばれるようになっている。
その中に
lRequest = _lRequestCurr;

/* break into debugger at specific memory allocation */
if (lRequest == _crtBreakAlloc)
_CrtDbgBreak();
という部分がある。
_lRequestCurr はメモリ要求回数を表すカウンタ (long型) で、初期値は 1 で
要求ごとに 1 ずつインクリメントされる。
_crtBreakAlloc は特定のメモリ要求番号をセットすることができ、そのメモリ要求
が行われたところで _CrtDbgBreak() によりデバグ用のブレークがかかるようになっている。
ただ、_crtBreakAlloc の初期値は -1 で通常はブレークしない。
ところが _crtBreakAlloc も long 型のため、2^32 回程度のメモリ要求があると一周して
等号が成立してしまい、勝手にブレークしてしまう。
もっともメモリリークなどのバグではなくプログラムは正常なので、デバッガ上で何の問題も
なく実行を継続することができる。
ただ、Microsoftもちょっと問題があると思ったのか、新しいバージョン、たとえば
Visual Studio .NET 2003 のC++では以下のように修正されている。
/* break into debugger at specific memory allocation */
if (_crtBreakAlloc != -1L && lRequest == _crtBreakAlloc)
_CrtDbgBreak();
これで一回りしてもブレークしなくなっている。