忽略但计算 lldb/gdb 中的断点命中数

A. *_* K. 3 gdb lldb

我有两个断点AB。我想计算一下在被击中A之前发生了多少次。B这种情况A发生的次数相当多(>1000),所以我无法手动继续和迭代。A也可能发生在之后B,所以我无法运行程序完成以找出命中计数。有没有一种自动的方法来做到这一点?

Jim*_*ham 5

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

break set <HoweverYouSpecifyA> --auto-continue 1 -N BreakpointA
Run Code Online (Sandbox Code Playgroud)

那么 B 上的断点将是:

break set <HoweverYouSpecifyB> -C "break list BreakpointA" -C "break disable BreakpointA" --one-shot
Run Code Online (Sandbox Code Playgroud)

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

当我像这样做一个小断点两步时,我喜欢使用命名断点,否则你必须使用第一个断点的 ID,并且根据你设置断点的顺序,它可以在不同的运行中发生变化。

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

如果您想要更高级,您可以使用 B 的 Python 回调,并从 A 获取命中计数并根据您的需要进行报告。这需要更多工作,但更容易控制 Python 的输出格式...