簡體   English   中英

如何調試Node.JS子分叉進程?

[英]How to debug Node.JS child forked process?

我正在嘗試調試使用以下方法創建的子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來調試子進程或強制它在另一個端口上啟動所以我可以在遠程調試中連接它?

是。 您必須在新端口中生成進程。 有一種解決方法可以使用集群進行調試,方法與您一樣:

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

這是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);
}

快速簡單修復(使用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是某些未用於調試主進程的端口。 雖然我沒有設法在調試器中同時輕松連接到兩者,即使它報告為監聽。

如果“process.execArgv”工作,你必須嘗試:

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

這對我有用..

我發現在fork func中設置'execArgv'屬性將起作用:

const child = fork('start.js', [], {
cwd: startPath,
silent: true,
execArgv: ['--inspect=10245'] });

還有一種使用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更改為您自己的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM