37

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

4

6 回答 6

29

是的。您必须在新端口中生成您的进程。使用集群进行调试有一种解决方法,您可以这样做:

使用 --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

于 2013-09-04T13:19:09.237 回答
21

这是 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);
}
于 2013-05-30T18:20:06.017 回答
12

快速简单的修复(使用 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端口没有用于调试主进程。尽管我没有设法在调试器中轻松地同时连接到两者,即使它报告为正在侦听。

于 2017-11-08T18:05:47.000 回答
4

我发现在 fork func 中设置 'execArgv' 属性会起作用:

const child = fork('start.js', [], {
cwd: startPath,
silent: true,
execArgv: ['--inspect=10245'] });
于 2018-11-11T08:47:20.173 回答
3

如果“process.execArgv”不起作用,您必须尝试:

if (debug) {
    process.argv.push('--debug=' + (40894));
}

这对我有用..

于 2016-02-28T20:01:24.657 回答
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 更改为您自己的地址即可。

于 2017-01-24T07:44:35.997 回答