Подтвердить что ты не робот

Как отлаживать дочерний разветвленный процесс 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 для отладки дочернего процесса или заставить его запускаться на другом порту, чтобы я мог подключить его к удаленному отладку?

4b9b3361

Ответ 1

Это известная ошибка в 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

Да. Вы должны создать свой процесс в новом порту. Существует обходное решение для отладки с кластерами, так же, как вы можете:

Запустите приложение с помощью команды -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

Ответ 3

Если работа "process.execArgv" doenst вам нужно попробовать:

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

это сработало для меня..

Ответ 4

Есть еще один современный способ отладки дочернего (или любого) процесса с помощью 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 на свой собственный.

Ответ 5

Быстрое исправление (где используется хром://проверка/# устройств)

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

Затем запустите приложение без какого-либо --inspect-brk, и основной процесс не будет отлаживаться, но разветвленный процесс будет и никаких конфликтов.

Чтобы остановить конфликт вилки при отладке основного процесса,

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

где xxxx - это некоторый порт, который не используется для отладки основного процесса. Хотя мне не удалось легко подключиться к обоим одновременно в отладчике, даже несмотря на то, что он сообщает о прослушивании.