crt_dbg2 サンプル : C ランタイムのデバッグのフック関数
更新 : 2007 年 11 月
crt_dbg2 サンプルでは、C ランタイム ライブラリのデバッグ バージョンでの、デバッグ用のフック関数のさまざまな使い方を示します。リアリティを増すために、このプログラムには、実際のアプリケーションに存在する要素を入れてあります。また、バグも 2 つ含まれています。
メモ : |
---|
このサンプルは Intel の Itanium プロセッサではサポートされていません。 |
セキュリティに関するメモ : |
---|
このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないため、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。 |
サンプルとそのインストール手順を取得するには
Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。
詳細については、「サンプル ファイルの格納場所」を参照してください。
使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページ を参照してください。
サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。
サンプルのビルドと実行
このサンプルをビルドして実行するには
crt_dbg2.sln ソリューション ファイルを開きます。
[ビルド] メニューの [ビルド] をクリックします。
[デバッグ] メニューの [デバッグなしで開始] をクリックします。
サンプルの動作
このプログラムは、誕生日の情報を Client ブロックのリンク リストに格納する処理を行います。Client ブロックをダンプするフック関数は、誕生日データの正当性をチェックしてその内容を出力します。メモリ割り当てフック関数は、ヒープ処理をテキスト ファイルに記録します。また、レポート用のフック関数は、同じテキスト ファイルに選択されたレポートを記録します。
割り当てフック関数では、CRT ブロック (C ランタイム ライブラリで内部的に割り当てられたメモリ ブロック) を明示的に記録対象から除外している点に注意してください。このフック関数では fprintf を使用してログ ファイルへの書き込みを行います。fprintf は CRT ブロックを割り当てるため、CRT ブロックを除外しないと、無限ループに陥ってスタックがオーバーフローします。つまり、fprintf がフック関数を呼び出すと、今度はそのフック関数が fprintf を呼び出し、さらにそれが再びフック関数を呼び出すという具合になります。
割り当てフック関数で CRT ブロックを報告するには、C ランタイム関数の代わりに、Windows API 関数を使用してください。Windows API は CRT ヒープを使用しないため、無限ループに陥る心配はありません。
また、この例では、デバッグ ヒープが 2 つのバグと 1 つのデータ エラーを検出します。第 1 のバグは、名前フィールドがテスト用の名前データを保持するのに十分なサイズに満たないことです。フィールドを大きくする必要があります。そのときは、strcpy の代わりに strncpy を使います。第 2 のバグは、printRecords 関数の中の while ループが、HeadPtr そのものが NULL になるまで終了しないことです。このため、誕生日を正しく表示できないばかりでなく、メモリ リークも引き起こします。最終的には、Gauss の誕生日は April 32 ではなく、April 30 になる必要があります。
キーワード
このサンプルでは、次のキーワードを使用します。
_assert; _asserte; _crtcheckmemory; _crtmemcheckpoint; _crtmemdumpallobjectssince; _crtmemdumpstatistics; _crtsetallochook; _crtsetdbgflag; _crtsetdumpclient; _crtsetreportfile; _crtsetreporthook; _crtsetreportmode; _free_dbg; _malloc_dbg; _rpt4; _strdate; _strtime; aboutbox; clear_crt_debug_field; createinstance; createrecord; displaystring; donttouch; exit; fatalerror; fclose; fflush; fopen; fprintf; fputs; get_size; helpstring; id; iid_is; module; myallochook; mydumpclienthook; myreporthook; pointer_default; printf; printrecords; put_size; set_crt_debug_field; strcpy_s; strstr; uuid