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

Gib*_*bor 11 node.js vscode-debugger

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

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

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

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

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

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

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

感谢您在高级方面的帮助。

R. *_*eev 7

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

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

"skipFiles": [
    "<node_internals>/**"
]
Run Code Online (Sandbox Code Playgroud)

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

"skipFiles": [
    "<node_internals>/internal/async_hooks.js",
    "<node_internals>/internal/inspector_async_hook.js"
]
Run Code Online (Sandbox Code Playgroud)

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

{
    "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>/**"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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


And*_*and -1

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

  • 截至 2021 年 3 月 10 日,即使使用此调试器,情况仍然如此 (4认同)