【MFC】Data Breakpoint (データブレークポイント): 変数が書き換わった瞬間に止める

【MFC】Data Breakpoint (データブレークポイント): 変数が書き換わった瞬間に止める

変数の値がどこで書き換わったのか分からないケースでは、通常のブレークポイントだけでは原因に届かないことがあります。

この記事では、Visual Studio の データブレークポイント(Data Breakpoint) を使って、特定の変数への書き込みで停止し、呼び出し履歴から経路を確認する手順をまとめます。


目次

データブレークポイントの役割

データブレークポイントは、「コードの行」ではなく「メモリのアドレス(変数)」に対して見張りを立てる機能です。

指定した変数の値が書き換わった瞬間に、実行位置に関係なく停止させることができます。

ブレークポイントウィンドウの「新規作成」プルダウンから「データ ブレークポイント(D)...」を選択しているメニュー

使い方:変数を監視する手順

ステップ1:準備(変数に一度アクセスさせる)

データブレークポイントは「メモリアドレス」を監視するため、アプリ起動直後で変数がまだメモリ上に存在しない(初期化されていない)状態ではセットできません。

まずは、監視したい変数が有効になった後の行に通常のブレークポイントを置いて一時停止させます。たとえば、監視対象の変数を使う関数の先頭で止めれば十分です。

ステップ2:データブレークポイントのセット

  1. Visual Studioのメニューから 「デバッグ(Debug)」 -> 「ウィンドウ(Windows)」 -> 「ブレークポイント(Breakpoints)」 を開きます。
  2. ブレークポイントウィンドウの左上にある 「新規作成(New)」 プルダウンから 「データブレークポイント(Data Breakpoint…)」 を選択します。
  3. 表示されたダイアログの 「アドレス(Address)」 欄に、監視したい変数のメモリアドレスを入力します。
    直接アドレス(0x00AABBCC 等)を打つ必要はありません。変数名の前に & を付けて評価させるのが簡単です。たとえばグローバル変数 g_nSecretTarget を監視するなら &g_nSecretTarget と入力します。
  4. 「バイト数(Byte Count)」 欄には、その変数のサイズを入力します。int 型の変数なら 4(4バイト)です。「OK」を押します。
「新しいデータ ブレークポイント」ダイアログで、アドレス欄とバイト数を指定している画面

ステップ3:プログラムを再開して書き換えを待つ

F5キーを押してプログラムを通常通り再開します。

その後、ユーザー操作や別スレッドの処理、タイマー割り込みなどで指定した変数の値が書き換わった瞬間、Visual Studio がその行で自動停止します。

停止した場所で「呼び出し履歴(Call Stack)」を確認すると、どの処理フローでその変数が書き換えられたかを追えます。

データブレークポイントがヒットし、変数の書き換え行で停止している画面。「データのブレークポイントのヒット」ポップアップが表示されている

注意点と制限事項

  • ポインタが指す先の監視: ポインタ変数自体(アドレスの数値)が変わった時に止めたいのか、ポインタが指し示している先のデータ(実体)が変わった時に止めたいのかで、指定するアドレスが変わります。
    – ポインタ自身の書き換え監視: &pObject
    – ポインタの先の構造体メンバの書き換え監視: &pObject->m_nValue
  • セットできる上限数: データブレークポイントはCPUのデバッグレジスタ(ハードウェアの機能)を直接使用して超高速に監視を行うため、同時に設定できる個数に上限(通常は4個まで)があります。
  • ローカル変数には不向き: 関数内のローカル変数は、関数が呼ばれるたびにスタック上のアドレスが動的に変わるため、データブレークポイントによる監視は現実的ではありません。主にグローバル変数、シングルトン、または永続的に存在するクラス(ViewやDocument等)のメンバ変数を監視するのに使います。

まとめ

  • [ ] 変数の書き換え箇所が分からない場合は、データブレークポイントを使う。
  • [ ] ブレークポイントウィンドウの「新規作成」から設定し、監視対象のアドレス(&変数名)とサイズを指定するだけ。
  • [ ] 値が変わった瞬間に停止するため、コールスタックから書き換え経路を追える。
目次