根本原因是Serverless Framework默认未启用Node.js的--inspect调试标志,需手动添加--inspect-brk参数并配合VSCode的Attach模式,在launch.json中配置type为node、request为attach、port与命令行一致,且不可填写program字段。

VSCode 启动 Serverless 函数本地调试失败,sls invoke local 不进断点?
根本原因不是 VSCode 配置错了,而是你没让函数运行在调试模式下——Serverless Framework 默认不开启 Node.js 的 --inspect 标志,VSCode 的 debugger 根本连不上。
实操建议:
- 改用
sls invoke local --function myFunc --stage dev --verbose只是执行,不启动调试通道;必须手动加--inspect-brk参数并配合 VSCode 的 Attach 模式 - 推荐做法:在
serverless.yml中为本地开发添加自定义脚本,比如用npm run debug启动:node --inspect-brk ./node_modules/.bin/sls invoke local --function myFunc
- 注意端口冲突:
--inspect-brk默认用 9229,如果已有其他 Node 进程占着,VSCode 会报Could not connect to debug target,换端口如--inspect-brk=9230并同步更新launch.json中的port
VSCode 的 launch.json 怎么配才能 attach 到 Serverless 本地函数?
不能选 “Launch Program”,必须用 “Attach to Node Process” 类型——因为 Serverless 函数是子进程,不是你直接 node index.js 启动的主进程。
关键配置项(仅保留必要字段):
-
type:node -
request:attach -
port: 和命令行中--inspect-brk指定的端口一致,比如9230 -
address: 保持默认localhost即可,除非你在 Docker 里跑 - 别填
program字段——它只用于 Launch 模式,填了反而导致 VSCode 自己去跑一个空进程
常见错误现象:Debug adapter process has terminated unexpectedly,大概率是 port 不匹配,或目标进程已退出(断点前就结束了)。
函数里用了 async/await,但 VSCode 断点停不住、跳过、或停在 Promise 内部?
不是 VSCode 的 bug,是 V8 调试器对异步栈的映射限制。Serverless 函数启动快、生命周期短,await 后的代码可能被优化掉调用栈,断点失效。
解决方向:
- 在
await前加一句debugger;(原生断点),比 VSCode 图形断点更可靠 - 避免在 handler 外层写
async function handler() { ... },改用module.exports.handler = async (event) => { ... }——某些 Serverless 插件对具名导出的 async 函数支持不稳定 - 检查是否启用了
"skipFiles": ["(默认开启),它会跳过所有底层 Promise 实现,但也可能误跳你的 await 链;临时注释这行再试/**"]
调试时日志全在终端刷屏,VSCode 的 Debug Console 看不到 console.log?
因为 Serverless Framework 把函数 stdout/stderr 重定向到了自己的日志流,VSCode 的 Debug Console 默认只收 debugger 进程本身的输出,不抓子进程日志。
两个务实办法:
- 把
console.log改成console.error——很多插件对 stderr 更“敏感”,更容易透出到 Debug Console - 用
process.send()主动向父进程发消息(需配合自定义 runner),但太重;更轻量的是加个中间层:const log = (...args) => {<br> process.stderr.write(`[DEBUG] ${JSON.stringify(args)}\n`);<br>}; - 别依赖 Debug Console 看日志,直接盯终端里
sls invoke local的输出——它才是真实环境行为,Debug Console 只适合看变量值和调用栈
真正麻烦的是跨平台差异:Windows 下 child_process.spawn 对 stdio 的处理和 macOS/Linux 不一致,同一套调试配置可能在一台机器上有效、另一台失灵。遇到这种情况,先确认 serverless-offline 或你用的本地模拟器版本是否统一,再查 sls --version 和 node -v 是否匹配。











