VSCode 1.77 JS调试器步入异步函数时停在不存在的断点
Node.js调试:步入await时跳转到内部Promise钩子的问题解决
问题
调试Node.js代码时,使用「步入」(Step Into)操作会跳转到promiseInitHookWithDestroyTracking、promiseInitHook这类内部方法,得反复步过好几次才能进入目标函数。已经在launch.json里配置了<node_internals>/**到skipFiles,但问题还是没解决。
示例代码
test.js内容:
main(); async function main() { let i = await func(); console.log(i); } async function func() { return 1; }
调试配置(launch.json)
{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Launch Program", "skipFiles": [ "<node_internals>/**" ], "program": "${workspaceFolder}/test.js", "outFiles": [ "${workspaceFolder}/**/*.js" ] } ] }
原因及解决办法
原因
await触发的Promise内部钩子函数,不在<node_internals>的默认匹配范围内,导致skipFiles规则没覆盖到这些代码。- 部分Node.js版本的调试器对内部文件路径的匹配逻辑有偏差,
<node_internals>/**没法完全覆盖Promise相关的内部代码。
解决办法
- 扩展
skipFiles匹配规则:手动添加Promise相关内部文件的路径,比如:
可以根据调试时实际跳转的文件路径,补充对应的规则。"skipFiles": [ "<node_internals>/**", "node:internal/modules/esm/translators", "node:internal/process/promises" ] - 用「步过」替代「步入」:如果只是想直接进入
func(),在await func()这行用「步过」(Step Over),调试器会直接跳到func()的第一行。 - 升级Node.js版本:v18及以上的Node.js版本优化了调试器的
skipFiles逻辑,能更好地识别并跳过Promise内部钩子。 - 直接在目标函数打端点:在
func()的第一行手动打断点,调试时直接跳转到该位置,不用依赖「步入」操作。
内容的提问来源于stack exchange,提问作者dorefaeli
相关产品推荐
相关产品推荐

