41
  1. 如果我为当前作用域的本地变量设置了观察点,那么当超出作用域时它将被自动删除。有什么方法可以设置一次并在进入相同范围时使其自动保持活动状态?

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

4

4 回答 4

34

我同意 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
于 2009-08-30T19:47:01.157 回答
18

您可以像设置断点一样在观察点上设置条件。这在文档中,但不可否认,它几乎不会引起人们的注意。

所以watch my_var if my_var > 3工作得很好,condition命令也是如此。

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

于 2010-12-26T05:20:52.437 回答
8

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

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

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

于 2011-09-01T11:20:34.017 回答
4
  1. 我不确定我们使用的是哪种语言,因此确切的答案会有所不同,但是您能否将变量更改为静态、全局或动态分配(并且在函数返回时不释放它?)。这样它的原始地址就不会改变,并且 gdb 将能够在其上设置断点。

  2. 当它等于特定值时,而不是观察该值;您应该在要检查的值的行上设置一个条件断点var1。这应该有效地具有相同的效果

例如

(gdb) break main.c:123 if (var1 == 0)
于 2009-08-30T19:36:49.570 回答