ignore命令用于跳过前N次断点命中,语法为ignore breakpoint_number count,即前count次触发不中断,第count+1次才暂停;例如ignore 3 4表示编号3断点前4次不暂停,第5次才停。

用 ignore 命令跳过前 N 次断点命中
直接用 ignore 命令,语法是 ignore <em>breakpoint_number</em> <em>count</em>。它不是“跳过前 N 次后停”,而是“前 count 次触发完全不中断,第 count+1 次才停”。比如 ignore 3 4 表示编号为 3 的断点接下来被命中 4 次都不会暂停,第 5 次才会真正停下来。
常见错误是以为 ignore 3 4 会让程序在第 4 次命中时停下——实际不会,它只会让第 5 次生效。如果想让断点“下一次就停”,得设 ignore 3 0。
-
ignore不影响断点本身的状态(Enb仍是y),只是加了一层计数逻辑 - 该设置会一直生效,直到你再次执行
ignore修改次数,或重启 GDB - 若断点在循环中高频触发,而你只关心最后一次,先设一个很大的
count(如 999),再结合info break查看已命中次数,最后重新ignore到n-1即可
怎么知道断点已经命中了多少次?
运行程序并触发几次断点后,执行 info break(或简写 i b),输出里会有一列叫 Disp,但真正关键的是 What 栏末尾的 stop only if … 或 ignore next X crossings;更直接的是看 Num 对应行最右侧的命中计数(不同 GDB 版本位置略有差异,但通常带数字和 “times” 或 “crossings” 字样)。
例如:
Num Type Disp Enb Address What
3 breakpoint keep y 0x0040052a in main at test.c:10
breakpoint already hit 7 times
这说明编号 3 的断点已被命中 7 次。此时若想让它在第 7 次停,就执行 ignore 3 6,再 r 重跑程序。
- 没看到命中次数?确认你用了带调试信息编译(
gcc -g),且断点确实被触发过(可先手动c几次验证) -
info break 3可只查单个断点,减少干扰 - 某些旧版 GDB 不显示“already hit”,此时只能靠
ignore后观察变量值反推,比如循环变量i在断住时是几,就知道当前是第几次
条件断点 + ignore 组合更可靠
纯靠 ignore 容易算错总次数,尤其当断点可能被多线程、信号或异常路径多次触发时。更稳的做法是:先用条件断点缩小范围,再对它用 ignore。
比如你想在循环最后一次(i == 200)停,不要盲目设 ignore 1 199,而是:
- 先设条件断点:
b test.c:10 if i == 200 - 再对这个新断点(假设编号为 4)执行
ignore 4 0(确保下一次就停) - 这样即使循环外有其他路径也走到第 10 行,也不会误停
注意:condition 命令只能修改已有断点的条件,不能新增;如果已有断点没条件,先 condition <em>num</em> <em>expr</em> 加上,再 ignore。
禁用/启用比 ignore 更适合临时跳过
如果你只是想“这次调试先别管这个断点,但之后还要用”,disable 比 ignore 更干净。比如 disable 5 后,断点 5 彻底不触发,info break 里它的 Enb 显示为 n;后续用 enable 5 就能原样恢复,连命中次数都保留。
-
disable和ignore本质不同:disable是开关,ignore是计数器 - 批量操作很实用:
disable 10-15一键关掉一整组断点,适合模块化调试 - 误用
ignore导致断点“失联”(比如设了ignore 2 1000却忘了改回来),enable 2并不能重置计数,必须再执行一次ignore 2 0
ignore、enable count)容易在多线程或异常流程中失效,真正关键的那次命中,优先靠条件表达式锁定,而不是依赖“第 N 次”这种脆弱计数。


















