如何配置Node.js在栈溢出发生前触发调试器断点
问题复现
运行如下无限递归的JS脚本时:
function recurse() { return recurse(); } recurse();
执行node recurse.js命令会直接抛出Maximum call stack size exceeded错误终止,手动加断点逐行执行要跑成千上万次递归,排查效率极低,可以通过VS Code调试器配置实现异常抛出前自动断下。
VS Code 调试配置步骤
- 打开左侧「运行和调试」面板,点击「创建launch.json文件」,环境选择Node.js,生成基础调试配置文件。
- 在生成的配置对象中添加两个核心配置项,参考配置如下:
{ "type": "node", "request": "launch", "name": "调试当前JS文件", "program": "${file}", "pauseForUncaughtExceptions": true, "runtimeArgs": ["--stack-size=100"] }pauseForUncaughtExceptions: true:强制调试器在未捕获异常抛出前自动中断,不会直接把程序跑终止。runtimeArgs: ["--stack-size=100"]:把Node.js默认的调用栈大小调小,递归只需要跑几十层就会触发栈溢出,不用等默认配置下的上万层递归,大幅缩短调试等待时间。
- 确认调试面板「断点」分类下的未捕获异常选项是勾选状态,不需要手动在代码里加任何业务断点。
- 选中要调试的recurse.js文件,按F5启动调试,程序触发栈溢出时会自动暂停在异常抛出的前一刻,此时直接查看左侧「调用栈」面板就能看到完整的调用链路,直接定位递归逻辑问题。
如果不想修改默认栈大小,也可以去掉
runtimeArgs配置,只开启pauseForUncaughtExceptions也能在溢出时断下,只是等待程序跑到栈溢出的时间会更长。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

