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 项目,