1

ポインターの受け渡しに問題があると思われるプログラムをデバッグしようとしています。以下のように定義されたクラスがあります。

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ただし、 は引き続き同じメモリ アドレスを指します)。md2 つのブレークポイント間で数千行が実行されるため、単にステップ実行することは現実的ではないため、ポインターが変更されたときに監視してブレークしたいと考えています。ただし、次のメッセージが表示されるwatch d->mdため、ブレークボインは機能しfunction1ません

Watchpoint 1 deleted because the program has left the block in which its expression is valid

dこれは、inが関数のコンテキストに対してローカルであるために発生すると考えられます。mdポインターが格納されているメモリアドレスを監視して、いつ変更されたか (つまり、いつmd再割り当てされたか) を確認し、そこでブレークする方法はありますか?

4

1 に答える 1

0

name を使用する代わりに、 usingd->mdのアドレスを取得しprint d->md、式を監視します。*((metadata *)0x....)d

于 2012-09-07T19:26:31.893 に答える