2012-09-07 18 views
1

我正在嘗試調試一個程序,它似乎與指針傳遞有關。我有一個類定義如下:稱取一個指向數據對象gdb:當一個變量重置時發生中斷

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,但仍指向相同的內存地址)。在這兩個斷點之間有數千行執行,所以它不太可行,所以我想在指針改變時觀察和中斷。然而,watch d->mdfunction1的breakboint不工作,因爲我得到一個消息說

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

這大概是因爲在d是本地功能的情況下。有沒有辦法看到內存地址的指針存儲在哪裏,看看它何時被改變(即當md被重新分配)並在那裏破?

回答

0

使用print d->md獲取的d->md地址,看錶情*((metadata *)0x....)而不是使用名稱d的。

+0

我不再收到'Watchpoint deleted'錯誤,但現在當我嘗試繼續時程序凍結。任何想法爲什麼? – ewok

+0

嘗試觀看不同的表達式,例如通過地址查看d-> md的成員的值,例如獲取d-> md-> some_member的地址。也許MD不會改變,但價值觀正在改變。 – perreal

+0

也試試valgrind – perreal

相關問題