如果我为当前范围的本地变量设置了一个观察点,它将在超出范围时自动删除。有没有办法设置一次,并在进入同一范围时保持自动生效?
无论如何设置条件观察点,如watch var1 if var1==0
?在我的情况下,条件不起作用。只要var1
的值发生更改,gdb就会停止,而不是直到var1 == 0
为真。我的gdb是GNU gdb 6.8-debian。
答案 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 > 3
和condition
命令一样正常。
如果正在观察的变量超出范围,要重新创建观察点,让gdb在Zan描述的函数开头使用断点自动执行此操作。
答案 2 :(得分:8)
您可以通过将其设置为内存地址来设置不超出范围的观察点。
(gdb) p &var1
$1 = (int *) 0x41523c0
(gdb) watch *(int *)0x41523c0
Hardware watchpoint 1: *(int *)0x41523c0
这也适用于其他数据类型和指针。
答案 3 :(得分:4)
我不确定我们使用的是哪种语言,所以确切的答案会有所不同,但您可以将变量更改为静态,全局或动态分配(并且在函数时不要释放它)返回?)。这样它的原始地址不会改变,gdb就可以断点了。
而不是观察它等于特定值的值;您应该在要检查var1
值的行上设置条件断点。这应该有效地产生同样的效果
e.g。
(gdb) break main.c:123 if (var1 == 0)