[Node] 如何使用 VSCode 调试 child_process

1. 背景

使用 VSCode 调试 Node.js 的时候,
遇到 child_process 中的断点,是跟不进去的。

1.1 main 项目

(1)目录结构
打开 VSCode,并以 main 作为根目录,

main
├── .vscode
│   └── launch.json
├── app.js
└── child
    └── process.js

(2)app.js

const { fork } = require('child_process');

const child = fork('./child/process.js');

child.on('message', data => {
  console.log(data);
});

child.send('hello');

(3)child/process.js

process.on('message', data => {
  console.log(data);
  process.send('world');
});

(4).vscode/launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "program": "${workspaceFolder}/app.js",
    }    
  ]
}

1.2 执行

$ cd main
$ node app.js 
hello
world
(挂住)

1.3 调试

main 项目中按 F5 ,程序会停在 app.js 中的断点处,单步调试,



然后,调试进程就结束了。并不会跑到第 6 行的断点处,

child/process.js 中的断点,也跑不进去,


2. Attach to child_process

以上示例中,我们发现 VSCode 无法调试到 child_process 中。
也不确定 VSCode 未来是否会支持。

当前我们可以通过 Debug 的 Attach 方式,对 child_process 进行调试。

2.1 main 项目 & attach 项目

我们需要另一个 VSCode 实例来 Attach,两个 VSCode 一起使用。


main 项目的 .vscode/launch.json 启动 main/app.js
attach 项目的 .vscode/launch.json attach 到 child_process

目录结构分别如下,

main
├── .vscode
│   └── launch.json
├── app.js                  <- 增加 --inspect-brk=9001
└── child
    └── process.js
attach
└── .vscode
    └── launch.json         <- attach port: 9001

为了能 attach 成功,我们需要同步修改 main/app.js 与 attach/.vscode/launch.json,
调试端口号可以任选,不一定的 9001,但应保持一致。

(1)main/app.js

const { fork } = require('child_process');

const args = [];  // 命令行参数,这里不需要所以留空
const options = {
  execArgv: [
    '--inspect-brk=9001',  // 调试端口
  ],
};
// 相当于 node ./child/process.js {命令行参数} --inspect-brk=9001
const child = fork('./child/process.js', args, options);

child.on('message', data => {
  console.log(data);
});

child.send('hello');

(2)attach/.vscode/launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "Attach to child_process",
      "port": 9001,  // 调试端口
    },
  ]
}

2.2 执行

(1)启动 main 项目

$ cd main
$ node app.js
Debugger listening on ws://127.0.0.1:9001/eec71ebf-6f83-48b5-8bca-5c266dbfe152
For help, see: https://nodejs.org/en/docs/inspector
(挂住)

(2)debug attach 项目
attach 项目中按 F5,VSCode 会 attach 到已经启动的子进程上,


2.3 调试

(1)main 项目,按 F5 启动调试

main 项目单步调试,


这时子进程已经启动了,切换到 attach 项目启动调试。

(2)attach 项目,按 F5 启动调试

attach 项目单步调试,


(3)main 项目 child.send

main 项目单步调试,断点直接跑到了 attach 项目中,


attach 项目单步调试,断点又回到 main 项目,



参考

Debugging in Visual Studio Code

你可能感兴趣的:([Node] 如何使用 VSCode 调试 child_process)