Visual Studio 节点:调试到工作线程(节点 11)

Posted

技术标签:

【中文标题】Visual Studio 节点:调试到工作线程(节点 11)【英文标题】:Visual Studio Node: debug into Worker Threads (node 11) 【发布时间】:2019-06-12 14:09:33 【问题描述】:

VS Code 的 javascript 调试器可以用来调试节点 11 的新“工作线程”吗?工作线程以网络工作者为模型,顶部具有少量额外功能,可从新的 worker_threads 包中获得(参见https://nodejs.org/api/worker_threads.html)。除了与node的子进程外,还可以以SharedArrayBuffers的形式与工作线程共享内存。

我的 VS Code 启动配置如下所示:

   
        "type": "node",
        "request": "launch",
        "name": "Mocha Tests",
        "program": "$workspaceFolder/node_modules/mocha/bin/_mocha",
        "runtimeArgs": [
            "--experimental-wasm-threads",
            "--experimental-worker"
        ],
        "args": [
            "-u", "tdd",
            "--timeout", "100000",
            "--colors", "$workspaceFolder/test"
        ],
        "internalConsoleOptions": "openOnSessionStart",
        "autoAttachChildProcesses": true
   

我可以调试到主节点脚本,但是“autoAttachChildProcesses”标志在附加到产生的工作线程时无效,并且在工作线程内运行的代码中添加“调试器”语句也没有。

他们在参考文档中提到工作线程尚不支持“检查器”包,所以我想这可以解释为什么会这样。

尽管如此,还有没有人成功地调试到 VS Code 中的工作线程?

【问题讨论】:

我想此时我们唯一能做的就是在同一个文件中使用工作代码并用isMainThread切换 其实没关系。即使调试在同一个文件中激活的工作人员似乎也不起作用 我一直在对此进行一些研究,并通过 WebStorm 的发行说明发现,Node 在 10.12 中添加了对检查 worker_threads 的支持。 blog.jetbrains.com/webstorm/2018/10/webstorm-2018-3-eap-6 如果 WebStorm 可以做到,我敢肯定,至少必须有一种方法可以使用 Chrome devtools 或什至 VSC... 【参考方案1】:

2021 年 2 月更新 现在可以使用 vscode-js-debug 在 VSC 中调试工作线程,如另一个答案中所指出的。我已经对其进行了测试,并且效果很好。 Webstorm 仍然是一个不错的选择,可能内置了更多功能,但请记住它是一种付费产品。

免责声明:下面的答案描述了我调试工作线程的经验,但不使用 VS Code,这是最初的问题。我认为无论如何了解替代选项会很有用,因为似乎截至今天,调试工作线程的唯一选项是 Webstorm

网络风暴选项

可以使用 Webstorm 调试工作线程:https://blog.jetbrains.com/webstorm/2018/10/webstorm-2018-3-eap-6/ 我已经尝试过了,效果非常好(如上面的链接所述)。

Chrome 工具

我尝试使用 chrome 开发工具调试工作线程,采用与调试 Web 工作人员相同的方法,但它不起作用。调试 web worker 时,在 chrome 工具中是这样显示的

不幸的是,工作线程没有。当工作线程运行时,调试器不会显示它,并且不允许您放置断点或单步执行代码。 我怀疑这可能是因为: https://github.com/nodejs/node/issues/26609

VS 代码

VSC 没有调试工作线程的功能。有趣的是,VCS 也没有调试 Web Workers 的功能。这是他们的明确决定: https://github.com/Microsoft/vscode-chrome-debug/issues/675

【讨论】:

典型的 Microsoft 对可能使他们的产品更有用的东西的回应 - 这需要做太多的工作 - 让我们的生活更轻松 MS 怎么样?我猜我会使用 1980 年的调试技术:console.log('HERE'); 您是否必须进行任何配置才能使其正常工作?它不适用于我的 CRA 网络应用程序。【参考方案2】:

在最新版本的 vscode-js-debug 中,当与最新版本的 nodejs 结合使用时,worker 的调试是 now supported。

【讨论】:

感谢您发布此信息。我对其进行了测试,并且效果非常好。考虑到 Webstorm 是付费产品,VSC + vscode-js-debug 不是它有明显的优势,因为现在功能是一样的。 我两者都有,启用了 vscode-js-debug 预览和 Node.js 的最新版本。仍然 vscode 无法为我调试网络工作者。断点没有经过验证,也不会停止执行。

以上是关于Visual Studio 节点:调试到工作线程(节点 11)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 中仅调试一个线程 [重复]

Visual Studio调试器指南---多线程应用程序调试

visual studio2010的项目属性设置中,运行库选择多线程,多线程调试,多线程dll,多线程调试dll有啥区别

使用 Visual Studio Code 调试 webpack 捆绑节点 ts

Visual Studio 2017 调试错误:为了防止在评估函数 *.toString 时发生不安全的中止,所有线程都被允许运行

Visual Studio 调试器不会自动附加到本地 Service Fabric 服务