gdb:重置变量时中断

时间:2012-09-07 19:19:19

标签: c++ debugging gdb breakpoints

我正在尝试调试一个似乎存在指针传递问题的程序。我的课程定义如下:

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设置断点,在function3设置断点。在这两个断点之间的某处,md被重新分配以指向不同的元数据对象(d,但仍然指向相同的内存地址)。在两个断点之间执行了数千行,因此单步执行并不可行,因此我想在md指针更改时观察和中断。但是,watch d->md中的breakboint function1不起作用,因为我收到消息说

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

这可能是因为d在函数的上下文中是局部的。有没有办法观察存储md指针的内存地址,以查看它何时被更改(即重新分配md时)并在那里中断?

1 个答案:

答案 0 :(得分:0)

使用d->md获取print d->md的地址并观看表达式*((metadata *)0x....),而不是使用名称d