変数の値がどこで書き換わったのか分からないケースでは、通常のブレークポイントだけでは原因に届かないことがあります。
この記事では、Visual Studio の データブレークポイント(Data Breakpoint) を使って、特定の変数への書き込みで停止し、呼び出し履歴から経路を確認する手順をまとめます。
目次
データブレークポイントの役割
データブレークポイントは、「コードの行」ではなく「メモリのアドレス(変数)」に対して見張りを立てる機能です。
指定した変数の値が書き換わった瞬間に、実行位置に関係なく停止させることができます。

使い方:変数を監視する手順
ステップ1:準備(変数に一度アクセスさせる)
データブレークポイントは「メモリアドレス」を監視するため、アプリ起動直後で変数がまだメモリ上に存在しない(初期化されていない)状態ではセットできません。
まずは、監視したい変数が有効になった後の行に通常のブレークポイントを置いて一時停止させます。たとえば、監視対象の変数を使う関数の先頭で止めれば十分です。
ステップ2:データブレークポイントのセット
- Visual Studioのメニューから 「デバッグ(Debug)」 -> 「ウィンドウ(Windows)」 -> 「ブレークポイント(Breakpoints)」 を開きます。
- ブレークポイントウィンドウの左上にある 「新規作成(New)」 プルダウンから 「データブレークポイント(Data Breakpoint…)」 を選択します。
- 表示されたダイアログの 「アドレス(Address)」 欄に、監視したい変数のメモリアドレスを入力します。
直接アドレス(0x00AABBCC等)を打つ必要はありません。変数名の前に&を付けて評価させるのが簡単です。たとえばグローバル変数g_nSecretTargetを監視するなら&g_nSecretTargetと入力します。 - 「バイト数(Byte Count)」 欄には、その変数のサイズを入力します。
int型の変数なら4(4バイト)です。「OK」を押します。

ステップ3:プログラムを再開して書き換えを待つ
F5キーを押してプログラムを通常通り再開します。
その後、ユーザー操作や別スレッドの処理、タイマー割り込みなどで指定した変数の値が書き換わった瞬間、Visual Studio がその行で自動停止します。
停止した場所で「呼び出し履歴(Call Stack)」を確認すると、どの処理フローでその変数が書き換えられたかを追えます。

注意点と制限事項
- ポインタが指す先の監視: ポインタ変数自体(アドレスの数値)が変わった時に止めたいのか、ポインタが指し示している先のデータ(実体)が変わった時に止めたいのかで、指定するアドレスが変わります。
– ポインタ自身の書き換え監視:&pObject
– ポインタの先の構造体メンバの書き換え監視:&pObject->m_nValue - セットできる上限数: データブレークポイントはCPUのデバッグレジスタ(ハードウェアの機能)を直接使用して超高速に監視を行うため、同時に設定できる個数に上限(通常は4個まで)があります。
- ローカル変数には不向き: 関数内のローカル変数は、関数が呼ばれるたびにスタック上のアドレスが動的に変わるため、データブレークポイントによる監視は現実的ではありません。主にグローバル変数、シングルトン、または永続的に存在するクラス(ViewやDocument等)のメンバ変数を監視するのに使います。
まとめ
- [ ] 変数の書き換え箇所が分からない場合は、データブレークポイントを使う。
- [ ] ブレークポイントウィンドウの「新規作成」から設定し、監視対象のアドレス(
&変数名)とサイズを指定するだけ。 - [ ] 値が変わった瞬間に停止するため、コールスタックから書き換え経路を追える。
