2011-09-13 126 views
2

我正在操作一個龐大的代碼庫,並且希望監視某個特定變量(它被深埋在其中一個文件內)的值,尤其是當它被設置爲零時。在GDB中設置觀察點

1)變量不屬於全局範圍。是否有更好的選擇,而不是首先將斷點設置到定義它的函數中,然後設置觀察點?
2)在嘗試1中的選項後,我發現觀察點會在一段時間後被刪除,說明它使用了這個框架。這種方式增加了程序的繁瑣性,因爲我必須一次又一次地添加它。解決方法?
3)有沒有辦法檢查即觀察特定變量是否等於0(或任何特定的常量)?

+0

的可能的複製[如何設置本地範圍的變量持久的和有條件的觀察點?(http://stackoverflow.com/questions/1354637/how-do-i-set-persistent-and-conditional-watchpoints-局部變量部分),以及變量等於0部分的http://stackoverflow.com/questions/14390256/gdb-break-if-variable-equal-value –

回答

6

想監視特定變量

的值通常這是不是最好的方法,尤其是在大的代碼庫。

你真正想要做的是理解不變式,並聲明它們在進入和退出代碼的各個部分時是真實的。

1)變量不屬於全局作用域。是否有更好的選擇,而不是首先將斷點設置到定義它的函數中,然後設置觀察點?

否。對於自動(堆棧)變量,您必須在變量處於「活動」狀態的範圍內。

可以 do是在某行上設置斷點,並將命令附加到將自動設置觀察點的斷點上,例如,

(gdb) break foo.c:123 
(gdb) commands 1 
     silent 
     watch some_local 
     continue 
     end 

3)有沒有一種方法來檢查,即看如果一個特定的變量等於0

你不能做到這一點與一個觀察點,但你可以用一個條件斷點:

(gdb) break foo.c:234 if some_local == 0 
-1

我會假設你正在使用Linux。你可以試試這個:

的第一步是使靜態變量,如:

static int myVar; 

然後,使用-ggdb編譯代碼後,你必須發現裏面的二進制變量的地址,像我這樣(我用一個真實案例爲例):

readelf -s pdv | grep tmp | C++ FILT

以我的情況下,輸出爲:

47:081c1474 4 OBJECT本地默認25參見startproc(INT):: TMP

在這種情況下,地址是081c1474。現在,您可以設置觀測點內GDB:

手錶* 0x081c1474

心靈正確的地址前加 「* 0X」。

我知道這個問題是舊的,但我希望它能幫助呢。