条件断点必须是纯表达式,每次执行到该行时求值;错误写法如语句、赋值、副作用操作会导致断点失效;正确用法包括比较、可选链、字符串方法等,且需注意语言特性与作用域。

条件断点不是“加个判断就行”,它必须是纯表达式,且每次执行到该行时都会求值——写错语法或带副作用,断点直接失效。
条件断点只能写表达式,不能写语句
调试器在命中断点位置时,会把你在编辑框里输入的内容当作 JavaScript(或对应语言)表达式去求值。它不支持 if、print()、赋值、函数调用(除非是纯读取型方法)等语句。
- ✅ 正确:
i === 100、user?.id === "admin"、"prod".includes(env) - ❌ 错误:
console.log(i)、i = 0、if (x) { ... }、data.push(1) - Java 用户注意:
userId.equals("admin")可用,但userId == "admin"多数情况为 false(字符串比较) - Python 用户注意:VS Code 默认使用 Python 调试器(ptvsd 或 debugpy),表达式语法就是 Python 表达式,如
len(items) > 5、"error" in log_msg
右键断点后选“编辑断点”,不是“添加断点”
很多人误以为要新建一个断点类型,其实所有条件断点都从已有断点改造而来。先左键点出行号旁的红点设普通断点,再右键它,才能看到“编辑断点”菜单项。
- 如果右键的是空白行号区域,弹出的是“添加日志断点”或“添加条件断点”——但这只是快捷入口,底层仍走同一套表达式校验逻辑
- 编辑后,断点图标不变,但鼠标悬停会显示你写的条件,比如
i === 99 - 禁用断点时图标变灰;删除断点要再点一次红点,或右键选“删除断点”
命中次数断点比条件表达式更轻量
当目标很明确(如“第 100 次循环才看”),用 Hit Count 比写 i === 99 更安全——它不依赖变量名是否存在、是否可访问,也不触发表达式求值开销。
- 右键断点 → “命中次数” → 输入
100:程序前 99 次路过此行直接跳过,第 100 次暂停 - 适用于:遍历大数组、训练 epoch 循环、重试逻辑中第 N 次失败时介入
- 注意:
Hit Count是累计命中次数,不是“当前迭代索引”。若断点在嵌套循环内,计数包含所有外层循环的重复触发
Log Message 断点适合替代 console.log
想看值又不想中断执行?Log Message 是唯一不暂停的“断点”类型,输出进 Debug Console,支持变量插值,且不污染源码。
- 右键断点 → “添加日志消息” → 输入类似
batch {i}: loss = {loss:.4f} - 变量名必须真实存在且作用域可见,否则插值为空或报错(如
{undefined_var}显示undefined) - 中文内容完全支持,如
用户 {user.name} 登录成功,但 {} 内仍需合法表达式 - 性能影响极小,适合高频打点;但别滥用——Debug Console 刷屏会掩盖真正关键信息
最容易被忽略的是表达式求值时机:它发生在“即将执行当前行之前”,所以你能看到这一行要用到的变量状态,但看不到它执行后的结果。想观察副作用,得把断点设在下一行。











