我正在尝试调试使用以下方法创建的子Node.JS进程:
var child = require('child_process');
child .fork(__dirname + '/task.js');
问题是当在IntelliJ / WebStorm中运行时,父进程和子进程都在同一端口上启动。
debugger listening on port 40893
debugger listening on port 40893
所以它只调试父进程。
有没有办法设置IntelliJ来调试子进程或强制它在另一个端口上启动,以便我可以在远程调试中连接它?
答案 0 :(得分:25)
是。您必须在新端口中生成进程。有一种解决方法可以调试集群,方法与您一样:
使用--debug命令启动您的应用程序,然后:
var child = require('child_process');
var debug = typeof v8debug === 'object';
if (debug) {
//Set an unused port number.
process.execArgv.push('--debug=' + (40894));
}
child.fork(__dirname + '/task.js');
debugger listening on port 40894
答案 1 :(得分:19)
最近修复了node.js中的一个已知错误(尽管没有向后移植到v0.10)。
有关详细信息,请参阅此问题:https://github.com/joyent/node/issues/5318
有一种解决方法,您可以在其中更改每个工作进程的命令行,尽管API不是以这种方式使用(解决方法可能会在将来停止工作)。以下是github问题的源代码:
var cluster = require('cluster');
var http = require('http');
if (cluster.isMaster) {
var debug = process.execArgv.indexOf('--debug') !== -1;
cluster.setupMaster({
execArgv: process.execArgv.filter(function(s) { return s !== '--debug' })
});
for (var i = 0; i < 2; ++i) {
if (debug) cluster.settings.execArgv.push('--debug=' + (5859 + i));
cluster.fork();
if (debug) cluster.settings.execArgv.pop();
}
}
else {
var server = http.createServer(function(req, res) {
res.end('OK');
});
server.listen(8000);
}
答案 2 :(得分:7)
快速简单修复(使用chrome:// inspect /#devices)
var child = require('child_process');
child.fork(__dirname + '/task.js',[],{execArgv:['--inspect-brk']});
然后在没有任何--inspect-brk的情况下运行您的应用,主进程不会调试,但分叉进程将会没有冲突。
在调试主进程时停止fork冲突;
child.fork(__dirname + '/task.js',[],{execArgv:['--inspect=xxxx']});
其中xxxx
是某个未用于调试主进程的端口。虽然我没有设法在调试器中同时轻松连接到两者,即使它报告为正在收听。
答案 3 :(得分:3)
if&#34; process.execArgv&#34;你必须尝试做的工作:
if (debug) {
process.argv.push('--debug=' + (40894));
}
这对我有用..
答案 4 :(得分:2)
我发现在fork函数中设置'execArgv'属性将起作用:
const child = fork('start.js', [], {
cwd: startPath,
silent: true,
execArgv: ['--inspect=10245'] });
答案 5 :(得分:1)
还有一种使用Chrome DevTools调试子(或任何)进程的现代方法。
使用arg
启动您的应用--inspect
如下所示:
node --debug=9200 --inspect app/main.js
您将看到包含每个子进程的URL的消息:
Debugger listening on port 9200.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9200/207f2ab6-5700-4fc5-b6d3-c49a4b34a311
Debugger listening on port 9201.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9201/97be3351-2ea1-4541-b744-e720188bacfa
Debugger listening on port 9202.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9202/8eb8384a-7167-40e9-911a-5a8b902bb8c9
如果要调试远程进程,只需将地址127.0.0.1更改为您自己的地址。