【发布时间】:2021-09-07 18:17:33
【问题描述】:
我有两个断点A 和B。我想计算在B 被击中之前发生了多少A 实例。事情是A 发生了很多(> 1000),所以我不能手动继续和迭代。 A 也可能出现在 B 之后,因此我无法运行程序完成以找出命中数。有自动的方法吗?
【问题讨论】:
我有两个断点A 和B。我想计算在B 被击中之前发生了多少A 实例。事情是A 发生了很多(> 1000),所以我不能手动继续和迭代。 A 也可能出现在 B 之后,因此我无法运行程序完成以找出命中数。有自动的方法吗?
【问题讨论】:
您可以通过 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 的输出格式...
【讨论】:
有自动的方法吗?
在 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。
【讨论】:
ignore GDB 不必评估附加的命令。