web-dev-qa-db-ja.com

Node.JSの子フォークプロセスをデバッグする方法

私は以下を使用して作成された子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を設定したり、リモートデバッグで接続できるように別のポートで強制的に開始したりする方法はありますか?

33
Guy Korland

これはnode.jsの既知のバグで、最近修正されました(v0.10にバックポートされていません)。

詳細については、この問題を参照してください: https://github.com/joyent/node/issues/5318

APIがこの方法で使用されることを想定していませんでしたが、ワーカープロセスごとにコマンドラインを変更する回避策があります(この回避策は将来動作しなくなる可能性があります)。 github issueのソースコードは次のとおりです:

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);
}
19

はい。新しいポートでプロセスを生成する必要があります。クラスターと一緒にデバッグするには、同じように回避策があります。

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

25
davidforneron

簡単な修正(chrome:// inspect /#devicesを使用する場合)

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

次に、アプリを実行しますwithout any --inspect-brkとメインプロセスはデバッグしませんが、フォークされたプロセスはデバッグされ、競合は発生しません。

メインプロセスのデバッグ時にフォークの競合を停止するには、

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

ここで、xxxxは、メインプロセスのデバッグに使用されていないポートです。リスニング中と報告されていても、デバッガで両方に同時に簡単に接続することはできませんでしたが。

8
Bob

「process.execArgv」が機能しない場合は、試してみてください。

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

これは私のために働いた。

3
kaasbaardje

フォーク関数で 'execArgv'属性を設定するとうまくいくことがわかりました。

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

Chrome DevToolsを使用して子(または任意の)プロセスをデバッグする最新の方法が1つあります。

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を自分のアドレスに変更するだけです。

1
VooVoo