如果我设置一个观察点的局部变量的当前范围,将自动走出去的范围时被删除。 有没有什么办法设置一次,并保持它自动活着,只要输入相同的范围是什么?
反正是有设置条件观察点,像
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:
我不知道我们所使用的语言,所以确切的答案会有所不同,但你可以改变的变量是静态的,全局或动态分配(和函数返回时不释放它?)。 这样,它的原始地址不会改变,和gdb将能够断点就可以了。
而不是天天磨片它等于一个特定值的值; 你应该要检查的值的行设置条件断点
var1
。 这应该有效地产生同样的效果
如
(gdb) break main.c:123 if (var1 == 0)
文章来源: How do I set persistent and conditional watchpoints on locally scoped variables?