2011-11-08 39 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',它会*变慢。这是印刷回溯减慢它,而不是观察点。 –