ポインターの受け渡しに問題があると思われるプログラムをデバッグしようとしています。以下のように定義されたクラスがあります。
class data{
public:
data(int x, int y){
a=x;
b=y;
md = new metadata();
}
~data(){
delete md;
}
int a;
int b;
metadata* md; //metadata is another class
};
データオブジェクトへのポインタを取るいくつかの関数:
void function1(data* d){
//do stuff
}
void function2(data* d){
//do stuff
function1(d);
}
void function3(data* d){
//do stuff
function2(d);
}
int main(){
//stuff
data* data = new data(1,2);
function3(d);
//other stuff
}
にブレークポイントを設定しfunction1
、 に 1 つ設定しましたfunction3
。これら 2 つのブレークポイントの間のどこかでmd
、別のメタデータ オブジェクトを指すように再割り当てされます (d
ただし、 は引き続き同じメモリ アドレスを指します)。md
2 つのブレークポイント間で数千行が実行されるため、単にステップ実行することは現実的ではないため、ポインターが変更されたときに監視してブレークしたいと考えています。ただし、次のメッセージが表示されるwatch d->md
ため、ブレークボインは機能しfunction1
ません
Watchpoint 1 deleted because the program has left the block in which its expression is valid
d
これは、inが関数のコンテキストに対してローカルであるために発生すると考えられます。md
ポインターが格納されているメモリアドレスを監視して、いつ変更されたか (つまり、いつmd
再割り当てされたか) を確認し、そこでブレークする方法はありますか?