如何调试Node.JS子分叉进程?

时间:2013-05-30 15:50:48

标签: node.js debugging intellij-idea

我正在尝试调试使用以下方法创建的子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来调试子进程或强制它在另一个端口上启动,以便我可以在远程调试中连接它?

6 个答案:

答案 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更改为您自己的地址。