診断サービス

更新 : 2007 年 11 月

Microsoft Foundation Class ライブラリには、プログラムのデバッグを簡単にする、さまざまな診断サービスが用意されています。診断サービスには、プログラムでのメモリの割り当てのトラック、実行時のオブジェクト内容のダンプ、および実行時のデバッグ メッセージの表示を可能にするマクロやグローバル関数があります。診断サービスのためのマクロとグローバル関数は、次のカテゴリに分類されます。

  • 一般的な診断マクロ

  • 一般的な診断関数と変数

  • オブジェクト診断関数

これらのマクロや関数は、MFC ライブラリのデバッグ バージョンとリリース バージョンで CObject から派生したすべてのクラスで利用できます。ただし、DEBUG_NEWVERIFY を除くマクロや関数はリリース バージョンでは機能しません。

デバッグ ライブラリでは、割り当てられるすべてのメモリ ブロックは "ガード バイト" の列で囲まれます。これらのバイトが誤ったメモリ書き込みで壊された場合は、診断ルーチンで問題点をレポートできます。実装ファイルに次の行を含めると、new として呼び出されているすべての箇所で、メモリを割り当てたファイル名と行番号が保存されます。

#define new DEBUG_NEW

関数 CMemoryState::DumpAllObjectsSince は追加情報を表示し、メモリ リークを識別できます。診断出力の詳細については、CDumpContext クラスも参照してください。

また、C ランタイム ライブラリでも、アプリケーションのデバッグに使用できる一連の診断関数がサポートされます。詳細については、「ランタイム ライブラリ リファレンス」の「デバッグ ルーチン」を参照してください。

MFC の一般的な診断マクロ

ASSERT

ライブラリのデバッグ バージョンで、指定された式が FALSE のときに、メッセージを出力しプログラムの実行を中止します。

ASSERT_KINDOF

オブジェクトが、指定されたクラスのオブジェクトかどうか、または指定されたクラスから派生したクラスのオブジェクトかどうかを確認します。

ASSERT_VALID

AssertValid メンバ関数を呼び出すことにより、オブジェクトの内部構造が正しいかどうかを調べます。通常、AssertValid メンバ関数は CObject からオーバーライドします。

DEBUG_NEW

デバッグ モードですべてのオブジェクトのメモリ割り当て状態をファイル名と行番号で示すことにより、メモリ リークの発見を助けます。

DEBUG_ONLY

ASSERT と同じ機能を持ちますが、式の値は確認しません。デバッグ モードでだけ実行するコードで役立ちます。

TRACE

ライブラリのデバッグ バージョンで、printf 関数と同じ機能を提供します。

VERIFY

ASSERT と同じ機能を持ちますが、デバッグ バージョンでもリリース バージョンでも式を評価します。

MFC の一般的な診断変数と関数

afxDump

CDumpContext 情報をデバッガ出力ウィンドウまたはデバッグ端末へ送るグローバル変数です。

afxMemDF

デバッグ時のメモリ アロケータの動作を制御するグローバル変数です。

AfxCheckError

渡された SCODE がエラーかどうかを調べるためのグローバル変数です。エラーの場合は、該当するエラーがスローされます。

AfxCheckMemory

現在割り当てされているメモリの整合性を調べます。

AfxDump

デバッガで呼び出されると、デバッグ中にオブジェクトの状態をダンプします。

AfxDumpStack

現在のスタックのイメージを生成します。この関数は必ず静的にリンクします。

AfxEnableMemoryTracking

メモリ トラッキングのオンとオフを切り替えます。

AfxIsMemoryBlock

メモリ ブロックが正しく割り当てられているかどうかを調べます。

AfxIsValidAddress

メモリのアドレス範囲がプログラムの境界内にあるかどうかを調べます。

AfxIsValidString

文字列へのポインタが正しいかどうかを調べます。

AfxSetAllocHook

メモリ割り当て時に、指定された関数の呼び出しを可能にします。

MFC のオブジェクト診断関数

AfxDoForAllClasses

ランタイム型チェックをサポートするすべての CObject 派生クラスで、指定された関数を実行します。

AfxDoForAllObjects

new で割り当てられたすべての CObject 派生クラスのオブジェクトで、指定された関数を実行します。

参照

概念

MFC マクロとグローバル