【问题标题】:How to debug child Node.JS process in Visual Studio Code?如何在 Visual Studio Code 中调试子 Node.JS 进程?
【发布时间】:2015-12-13 11:11:40
【问题描述】:

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

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

【问题讨论】:

  • 据我所知,调试器没有选项可以附加到 VS Code 中的某个进程。但是,您可以改为安装 VS Community 2015。它允许您将调试器附加到某个进程,包括 node.js
  • 有一种附加方式。请参阅下面的@Benjamin 回复。
  • 是的,我也试过了。但它只允许你附加到主js,而不是子进程
  • 试图让它停在第一行,但看起来 VS Code 无法连接到它。 var runner = spawn('node', ['--debug-brk=5858', scriptPath]);
  • 这就是原因。到目前为止,我认为目前还不可能

标签: node.js debugging child-process visual-studio-code


【解决方案1】:

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

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

【讨论】:

  • 支持,因为这是最好的解决方案,因为这个选项是在 2018 年初添加到 VSCode 的
  • 这适用于集群而不是直接实现子进程
  • @GourabPaul 你有没有找到一种方法让这个直接子进程工作?我现在正在尝试这样做,但我仍然遇到问题。我有一个未附加的分叉子进程。
【解决方案2】:

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

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

只需确保使用 --debug--debug-brk 参数分叉/生成节点进程。

【讨论】:

  • 抱歉不清楚。我正在从 VS Code 为父进程启动调试会话。我想神奇地附加到子进程。
  • 我理解你,只需确保使用“--debug”生成节点进程并附加到标准调试端口 (5858)。
  • 这不起作用。一旦我进入主进程的调试会话,VS Code 就不允许我为子进程启动另一个调试器。
  • 好的,我明白了。当前不支持调试多个会话。要调试生成的进程,我建议在 VS Code 之外运行节点程序,然后从 VS Code 中附加到生成的进程。
  • 如果您为父级和子级创建不同的启动配置(具有不同的名称和调试端口),VS Code 支持并发调试会话。您甚至可以将它们组合为“组合”启动配置,并使用“F5”启动它们。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    寻找这个 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 快速从main 进程分离并附加到child 进程

    出于调试目的,您可以使用setTimeout 延迟进程之间的消息发送

    // master.js
    var child = child_process.fork(__dirname + './child.js')
    setTimeout(function() {
        child.send('...')
    }, 5000)
    

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-15
        • 1970-01-01
        • 2020-07-28
        相关资源
        最近更新 更多