如何在本地范围的变量上设置持久和条件观察点?

时间:2009-08-30 19:00:58

标签: gdb watchpoint

  1. 如果我为当前范围的本地变量设置了一个观察点,它将在超出范围时自动删除。有没有办法设置一次,并在进入同一范围时保持自动生效?

  2. 无论如何设置条件观察点,如watch var1 if var1==0?在我的情况下,条件不起作用。只要var1的值发生更改,gdb就会停止,而不是直到var1 == 0为真。我的gdb是GNU gdb 6.8-debian。

4 个答案:

答案 0 :(得分:32)

我同意Dave的观点,即条件断点是可行的方法。

但是,要执行您的要求,您可以使用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

答案 1 :(得分:14)

您可以使用与断点相同的方式在观察点上设置条件。这是in the documentation但不可否认,它几乎不会引起人们的注意。

所以watch my_var if my_var > 3condition命令一样正常。

如果正在观察的变量超出范围,要重新创建观察点,让gdb在Zan描述的函数开头使用断点自动执行此操作。

答案 2 :(得分:8)

您可以通过将其设置为内存地址来设置不超出范围的观察点。

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

这也适用于其他数据类型和指针。

答案 3 :(得分:4)

  1. 我不确定我们使用的是哪种语言,所以确切的答案会有所不同,但您可以将变量更改为静态,全局或动态分配(并且在函数时不要释放它)返回?)。这样它的原始地址不会改变,gdb就可以断点了。

  2. 而不是观察它等于特定值的值;您应该在要检查var1值的行上设置条件断点。这应该有效地产生同样的效果

  3. e.g。

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