我正在操作一個龐大的代碼庫,並且希望監視某個特定變量(它被深埋在其中一個文件內)的值,尤其是當它被設置爲零時。在GDB中設置觀察點
1)變量不屬於全局範圍。是否有更好的選擇,而不是首先將斷點設置到定義它的函數中,然後設置觀察點?
2)在嘗試1中的選項後,我發現觀察點會在一段時間後被刪除,說明它使用了這個框架。這種方式增加了程序的繁瑣性,因爲我必須一次又一次地添加它。解決方法?
3)有沒有辦法檢查即觀察特定變量是否等於0(或任何特定的常量)?
我正在操作一個龐大的代碼庫,並且希望監視某個特定變量(它被深埋在其中一個文件內)的值,尤其是當它被設置爲零時。在GDB中設置觀察點
1)變量不屬於全局範圍。是否有更好的選擇,而不是首先將斷點設置到定義它的函數中,然後設置觀察點?
2)在嘗試1中的選項後,我發現觀察點會在一段時間後被刪除,說明它使用了這個框架。這種方式增加了程序的繁瑣性,因爲我必須一次又一次地添加它。解決方法?
3)有沒有辦法檢查即觀察特定變量是否等於0(或任何特定的常量)?
想監視特定變量
的值通常這是不是最好的方法,尤其是在大的代碼庫。
你真正想要做的是理解不變式,並聲明它們在進入和退出代碼的各個部分時是真實的。
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
我會假設你正在使用Linux。你可以試試這個:
的第一步是使靜態變量,如:
static int myVar;
然後,使用-ggdb編譯代碼後,你必須發現裏面的二進制變量的地址,像我這樣(我用一個真實案例爲例):
readelf -s pdv | grep tmp | C++ FILT
以我的情況下,輸出爲:
47:081c1474 4 OBJECT本地默認25參見startproc(INT):: TMP
在這種情況下,地址是081c1474。現在,您可以設置觀測點內GDB:
手錶* 0x081c1474
心靈正確的地址前加 「* 0X」。
我知道這個問題是舊的,但我希望它能幫助呢。
的可能的複製[如何設置本地範圍的變量持久的和有條件的觀察點?(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 –