はじめまして。
VC .NET2003を使用しているのですが、表題の特定の変数 or アドレスにプログラム側
からアクセス( リード or ライト )があったときに止めたいのですが、いまいちブレーク
ポイントのプロパティをいろいろいじってもわからなかったのですが、これってできる
のでしょうか?
どなたか知っている方がおりましたら、ご教授お願いします。
いろいろいじってみたのですが、どうやっても無理でした。
で、MS のサイトで、こんなページを見つけました。
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vsdebug/html/_asug_setting_breakpoints.asp
> データ ブレークポイントは、変数の値が変化したときに、プログラムを中断
> させます。データ ブレークポイントは、関数の一番上のスコープのグローバル変数
> またはローカル変数に設定できます。C/C++ だけに対応します。
だそうですが。
# 一応、できた。VC .NET2003
こういうテストプログラムを作りました。
jの値が変更されたときに止まります。
//-----------
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0, j = 0;
printf(&j = %p\n, &j);
while (i < 100)
{
i++;
if (i % 2 == 0)
{
j++;
}
}
return 0;
}
//-------
実行前にi++の行でブレークポイントを設定しておきます。
実行後、ブレークされたときに、
ブレークポイントウィンドウ(Ctrl+Alt+B)を出し、
新規作成のデータタブで、変数の欄にはprintfで出力された
アドレスを書きます。
これで、i++の部分のブレークポイントを消して、F5を押していくと、
iの値が2ずつ変わっていくごとに、jの値は1ずつ変わっていくごとに
ブレークされます。
が、止まるところが何故かwhileループの最後、ループするところ。
なぜ?
# すみません、書き方が悪い
>これで、i++の部分のブレークポイントを消して、F5を押していくと、
>iの値が2ずつ変わっていくごとに、jの値は1ずつ変わっていくごとに
>ブレークされます。
つまり、whileループが2回まわるごとにブレークされます。
> が、止まるところが何故かwhileループの最後、ループするところ。
> なぜ?
デバッグビルドしていて、最適化が効いてないため、素直なマシン語を吐いているとし
て。
ループするところにはジャンプ命令があり、これは j の値が変化した後の最初の命令な
のですな。
Intel のアセンブリリファレンスの3巻に書いてありますが、データブレークポイント
例外がトラップされたとき、IP はその次の命令を指しているためだと思われます。