delete 操作符用于删除对象的某个属性,返回布尔值;成功返回 true,不可配置属性在非严格模式下返回 false、严格模式下抛出 typeerror;不能删除 var 声明的变量,对数组使用会导致稀疏结构。

用 delete 加编号精准删除单个断点
最直接的方式是用 delete(简写 d)配合断点编号,比如 delete 1 或 d 2。这个操作只删编号对应的那个断点,不影响其他断点或观察点、捕获点。
常见错误是没先查编号就乱输数字,结果删错了。必须先执行 info breakpoints(或 i b)确认当前所有断点的编号、类型和位置。注意:编号不是按设置顺序“固定”的,每次 delete 后剩余断点的编号可能重排,所以下次操作前得重新看一遍列表。
clear 和 delete 的区别不能混用
clear 删除的是「位置」上的所有断点,比如 clear main.c:5 会删掉第 5 行所有已设的断点(哪怕有多个),clear func_name 则删掉该函数入口处所有断点。它不认编号,也不管你是不是只想删其中一个。
而 delete 只认编号,不管位置。所以:
- 想删某一行上所有断点 → 用 clear
- 想删某一个特定断点(比如编号为 3 的 watchpoint)→ 用 delete 3
- 想删某个条件断点但保留断点本身 → 用 condition 3(不带条件表达式),不是 delete
条件断点要删条件还是删断点?得看需求
条件断点本质是「带 if 的断点」,删除方式不同效果完全不同:
-
delete 2:连断点带条件一起干掉 -
condition 2:清空条件,断点变成普通断点,仍会在该位置触发 -
disable 2:断点还在列表里,但暂时不生效,后续可用enable 2恢复
很多人误以为 delete 是唯一选择,其实禁用(disable)更安全——尤其在调试中途想临时跳过某个断点时,避免反复重设。
批量删或范围删的写法要记牢
如果编号连续,可以用范围语法一次性处理:
-
delete 2-5:删编号 2、3、4、5 四个断点 -
delete(不带参数):删所有断点、观察点、捕获点 -
clear main:删所有设在main函数的断点,不管编号多少
注意:GDB 不支持 delete 1,3,5 这种离散编号列表,只能靠范围或多次执行单删命令。自动化场景下可配合 -ex 参数,例如:gdb -ex "delete 1" -ex "disable 2" ./a.out。
真正容易被忽略的点是:观察点(watch)、捕获点(catch)和普通断点共享同一套编号体系,info breakpoints 会把它们全列出来,但 delete 3 照样能删掉编号为 3 的 watchpoint —— 很多人只记得删 break 却忘了 watch 也在编号里。











