断点不生效主因是调试会话未启动或launch.json配置错误;红点实心才表示绑定成功,空心即“unbound breakpoint”;需检查语言模式、保存文件、sourcemaps设置及webroot路径对齐。

断点不生效,90% 是因为没真正启动调试会话,或 launch.json 配置和实际运行路径对不上——不是 VS Code 坏了,是调试器压根没连上你的代码。
怎么确认断点真的绑定了
红点必须是实心的;空心圆 = “未绑定”,说明该行不可中断(比如空行、注释、函数声明行,或 source map 没加载成功)。鼠标悬停断点,如果提示 Unbound breakpoint,就别指望它停。
- 保存文件后再设断点:未保存的 .js/.ts 文件,VS Code 可能不识别为可执行源码
- 右下角状态栏检查语言模式:必须是
JavaScript、TypeScript或对应语言,不能是Plain Text - Node.js 项目中,确保已启用内置
Node Debug(不用额外装扩展),Python 项目则必须装ms-python.python - 按
F5启动的是调试会话;点右上角绿色三角(Code Runner)只是执行,不走调试协议
launch.json 配置最容易错的三个地方
launch.json 不是摆设,它决定调试器找哪段代码、用什么环境跑、能不能读到原始变量名。错一个字段,断点就漂移或失效。
-
program(Node.js)或module(Python):必须指向真实入口,推荐用${workspaceFolder}/src/index.js这类绝对路径写法,别写./index.js(当前工作目录可能不是你想象的) -
cwd:影响require()、import和文件读写。Node 报Cannot find module、Python 报ModuleNotFoundError,八成是它设错了 -
sourceMaps:TypeScript/Vue/React 项目必须显式设为true,否则断点停在dist/index.js里,变量全是_a、_b
前端调试时断点跳到压缩代码或空白行
你在 src/App.tsx 打了断点,结果停在 main.8a3f2.js 的第 1 行——这不是 bug,是构建产物没带 source map 或映射路径没对齐。
- Vite 用户检查
vite.config.ts中build.sourcemap是否为true;Webpack 用户确认devtool设为'source-map'而非'eval' -
launch.json里加"webRoot": "${workspaceFolder}",并确保开发服务器(如vite dev)确实跑在这个路径下 - 禁用浏览器缓存:Chrome 调试时勾选 DevTools → Network →
Disable cache,否则可能加载旧的无 map 文件 - 避免在
minify: true下调试;Vite 中临时设build.minify = false,Webpack 关掉TerserPlugin
条件断点和日志点的实际限制
右键断点选“编辑断点”输 i === 5 很简单,但真用起来容易翻车——调试器只保证求值,不保证副作用安全。
- 条件表达式里禁止写
i++、console.log()、arr.push():执行顺序不确定,可能跳过、重复、甚至让程序行为异常 - 变量必须在该行作用域内存在:比如在
for (let i = 0; ...)循环头设断点,i在循环体第一行才初始化,头里访问就是undefined - 高频循环慎用:每次迭代都求值一次条件,性能开销明显;不如先用普通断点 + F5 继续,或改用
debugger语句加if (i === 5) debugger - 日志点(Log Point)本质是注入
console.log(),不暂停,但要注意:它不支持异步等待,也不能调用未定义函数
最常被忽略的复杂点:断点位置、编译输出路径、调试器加载逻辑,三者必须严丝合缝。少对齐一个环节,你就只能看到 undefined 或空面板。











