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

Guy*_*and 31 debugging intellij-idea node.js

我正在尝试调试使用以下方法创建的子Node.JS进程:

var child = require('child_process');
child .fork(__dirname + '/task.js');
Run Code Online (Sandbox Code Playgroud)

问题是当在IntelliJ/WebStorm中运行时,父进程和子进程都在同一端口上启动.

debugger listening on port 40893
debugger listening on port 40893
Run Code Online (Sandbox Code Playgroud)

所以它只调试父进程.

有没有办法设置IntelliJ来调试子进程或强制它在另一个端口上启动所以我可以在远程调试中连接它?

dav*_*ron 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');
Run Code Online (Sandbox Code Playgroud)

debugger listening on port 40894


Mir*_*toš 20

这是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);
}
Run Code Online (Sandbox Code Playgroud)

  • @GuyKorland当然,只需将--debug = {port}添加到子进程的命令行参数中. (3认同)

Bob*_*Bob 9

快速简单修复(使用chrome:// inspect /#devices)

var child = require('child_process');
child.fork(__dirname + '/task.js',[],{execArgv:['--inspect-brk']});
Run Code Online (Sandbox Code Playgroud)

然后在没有任何--inspect-brk的情况下运行你的应用程序,主进程将不会调试,但分叉进程将没有冲突.

调试主进程时停止fork冲突;

child.fork(__dirname + '/task.js',[],{execArgv:['--inspect=xxxx']});
Run Code Online (Sandbox Code Playgroud)

哪个xxxx端口没有用于调试主进程.虽然我没有设法在调试器中同时轻松连接到两者,即使它报告为监听.