_crtBreakAllocを使用してメモリ割り当てをデバッグする

この記事では、 を使用 _crtBreakAlloc してメモリ割り当てをデバッグする方法について説明します。

元の製品バージョン: Visual C++
元の KB 番号: 151585

概要

デバッグ C-Runtime (CRT) を使用してメモリ リークを追跡する場合は、リークの原因となるメモリを割り当てる直前にブレークポイントを設定すると便利です。 コンパイル時または実行時にを設定 _crtBreakAlloc すると、特定のメモリ割り当て時点でユーザー定義ブレークポイントが発生する可能性があります。

詳細

などの _CrtDumpMemoryLeaksDebug-CRT 関数を使用してメモリ リークを追跡すると、多くの場合、中かっこ ({}) で囲まれた割り当て番号が表示されます。 たとえば、割り当て番号 18 でのメモリ リークを次に示します。

検出されたメモリ リーク!
オブジェクトのダンプ ->
{18} normal block at 0x00660BE4, 10 bytes long
データ: <> CD CD CD CD CD CD CD CD CD CD
オブジェクト ダンプが完了しました。

このメモリが割り当てられる直前にブレークポイントを設定すると便利です。これにより、呼び出し履歴をステップ実行して、このメモリが割り当てられる原因となっている関数を確認できます。 中断する割り当て番号を指定できる Debug-CRT 関数 _CrtSetBreakAlloc 。 このメソッドでは、割り当てブレークポイントを設定するたびにプログラムを再コンパイルする必要があります。 別の方法として、[ウォッチ] ウィンドウを使用し、割り当てブレークポイントを動的に設定します。 このメソッドには、ソース コードの変更や再コンパイルを必要としないという利点があります。

C ランタイムに静的にリンクしている場合、変更する変数は と呼ばれます _crtBreakAlloc。 C ランタイムに動的にリンクしている場合、[ウォッチ] ウィンドウで変更する変数は、Visual C++ 4.0 または 4.1 を使用している場合です {,,msvcr40d.dll}__p__crtBreakAlloc() 。 Visual C++ 4.2 以降を使用している場合は、[ウォッチ] ウィンドウで変更する変数を指定する必要があります {,,msvcrtd.dll}__p__crtBreakAlloc()

コンパイルする CRT のバージョンを確認するには、次の手順を実行します。

  1. [ ビルド ] メニューの [ 設定] を選択します。

  2. [ 設定 ] の [: ] ウィンドウで、ビルドする構成を選択します。 [ C/C++ ] タブを選択し、[ コード生成 ] カテゴリを選択します。

[ランタイム ライブラリの使用] ダイアログが表示され、使用している CRT のバージョンが表示されます。 (この設定が空白の場合は、[設定] ウィンドウで 1 つの構成のみを選択していることを確認します)。

割り当てブレークポイントを動的に設定するには、次の手順を実行します。

  1. デバッグ セッションを開始します。 [ビルド] メニューの [デバッグ] -> [ステップ イン] の順に選択します。 "シングル スレッドデバッグ" または "マルチスレッド CRT のデバッグ" を使用している場合は、手順 1a に従います。 それ以外の場合は、手順 1b に従います。

    1. [ウォッチ] ウィンドウに 「_crtBreakAlloc 」と入力します。 プログラムが停止する現在の割り当て番号が表示されます。 この割り当て番号は、プログラムの初回起動時に -1 にする必要があります。

    2. Visual C++ 4.0 または 4.1 を使用している場合は、[ウォッチ] ウィンドウに 「{,,msvcr40d.dll}__p__crtBreakAlloc()」 と 入力します。 Visual C++ 4.2 以降を使用している場合は、「 {,,msvcrtd.dll}__p__crtBreakAlloc() 」と入力します。 プログラムが停止する現在の割り当て番号が表示されます。 この割り当て番号は、プログラムの初回起動時に -1 にする必要があります。

  2. -1 の値をダブルクリックし、ユーザー定義ブレークポイントの原因となる新しい割り当て番号を入力します。

  3. [デバッグ] メニューの [デバッグ] -[移動] の順>に選択します。

の詳細については、オンライン ヘルプのヒープ割り当て要求の追跡に関_crtBreakAllocするページを参照してください。