调试 node.js 脚本时,VSCode 在“async_hooks.js”上的不可见断点处停止

Posted

技术标签:

【中文标题】调试 node.js 脚本时,VSCode 在“async_hooks.js”上的不可见断点处停止【英文标题】:VSCode stops on invisible breakpoint on "async_hooks.js" while debugging a node.js script 【发布时间】:2019-12-12 21:54:08 【问题描述】:

所以我在 node.js 中构建了一个脚本,它应该获取 csv 文件,解析它们并将它们输入 DB。 有时,当我调试我的代码时,它会像在 async_hooks.js 文件中找到的不可见断点一样停止,位于“emitHookFactory”函数的第一行(第 163 行)。

调用堆栈在同一文件上仅声明一个调用-“emitBeforeNative”。

我在试验中注意到了一些事情:

    我有 3 种类型的文件需要解析并放入数据库。它仅发生在其中一种文件类型上,该文件类型非常大(csv 上 3.1m~ 行,而其他有 50~200K 行)。我尝试部分加载它——只加载开始的 20K 行(将它们复制到一个新文件,代码没有变化)并且它没有中断。这意味着大小与调试器停止有关?

    我尝试用其他方式重现它,但没有成功。此外,它并不总是发生(即使在同一个文件上运行)- 但有 80-85% 的时间发生。

    我的脚本如下所示:查询 DB 和 AWS 以查找新文件 > 将文件下载到本地 > 从本地流式传输文件 > 在 line 事件解析行并执行数据操作 > 在 end事件 - 遍历所有操作数据,构建查询并查询数据库以插入它。我在关键位置放置了几个断点,发现断点似乎发生在发出line 事件的中间某处。回调函数是普通函数,不是异步的,内部没有异步操作。实际上,内部只有数组和字符串操作操作——甚至没有 3rd 方操作或任何异常操作。

    我试图在互联网上寻找解决方案。没有找到任何明确的方法来完全摆脱它,只有我不太了解的解决方法(对 JS 环境来说有点新,所以我无法理解如何禁用或忽略它......)

感谢您的帮助。

【问题讨论】:

VS 代码在 CALL STACK 视图的标题中显示了中断调试的“原因”。你的情况是怎么说的? 我发现这个错误报告在同一位置 github.com/shd101wyy/mume/issues/70 中断。一位评论者说“一个难以追踪的承诺中的一些例外”。你在任何地方都使用基于 Promise 的 API 吗?您是否正确处理错误?您是否在 VS Code 的 BREAKPOINTS 视图中检查了 Caught 或 Uncaught Exceptions?如果您切换这些设置会有所不同吗? @AndreWein 很抱歉回答迟了,我花了一些时间才让我的数据库再次免费进行测试。它简单地说:“在调试器语句上暂停”......上帝知道这意味着什么。我正在使用基于承诺的 API,并且标记了“所有异常”和“未捕获的异常”。它没有任何区别,因为代码不会崩溃。它就像那里有一个断点一样停止了,当我按 f5 时它照常继续(除非我等待太久并且我的数据库连接超时,但代码在“BP”上停止并且无法执行我的 handleDisconnection 方法所以它压碎了)。 “在调试器语句上暂停”表示 node.js 运行时认为它在文字“调试器”上停止;代码中的声明。 @AndreWein 还有更多想法吗?这个错误仍然让我烦恼,我无法摆脱它......我的脚本运行了 3.5 小时,每次我想进行检查运行时,我都必须在它旁边坐 40 分钟,这样我才能按下f5 当它卡住并让它继续 【参考方案1】:

您能否尝试一下我们的新 javascript 调试器是否仍然存在此问题。详情参见 VS Code 1.42 的发行说明:https://code.visualstudio.com/updates/v1_42#_new-javascript-debugger。

【讨论】:

截至 2021 年 3 月 10 日,即使使用此调试器,情况仍然如此【参考方案2】:

基于https://github.com/nodejs/node/issues/15464

有一种方法可以忽略进入 Node 的胆量。在您的 launch.json 中添加以下 skipFiles 指令:

"skipFiles": [
    "<node_internals>/**"
]

或者你可以特别忽略/internal/async_hooks

"skipFiles": [
    "<node_internals>/internal/async_hooks.js",
    "<node_internals>/internal/inspector_async_hook.js"
]

毕竟,您的配置可能如下所示:


    "version": "0.2.0",
    "configurations": [
        
            "type": "pwa-node",
            "request": "launch",
            "name": "Debug",
            "runtimeExecutable": "<your executable path>",
            "console": "integratedTerminal",
            "cwd": "$workspaceFolder",
            "timeout": 30000,
            "skipFiles": [
                "<node_internals>/**"
            ]
        
    ]


这也可能与一个已知的 NodeJS 错误有关:https://github.com/nodejs/node/issues/36022

【讨论】:

以上是关于调试 node.js 脚本时,VSCode 在“async_hooks.js”上的不可见断点处停止的主要内容,如果未能解决你的问题,请参考以下文章

调试时“运行脚本”如何在 VS Code 中为 node.js 应用程序工作?

在VSCode中为node.js应用程序调试vanilla jasmine

VSCode调试egg.js项目

[Node] 如何使用 VSCode 调试 child_process

electron node.js 在 vscode 设置 调试 Debug

vscode 调试node.js