如何设置在局部范围的变量持久的和有条件的观察点?(How do I set persistent a

2019-07-04 03:06发布

  1. 如果我设置一个观察点的局部变量的当前范围,将自动走出去的范围时被删除。 有没有什么办法设置一次,并保持它自动活着,只要输入相同的范围是什么?

  2. 反正是有设置条件观察点,像watch var1 if var1==0 ? 在我的情况下,状态简化版,工作。 GDB停止每当var1的值被改变,而不是直到var1 == 0为真。 我GDB是GNU用gdb 6.8 debian的。

Answer 1:

我与戴维同意,条件断点是要走的路。

但是,你问什么,你可以用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


Answer 2:

您可以设置在您使用断点做同样的方式观察点的条件。 这是在文档中 ,但不可否认它几乎提请注意自身。

所以, watch my_var if my_var > 3的作品就好了,一样的condition命令。

要重新观察点,如果是看变量超出范围,为咱描述了GDB已经在函数的开始自动执行此操作使用断点。



Answer 3:

您可以设置一个观察点,不将其设置为内存地址超出范围。

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

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



Answer 4:

  1. 我不知道我们所使用的语言,所以确切的答案会有所不同,但你可以改变的变量是静态的,全局或动态分配(和函数返回时不释放它?)。 这样,它的原始地址不会改变,和gdb将能够断点就可以了。

  2. 而不是天天磨片它等于一个特定值的值; 你应该要检查的值的行设置条件断点var1 。 这应该有效地产生同样的效果

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


文章来源: How do I set persistent and conditional watchpoints on locally scoped variables?