特定の変数(アドレス)にアクセスがある時のブレーク

[戻る]
初心者 2005/05/12(木) 21:37:28
はじめまして。
VC .NET2003を使用しているのですが、表題の特定の変数 or アドレスにプログラム側
からアクセス( リード or ライト )があったときに止めたいのですが、いまいちブレーク
ポイントのプロパティをいろいろいじってもわからなかったのですが、これってできる
のでしょうか?

どなたか知っている方がおりましたら、ご教授お願いします。

シャノン 2005/05/12(木) 22:25:18
いろいろいじってみたのですが、どうやっても無理でした。
で、MS のサイトで、こんなページを見つけました。

http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vsdebug/html/_asug_setting_breakpoints.asp

> データ ブレークポイントは、変数の値が変化したときに、プログラムを中断
> させます。データ ブレークポイントは、関数の一番上のスコープのグローバル変数
> またはローカル変数に設定できます。C/C++ だけに対応します。 

だそうですが。

reshia 2005/05/12(木) 23:07:06
# 一応、できた。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ループの最後、ループするところ。
なぜ?

reshia 2005/05/12(木) 23:08:49
# すみません、書き方が悪い
>これで、i++の部分のブレークポイントを消して、F5を押していくと、
>iの値が2ずつ変わっていくごとに、jの値は1ずつ変わっていくごとに
>ブレークされます。
つまり、whileループが2回まわるごとにブレークされます。

シャノン 2005/05/13(金) 03:21:46
> が、止まるところが何故かwhileループの最後、ループするところ。
> なぜ?

デバッグビルドしていて、最適化が効いてないため、素直なマシン語を吐いているとし
て。

ループするところにはジャンプ命令があり、これは j の値が変化した後の最初の命令な
のですな。
Intel のアセンブリリファレンスの3巻に書いてありますが、データブレークポイント
例外がトラップされたとき、IP はその次の命令を指しているためだと思われます。

古いスレッドには追加発言できません。