【问题标题】:How do I set persistent and conditional watchpoints on locally scoped variables?如何在本地范围的变量上设置持久和条件观察点?
【发布时间】:2021-07-11 02:09:26
【问题描述】:
  1. 如果我为当前作用域的局部变量设置了观察点,那么当超出作用域时,它将被自动删除。有什么方法可以设置一次并在进入相同范围时使其自动保持活动状态?

  2. 有没有设置条件观察点,比如watch var1 if var1==0?在我的情况下,条件不起作用。每当var1 的值更改时,gdb 就会停止,而不是直到var1 == 0 为真。我的 gdb 是 GNU gdb 6.8-debian。

【问题讨论】:

    标签: gdb watchpoint


    【解决方案1】:

    我同意 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
    

    【讨论】:

    • 这真的很酷。我发现它非常有用,但我认为它有一个问题,即format 处的断点将一直保留到明确删除。这意味着每次format 被命中时我都必须手动删除断点。有没有办法让它自动生成?
    • @Salahuddin 试试tbreak。我认为这是暂时的休息,点击后会自行删除或禁用。
    【解决方案2】:

    您可以像设置断点一样在观察点上设置条件。这是in the documentation,但不可否认,它几乎不会引起人们的注意。

    所以watch my_var if my_var > 3 工作得很好,condition 命令也是如此。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 这很有用,但在这里不起作用。局部变量不会在函数调用之间保持相同的地址 - 但其他堆栈变量可能会使用该内存位置...
      【解决方案4】:
      1. 我不确定我们使用的是哪种语言,因此确切的答案会有所不同,但是您能否将变量更改为静态、全局或动态分配(并且在函数执行时不要释放它返回?)。这样它的原始地址就不会改变,gdb 可以在上面断点。

      2. 当它等于特定值时,而不是观察值;您应该在要检查var1 值的行上设置一个条件断点。这应该有效地产生相同的效果

      例如

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

      【讨论】:

      • 我正在使用 C++。我在断点上使用观察点,因为代码中可能有很多地方会改变变量的值。所以在每个地方都加断点是不现实的。我想看看是否可以设置条件观察点。
      猜你喜欢
      • 2011-03-29
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      相关资源
      最近更新 更多