2009-08-30 42 views
32
  1. 如果我爲當前範圍的本地變量設置了一個觀察點,那麼當它離開範圍時它將被自動刪除。有什麼辦法可以設置一次,並保持它在任何時候進入相同的範圍自動活着?如何在本地作用域變量上設置持久性和條件觀察點?

  2. 有無論如何設置有條件的觀察點,如watch var1 if var1==0?在我的情況下,條件不起作用。只要var1的值發生變化,gdb就會停止,而不是直到var1 == 0爲真。我的gdb是GNU gdb 6.8-debian。

回答

3
  1. 我不知道我們所使用的語言,所以確切的答案會有所不同,但你可以改變的變量是靜態的,全局或動態分配(以及不自由當函數返回時?)。這樣它的原始地址不會改變,並且gdb可以在其上斷點。

  2. 而不是觀察值是否等於特定值;您應該在要檢查var1的值的行上設置條件斷點。這應該實際上具有相同的效果

例如,

(gdb) break main.c:123 if (var1 == 0) 
+0

我正在使用C++。我使用watchpoint超過斷點,因爲代碼中可能有很多地方會改變變量的值。所以將斷點添加到每個地方是不現實的。我想看看是否可以設置條件觀察點。 – Tim 2009-08-31 00:52:19

29

我同意戴夫有條件的斷點是要走的路。

但是,要做你所問的問題,你可以使用GDB的commands命令來設置一個GDB命令列表,以便在命中斷點時執行。我覺得這非常有用。

我建議您將GDB命令寫入文件,以便易於編輯,並且易於使用source命令重新加載。或者,您可以指定要在GDB命令行上加載的命令文件,或使用.gdbinit使它們自動加載。

良好的使用commands的例子:
假設我有一個函數format由很多其他的功能調用。我想打破它,但只有在功能do_step_3被調用後。

break do_step_3 
commands 
    break format 
    continue 
end 

您可以使用此爲您的問題是這樣的:

break func 
commands 
    watch var 
    continue 
end 
+0

優秀點!謝謝! – Tim 2009-08-31 11:26:34

12

您可以在您使用斷點做同樣的方式觀察點設置條件。這是in the documentation,但無可否認,它幾乎沒有引起人們的注意。

因此watch my_var if my_var > 3工作得很好,正如condition命令一樣。

如果正在監視的變量超出範圍,請重新創建監視點,讓gdb在函數開始時使用斷點自動執行此操作,如Zan所述。

8

您可以通過將觀察點設置爲內存地址來設置不超出範圍的觀察點。

(gdb) p &var1 
$1 = (int *) 0x41523c0 
(gdb) watch *(int *)0x41523c0 
Hardware watchpoint 1: *(int *)0x41523c0 

這也適用於其他數據類型和指針。

+6

這可能很有用,但在這裏不起作用。局部變量不會在函數調用之間保持相同的地址 - 但其他堆棧變量可能會使用該內存位置... – Nick 2011-10-05 16:54:37