crt_dbg2 サンプル : C ランタイムのデバッグのフック関数

crt_dbg2 サンプルでは、C ランタイム ライブラリのデバッグ バージョンでの、デバッグ用のフック関数のさまざまな使い方を示します。 リアリティを増すために、このプログラムには、実際のアプリケーションに存在する要素を入れてあります。また、バグも 2 つ含まれています。

注意

このサンプルは Intel の Itanium プロセッサではサポートされていません。

セキュリティに関するメモセキュリティに関するメモ

このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。 特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。 セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。 これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。

サンプルとそのインストール手順を取得するには

Visual Studio のサンプルにアクセスするには

  • [ヘルプ] メニューの [サンプル] をクリックします。

    既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。

  • このサンプルの最新バージョンと他のサンプルの一覧については、MSDN Web サイトの Visual Studio のサンプルを参照してください。

サンプルのビルドと実行

このサンプルをビルドして実行するには

  1. crt_dbg2.sln ソリューション ファイルを開きます。

  2. [ビルド] メニューの [ビルド] をクリックします。

  3. [デバッグ] メニューの [デバッグなしで開始] をクリックします。

サンプルの動作

このプログラムは、誕生日の情報を Client ブロックのリンク リストに格納する処理を行います。 Client ブロックをダンプするフック関数は、誕生日データの正当性をチェックしてその内容を出力します。 メモリ割り当てフック関数は、ヒープ処理をテキスト ファイルに記録します。また、レポート用のフック関数は、同じテキスト ファイルに選択されたレポートを記録します。

割り当てフック関数では、CRT ブロック (C ランタイム ライブラリで内部的に割り当てられたメモリ ブロック) を明示的に記録対象から除外している点に注意してください。 このフック関数では、fprintf を使用してログ ファイルへの書き込みを行います。また、fprintf は、CRT ブロックを割り当てます。 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

参照

その他の技術情報

一般的なサンプル