【问题标题】:Checking when a variable is modified检查变量何时被修改
【发布时间】:2011-11-08 07:26:47
【问题描述】:

在 Linux 中使用 Valgrind 或任何其他调试器,如何查看变量被修改的位置。我正在使用 gcc。请注意,我不想使用 gdb 单步执行代码。我只想运行程序并让调试器最后报告我,在代码中修改变量的地方。

【问题讨论】:

标签: c linux debugging gcc x86


【解决方案1】:

嗯,想一想这不是Can I set a breakpoint on 'memory access' in GDB?精确副本,因为它要求的更多。所以:

  1. 使用 gdb
  2. 找到您要监视的地址(硬件监视点仅适用于监视地址,因此您必须将其运行到实例化变量或对象的位置,获取它们的地址并使用@该地址上的 987654322@ 命令。
  3. 将命令附加到地址以向您提供回溯(或您需要收集的任何其他信息)并继续。

所以你会有类似的东西:

p &variable
watch *$$
cmd
bt
c
end

(我不完全确定$$,我通常使用p 命令打印的$<i>n</i>)。

【讨论】:

  • 如果变量在很多地方被修改(比如说,在一个紧密的循环中),这将是难以忍受的慢。我会说只有在万不得已时才使用这种方法。
  • 它并没有那么慢,假设你想跟踪变量的变化,因为上面的观察点通常是硬件观察点。软件观察点(例如,观察 t[i])要慢得多...
  • @BasileStarynkevitch:如果你添加cmd/bt/c/end,它很慢。减慢速度的是回溯的打印,而不是观察点。
  • 同意。所以这取决于变量是否经常变化。
【解决方案2】:

使用Breakpoint Command Lists 在 gdb 中执行此操作。您必须知道要查看的变量的地址。使用以下一系列命令设置观察点:

 watch *0xfeedface
 commands
 silent
 bt
 cont
 end

您还可以选择将所有这些输出保存到日志文件中。更多详情请关注gdb doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2014-04-29
    相关资源
    最近更新 更多