2011-11-08 66 views
2

在Linux中使用Valgrind或任何其他調試器,如何查看變量被修改的位置。我正在使用gcc。請注意,我不想使用gdb進入代碼。我只想運行該程序並讓調試器最終報告我,在代碼中修改變量的地方。檢查變量何時被修改

+3

[我可以在GDB的'內存訪問'中設置斷點?](http://stackoverflow.com/questions/58851/can-i-set-a-breakpoint-on-memory-access- in-gdb) – bobbymcr

回答

1

使用Breakpoint Command Lists在gdb中執行此操作。你將不得不知道要觀看的變量的地址。設置觀察點,像這樣的一系列命令:

watch *0xfeedface 
commands 
silent 
bt 
cont 
end 

您也可以選擇保存所有這些輸出到日誌文件。查看gdb doc瞭解更多詳情。

2

嗯,想想它不是確切Can I set a breakpoint on 'memory access' in GDB?的副本,因爲它要求多一點。所以:

  1. 用GDB
  2. 找到要觀看(硬件觀察點只爲看地址工作,所以你必須把它運行到變量或對象實例化點的地址,把他們的地址和該地址使用watch命令
  3. 附加命令的地址給你(你需要收集或任何其他信息)回溯,繼續

所以你必須像。:

p &variable 
watch *$$ 
cmd 
bt 
c 
end 

(我不完全確定與$$,我通常使用的$np命令作爲打印)。

+0

如果變量在許多地方被修改(比如說,在一個緊密的循環中),這將會*不可耐受*慢。如果這是你的最後手段,我會說只使用這種方法。 –

+0

假設你想跟隨變量的變化,這並不是很慢,因爲上面的觀察點通常是硬件觀察點。軟件觀察點(例如,觀看t [i])速度要慢得多...... –

+0

@BasileStarynkevitch:如果你添加'cmd/bt/c/end',它會*變慢。這是印刷回溯減慢它,而不是觀察點。 –