如何在 Visual Studio 代码中调试子 Node.JS 进程?

How to debug child Node.JS process in Visual Studio Code?

如何在 VS Code 中调试子 Node.JS 进程?
这是我要调试的代码示例:

var spawn = require('child_process').spawn;
var scriptPath = './child-script.js';
var runner_ = spawn('node', [scriptPath]);

您可以轻松地向 launch.json 添加新的启动配置,允许您附加到具有特定端口的 运行 节点实例:

{
        "name": "Attach to Node",
        "type": "node",
        "address": "localhost",
        "port": 5870,
}

只需确保 fork/spawn 您的节点进程使用 --debug--debug-brk 参数。

寻找这个 npm 模块 child-process-debug

我在 vscode 中创建了 2 个单独的启动配置:

一个用于主进程,另一个用于子进程

   {
        "name": "Attach",
        "type": "node",
        "request": "attach",
        "port": 5858,
        "address": "localhost",
        "restart": false,
        "sourceMaps": false,
        "outFiles": [],
        "localRoot": "${workspaceRoot}",
        "remoteRoot": null
    },
    {
        "name": "Attach child",
        "type": "node",
        "request": "attach",
        "port": 5859,
        "address": "localhost",
        "restart": false,
        "sourceMaps": false,
        "outFiles": [],
        "localRoot": "${workspaceRoot}",
        "remoteRoot": null
    }

工作流程如下:

  1. 使用--debug命令行开关启动主节点进程 $ node --debug master.js
  2. 通过调试面板使用 Attach 附加到 master.js 节点进程
  3. child.js 进程中放置断点
  4. 使用 Attach child
  5. 快速脱离 main 进程并附加到 child 进程

出于调试目的,您可以使用 setTimeout

延迟进程之间的消息发送
// master.js
var child = child_process.fork(__dirname + './child.js')
setTimeout(function() {
    child.send('...')
}, 5000)

在您的启动配置中添加 "autoAttachChildProcesses": true 如下所示

{
  "type": "node",
  "request": "launch",
  "name": "Launch Program",
  "autoAttachChildProcesses": true,
  "program": "${workspaceFolder}/index.js"
}

在您的 launch.json、"autoAttachChildProcesses" 中进行此更改:true

只需将此添加到您的调试器配置文件

{
  "type": "node",
  "request": "attach",
  "name": "Attach by Process ID",
  "processId": "${command:PickProcess}",
}

将调试器附加到进程 ID。当您 运行 此配置时,将提示一个进程列表,您可以在其中 select 要附加调试器的进程。