断点不生效的根本原因是Node.js的--inspect仅监听首次入口执行,而定时任务(如setInterval、node-cron)的异步回调脱离调试上下文;必须改用--inspect-brk启动或采用Attach模式,并确保sourceMap正确映射、端口配置一致、避免字符串任务体。
node --inspect 启动后断点不生效常见现象是:加了 debugger 或在 VSCode 编辑器里点了断点,但代码跑过就跳过了,调试器完全没响应。根本原因通常是定时任务(比如 setInterval、node-cron)启动后,主线程没被调试器持续挂住——Node 的 --inspect 默认只监听首次入口文件执行,后续异步回调(尤其是延时触发的)可能脱离调试上下文。
实操建议:
node --inspect-brk 启动(不是 --inspect),让进程在第一行就暂停,等 VSCode 附加上去再继续pm2 或其他进程管理器,它会绕过 --inspect,直接改用 VSCode 的 Attach to Node.js Process 模式launch.json 中的 port 和启动命令一致,默认是 9229,但某些 Docker 或远程场景会被映射或占用launch.json 怎么配才支持定时触发调试关键不是“支持定时”,而是让调试器能捕获到定时回调里的代码执行。默认的 node 调试配置只管入口文件,对 setTimeout 或 cron.schedule 内部的函数调用无感知,除非它们在同一个 JS 执行上下文中。
实操建议:
attach 模式比 launch 更可靠:先启动带 --inspect=0.0.0.0:9229 的 Node 进程,再在 VSCode 里选 Attach to Node.js Process
launch.json 中必须设 "protocol": "inspector"(旧版 legacy 协议不支持现代 async/await 断点)child_process.fork),需额外加 --inspect-port=9230 并为子进程单独配置 attachnode-cron 或 node-schedule 断点失效怎么办这些库内部大量使用 setTimeout 和闭包,V8 的调试器有时无法把回调函数和原始源码位置准确映射,尤其当任务定义在模块顶层、或通过字符串表达式注册时(如 cron.schedule('0 * * * *', 'console.log(1)'))。
实操建议:
cron.schedule('*/10 * * * *', () => { debugger; console.log('hit'); })
sourceMap 开启:TS 项目编译时加 "sourceMap": true,JS 项目若用了 Babel,也要配 sourceMaps: true
debugger,比依赖编辑器点击断点更稳定Debug Console 是否报 Could not load source map,有则说明路径映射失败,需调整 outFiles 或 webRoot
本地 VSCode 连不上容器或 WSL 里的 --inspect 端口,最常卡在端口未暴露或网络策略拦截。不是代码问题,是连接链路断了。
实操建议:
-p 9229:9229 且 Node 启动参数写成 --inspect=0.0.0.0:9229(不能是 127.0.0.1,否则容器内 localhost ≠ 宿主机)9229 端口,并确认 localhost:9229 能从浏览器访问 http://localhost:9229/json
Remote - WSL 或 Dev Containers 扩展启用后,调试配置自动适配,此时应优先用 Remote Attach 而非本地 launch真正麻烦的不是怎么设断点,而是定时任务往往跨多个 tick、多层 call stack,一旦漏掉 debugger 或 source map 错位,就只能靠 console.log + 时间戳硬排。留个心眼:每次修改定时表达式后,务必重启进程,别指望热更新能重载 inspect 上下文。