ignore命令使断点跳过前n−1次命中、第n次暂停,如ignore 2 5表示断点2前5次跳过、第6次停;enable count则在命中n次后自动禁用断点,二者行为本质不同。

用 ignore 命令跳过前 N 次断点命中
GDB 本身不支持“只在第 N 次命中时停”,但等价效果是:让断点忽略前 N−1 次命中,第 N 次才真正暂停。这靠 ignore 命令实现。
常见错误是把 ignore 和 enable count 混用——后者是“启用后最多命中 N 次就自动禁用”,行为完全不同。
-
ignore 2 5:编号为 2 的断点,前 5 次命中直接跳过,第 6 次才停 - 执行后,
info b显示该断点的Ignore列变为5 - 忽略次数只对当前断点生效,重启 GDB 或
delete后重设会重置 - 如果想恢复成“每次命中都停”,需再次执行
ignore 2 0
enable count 是另一条路:命中 N 次后自动禁用
它不是“第 N 次停”,而是“停 N 次后就不再管这个断点”。适合做阶段性观察,比如只关心循环头三次进入。
-
enable count 3 2:让断点 2 启用,并在命中 3 次后自动变成disabled - 每次命中都会停,停完第 3 次后,
info b中该断点状态从y变成n - 和
ignore不同,它不改变断点是否触发,只控制“触发后是否继续存在” - 若中途用
disable 2,则计数器不会清零;但delete 2再b重设,计数归零
条件断点 + 计数变量更灵活,但要改源码或确保变量可见
当 ignore 和 enable count 都不够用(比如要按某循环变量值停、或跨函数累计),就得手动加逻辑。前提是变量在作用域内且未被优化掉。
- 先确认变量没被编译器优化:编译时加
-O0 -g,否则print i可能报Cannot access memory - 设置条件断点:
b func.c:42 if counter == 7,前提是counter在该行可见 - 如果变量是局部静态或全局,通常没问题;但自动变量(如 for 循环里的
i)在某些优化等级下可能不可见 - 注意条件表达式里不能调用函数(GDB 不支持运行时求值函数调用)
容易被忽略的细节:断点编号变化和多线程场景
断点编号不是固定 ID,delete 或 clear 后新增断点会复用最小空闲编号,ignore 2 可能突然指向别的断点。
- 操作前务必先
info b确认当前编号对应的是你要处理的那个断点 - 多线程下,
ignore是进程级计数,所有线程共用同一个计数器 - 如果需要 per-thread 计数(比如只在某线程第 3 次进函数时停),得结合
thread apply all或用条件断点过滤$_thread == 3 -
ignore不支持负数或非整数,输错会静默失败,不会报错提示











