1. 背景
使用 VSCode 調(diào)試 Node.js 的時候祈远,
遇到 child_process 中的斷點商源,是跟不進(jìn)去的牡彻。
1.1 main 項目
(1)目錄結(jié)構(gòu)
打開 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 執(zhí)行
$ cd main
$ node app.js
hello
world
(掛灼鞴蕖)
1.3 調(diào)試
main 項目中按 F5
渐行,程序會停在 app.js 中的斷點處,單步調(diào)試衰倦,
然后我磁,調(diào)試進(jìn)程就結(jié)束了驻襟。并不會跑到第 6
行的斷點處,
child/process.js 中的斷點,也跑不進(jìn)去豌习,
2. Attach to child_process
以上示例中肥隆,我們發(fā)現(xiàn) VSCode 無法調(diào)試到 child_process
中。
也不確定 VSCode 未來是否會支持恰聘。
當(dāng)前我們可以通過 Debug 的 Attach 方式吸占,對 child_process
進(jìn)行調(diào)試矾屯。
2.1 main 項目 & attach 項目
我們需要另一個 VSCode 實例來 Attach,兩個 VSCode 一起使用遍略。
main 項目的 .vscode/launch.json 啟動 main/app.js
attach 項目的 .vscode/launch.json attach 到 child_process
目錄結(jié)構(gòu)分別如下,
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势似,
調(diào)試端口號可以任選僧著,不一定的 9001
障簿,但應(yīng)保持一致站故。
(1)main/app.js
const { fork } = require('child_process');
const args = []; // 命令行參數(shù),這里不需要所以留空
const options = {
execArgv: [
'--inspect-brk=9001', // 調(diào)試端口
],
};
// 相當(dāng)于 node ./child/process.js {命令行參數(shù)} --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, // 調(diào)試端口
},
]
}
2.2 執(zhí)行
(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 到已經(jīng)啟動的子進(jìn)程上吮成,
2.3 調(diào)試
(1)main 項目粱甫,按 F5
啟動調(diào)試
main 項目單步調(diào)試魔种,
這時子進(jìn)程已經(jīng)啟動了节预,切換到 attach 項目啟動調(diào)試。
(2)attach 項目蛤吓,按 F5
啟動調(diào)試
attach 項目單步調(diào)試会傲,
(3)main 項目 child.send
main 項目單步調(diào)試淌山,斷點直接跑到了 attach 項目中顾瞻,
attach 項目單步調(diào)試荷荤,斷點又回到 main 項目移稳,