首页 > 解决方案 > 忽略但计算 lldb/gdb 中的断点命中

问题描述

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

标签: gdblldb

解决方案


您可以通过 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 的命中数。

如果你想变得更漂亮,你可以为 B 使用 Python 回调,并从 A 获取命中数并报告你想要的。这是更多的工作,但更容易控制 Python 的输出格式......


推荐阅读