2013-05-30 4 views
21

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

ответ

19

Это известная ошибка в узле.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); 
} 
+1

Есть ли способ достичь того же с помощью child.fork()? –

+2

@GuyKorland Конечно, просто добавьте -debug = {port} в аргументы командной строки вашего дочернего процесса. –

+0

см. Также [этот комментарий] (http://youtrack.jetbrains.com/issue/WEB-1919#comment=27-401139) – lena

24

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

Запустить приложение с --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

+0

Я не уверен, почему, но мой process.execArgv - это массив, мне пришлось изменить его на process.execArgv.toString(). IndexOf ('- debug')! == -1; чтобы заставить его работать. Благодаря! – MorningDew

+0

Использование узла 0.12.1, проблема все еще существует, условие не вернуло true (проверка на отладку), но изменила порт так, как вы предложили работать. –

2

если " process.execArgv»doenst работы вы должны попробовать:

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

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

1

Есть еще один современный способ отладки дочернего (или любого) процесса с помощью Chrome DevTools.

Запустить приложение с арг

--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 на свой собственный.

+0

- inspect - это современный способ, но он не имеет ничего общего с проблемой здесь - отладки дочернего процесса. –

+0

Chrome не обнаружит дополнительных портов автоматически. Вы должны сказать ему, чтобы связаться с ними вручную. – Breedly

0

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

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

Затем запустите приложение без любого --inspect-BRK и основного процесс не будет отладки, но раздвоенное процесс будет и никаких конфликтов.

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

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

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

Смежные вопросы