如何在本地范围的变量上设置持久和条件观察点?

Tim*_*Tim 37 gdb watchpoint

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

  2. 反正有没有设置条件观察点,比如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)


Rob*_*sak 14

您可以使用与断点相同的方式在观察点上设置条件.这是在文档中,但不可否认它几乎没有引起人们的注意.

所以watch my_var if my_var > 3工作得很好,就像condition命令一样.

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


Dan*_*ång 8

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

(gdb) p &var1
$1 = (int *) 0x41523c0
(gdb) watch *(int *)0x41523c0
Hardware watchpoint 1: *(int *)0x41523c0
Run Code Online (Sandbox Code Playgroud)

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

  • 这可能很有用,但在这里不起作用.局部变量不会在函数调用之间保持相同的地址 - 但是其他堆栈变量可能会使用该内存位置... (8认同)

Dav*_*veR 4

  1. 我不确定我们使用的是哪种语言,所以确切的答案会有所不同,但是您可以将变量更改为静态变量、全局变量或动态分配的变量(并且在函数返回时不要释放它吗?)。这样它的原始地址就不会改变,gdb 将能够在它上面设置断点。

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

例如

(gdb) break main.c:123 if (var1 == 0)
Run Code Online (Sandbox Code Playgroud)