如果我为当前作用域的本地变量设置了一个观察点,它将在超出作用域时自动删除.有没有什么方法可以设置一次,并在进入同一范围时保持自动活动状态?
反正有没有设置条件观察点,比如watch var1 if var1==0?在我的情况下,条件不起作用.每当var1值改变时,gdb就会停止,而不是直到var1 == 0为真.我的gdb是GNU gdb 6.8-debian.
Zan*_*ynx 32
我同意Dave的观点,即条件断点是可行的方法.
但是,要执行您的要求,您可以使用GDB的commands命令设置每当遇到断点时要执行的GDB命令列表.我发现这非常有用.
我建议将GDB命令写入文件,以便易于编辑,并且可以使用source命令轻松重新加载.或者,您可以指定要在GDB命令行上加载的命令文件,或使用.gdbinit使它们自动加载.
一个很好用的例子commands:
假设我有一个format由许多其他函数调用的函数.我想打破它,但只有在调用函数之后do_step_3.
break do_step_3
commands
break format
continue
end
Run Code Online (Sandbox Code Playgroud)
你可以用这个来解决你的问题:
break func
commands
watch var
continue
end
Run Code Online (Sandbox Code Playgroud)
您可以通过将其设置为内存地址来设置不超出范围的观察点.
(gdb) p &var1
$1 = (int *) 0x41523c0
(gdb) watch *(int *)0x41523c0
Hardware watchpoint 1: *(int *)0x41523c0
Run Code Online (Sandbox Code Playgroud)
这也适用于其他数据类型和指针.
我不确定我们使用的是哪种语言,所以确切的答案会有所不同,但是您可以将变量更改为静态变量、全局变量或动态分配的变量(并且在函数返回时不要释放它吗?)。这样它的原始地址就不会改变,gdb 将能够在它上面设置断点。
而不是观察该值是否等于某个特定值;您应该在要检查 的值的行上设置一个条件断点var1。这实际上应该具有相同的效果
例如
(gdb) break main.c:123 if (var1 == 0)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26663 次 |
| 最近记录: |