断点必须启动调试会话才生效,仅点击右上角绿色三角(run code)或终端执行命令不会触发;需通过ctrl+shift+d打开调试侧边栏,选择配置后点击绿色▶️启动,且确保launch.json中sourcemaps:true、program路径正确、文件已保存并匹配语言模式。

断点本身不暂停代码,必须启动调试会话才能生效;光标点出行号左边的红点只是标记位置,不是执行指令。
断点没反应?先确认是不是在“调试”而不是“运行”
点了右上角绿色三角(Run Code)或终端里敲 node index.js,断点永远不会触发——那只是普通执行,没走调试协议。必须:
- 按
Ctrl+Shift+D(Windows/Linux)或Cmd+Shift+D(macOS)打开“运行和调试”侧边栏 - 选中一个配置(比如
Node.js: Launch Program或Python: Current File) - 点击绿色 ▶️ 启动,而不是右上角的运行按钮
- 如果配置列表为空,点齿轮图标生成
.vscode/launch.json,别跳过这步
红点是空心的?说明断点没绑定成功
实心红点 ✅ = 已激活;空心红点 ❌ = “Unbound breakpoint”,常见原因:
- 文件未保存:未保存的
.ts或.js文件可能不被识别为可执行源码 - 语言模式错误:右下角状态栏显示
Plain Text,需点击切换为JavaScript/TypeScript/PHP等 - 打在无效行:空行、注释、函数声明行(如
function foo() {)无法设有效断点 - sourceMap 没加载:TypeScript/Vue/React 项目里,断点打在
src/却停在dist/的压缩行,大概率是"sourceMaps": true没开或.map文件缺失
条件断点怎么写才真正生效
右键已有断点 → Add Conditional Breakpoint,注意:
- 表达式必须用 JavaScript 语法,无论你调的是 Python 还是 PHP:
i === 5✅,i == 5❌(松等可能隐式转换出错),$user_id == 1001❌(PHP 风格直接失效) - 字符串必须加引号:
status === "error",不能写status === error(会被当变量查) - 防
undefined:user && user.id === 123,别用user?.id === 123(可选链在部分调试器中不支持) - 禁用副作用:别在条件里写
i++、console.log()、arr.push()——求值顺序不确定,行为不可控
不同语言最易漏的关键配置
launch.json 不是摆设,配错一个字段,断点就漂移或静默失效:
-
Node.js:必须显式加
"sourceMaps": true(尤其 TypeScript 项目),否则断点停在编译后代码里;ESM 项目还需"runtimeArgs": ["--loader", "ts-node/esm"] -
Python:优先用
"module": "myapp.main"而非"program": "./src/main.py";多进程训练要加"subProcess": true -
PHP:确保
xdebug.mode=debug已启用,且launch.json中"pathMappings"正确映射本地路径与服务器路径(如"/var/www/html": "${workspaceFolder}") -
前端(Vite/Webpack):构建时必须开
build.sourcemap: true(Vite)或devtool: 'source-map'(Webpack),并禁用浏览器缓存(DevTools → Network → Disable cache)
真正卡住人的从来不是“怎么点红点”,而是 launch.json 里一个路径写错、sourceMaps 忘开、或者调试器根本没连上进程——这些地方一错,断点就成摆设。











