2012-05-31 113 views
4

我有這樣的結構:在一個大的代碼的不同位置gdb的觀察點

struct A 
    { 
     int a; 
     char b; 
    }; 

這種結構被引用。指向這個結構體的指針被傳遞給不同的函數,並相應地更新這個結構體中的變量。我想在這個結構中的變量a上設置一個觀察點,因爲它在許多函數中傳遞。看看有什麼變化。我如何設置這個觀察點?

回答

6

首先設置一個斷點在其中創建使用休息你的結構的情況下,像

break myfile.c:9 

就用手錶設置觀察點,像

watch myStructInstance.a 

對於變量a

watch *0x7ffff75177f0 

爲內存地址。存儲器地址可以容易地通過使用打印得到,像

print &myStructInstance.a 

現在每次變量一個或給定的存儲器地址被改性的gdb將斷裂。

2

我在調試我的虛擬內存模擬器時遇到同樣的問題。問題是如何密切關注結構中的數據。

我試過使用打印來檢查,但那太嘈雜了。因爲我必須打印出超過15個變量。

我也嘗試過使用觀察點,但在我的機器上,我只能設置不超過4個硬件觀察點。這甚至不接近我的目標。

最後,我通過在.gdbinit文件中使用用戶定義函數來找到我的解決方案。例如如果我想看我的結構數組,使用

define lookintoStructs 
    if mystruct != 0x0 
     print mystruct[0] 
     print mystruct[1] 
     print mystruct[2] 
     print mystruct[3] 
     print mystruct[4] 
     print mystruct[5] 
    end 
end 

,使其更方便地使用,我想使它勾我在gdb下一個指令。

define hook-next 
    lookintoStructs 
end 

因此,當我在gdb中調用next或n時,可以自動調用lookintoStructs。對我來說工作得很好。