【问题标题】:Ignore but count breakpoint hits in lldb/gdb忽略但计算 lldb/gdb 中的断点命中
【发布时间】:2021-09-07 18:17:33
【问题描述】:

我有两个断点AB。我想计算在B 被击中之前发生了多少A 实例。事情是A 发生了很多(> 1000),所以我不能手动继续和迭代。 A 也可能出现在 B 之后,因此我无法运行程序完成以找出命中数。有自动的方法吗?

【问题讨论】:

    标签: gdb lldb


    【解决方案1】:

    您可以通过 A 处的自动继续断点和断点 B 上的命令轻松完成此操作。在最简单的方法中,A 上的断点如下所示:

    break set <HoweverYouSpecifyA> --auto-continue 1 -N BreakpointA
    

    那么 B 上的断点将是:

    break set <HoweverYouSpecifyB> -C "break list BreakpointA" -C "break disable BreakpointA" --one-shot
    

    break list BreakpointA 输出将显示当您击中 B 时 A 的命中计数,这是您想知道的。通过在击中 B 时禁用 A,A 的命中计数将保持在击中 B 时的状态,因此您应该能够在之后的任何时候检查它(直到您重新运行)。

    当我像这样两步执行小断点时,我喜欢使用命名断点,否则您必须使用第一个断点的 ID,并且可以根据您执行的顺序在运行之间更改设置断点。

    我还将断点 B 设为一次性,因为您只是使用它来冻结 A 的命中计数,因此它只需要被命中一次。如果更方便你也可以让 B 自动继续,然后在程序退出时读出 A 的命中数。

    如果你想变得更漂亮,你可以使用 Python 回调来代替 B,并从 A 获取命中数并报告你想要的任何内容。它的工作量更大,但更容易控制 Python 的输出格式...

    【讨论】:

      【解决方案2】:

      有自动的方法吗?

      在 GDB 中,我通常这样做:

      (gdb) ign 1 10000
      (gdb) cont
      

      当第二个 (B) 断点被命中时,info break 会说:

      (gdb) info b
      Num     Type           Disp Enb Address            What
      1       breakpoint     keep y   0x0000555555555129 in a at t.c:1
              breakpoint already hit 1234 times                         <<<===
              ignore next 8766 hits
      2       breakpoint     keep y   0x0000555555555130 in b at t.c:2
              breakpoint already hit 1 time
      

      如果 10000 不够用,您可以随时将其增加到 10000000。

      【讨论】:

      • 你不能通过将“继续”命令添加到第一个断点来做同样的事情吗?这样您就不必猜测最大命中数。
      • @JimIngham 你可以,但这可能会更慢(虽然我没有测量过)。使用ignore GDB 不必评估附加的命令。
      • 如果 gdb 可以足够快地处理停止以使单个“继续”命令能够超越噪音,我可能会对它的效率印象深刻(或者对命令解释器的性能感到失望)。也就是说,自从我上次从事 gdb 工作以来已经有几十年了,所以这些天我对它的性能没有很好的感觉。
      猜你喜欢
      • 2014-01-15
      • 1970-01-01
      • 2017-07-18
      • 2023-03-08
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      相关资源
      最近更新 更多