Отладка процессов Node.js с помощью cluster.fork () - PullRequest
19 голосов
/ 14 марта 2012

У меня есть некоторый код, очень похожий на пример в документации по кластеру, по адресу http://nodejs.org/docs/v0.6.0/api/cluster.html,:

var cluster = require('cluster');
var server = require('./mycustomserver');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  var i;
  // Master process
  for (i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  cluster.on('death', function (worker) {
    console.log('Worker ' + worker.pid + ' died');
  });
} else {
  // Worker process
  server.createServer({port: 80}, function(err, result) {
    if (err) {
      throw err;
    } else {
      console.log('Thread listening on port ' + result.port);
    }
  });
}

Я установил инспектор узлов и попытался использовать и его, и плагин Eclipse V8, подробно описанный в https://github.com/joyent/node/wiki/Using-Eclipse-as-Node-Applications-Debugger, для отладки моего приложения, но похоже, что я не могу подключить отладчик к разветвленным экземплярам кластера, чтобы поставить точки останова на интересную логику сервера - я могу отлаживать только ту часть приложения, которая порождает процессы кластера. Кто-нибудь знает, могу ли я на самом деле сделать такую ​​вещь, или мне придется провести рефакторинг моего приложения, чтобы использовать только один поток в режиме отладки?

Я новичок на Node.js, так что я надеюсь, что что-то очевидное мне не хватает здесь.

Ответы [ 4 ]

11 голосов
/ 22 марта 2013
var fixedExecArgv=[];
fixedExecArgv.push('--debug-brk=5859');
cluster.setupMaster({ 
  execArgv: fixedExecArgv 
});

Кредит переходит на сообщение Сергея .

Я изменил свой server.js на форк только одного работника в основном для проверки этого, затем добавил код над разветвлением. Это исправило проблему отладки для меня. Спасибо, Сергей, за разъяснение и предоставление решения !!!

3 голосов
/ 03 февраля 2019

Для тех, кто хочет отлаживать дочерние процессы в VS Code, просто добавьте это в конфигурацию launch.json:

"autoAttachChildProcesses": true

https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_remote-debugging

3 голосов
/ 03 февраля 2013

Я уже открыл билет по этому поводу здесь: https://github.com/dannycoates/node-inspector/issues/130

Хотя это еще не исправлено, есть обходной путь:

FWIW: Я подозреваю, что причина в том, что отладчик узла должен связываться с портом отладки (по умолчанию: 5858). Если вы используете Cluster, я предполагаю, что мастер / контроллер связывается первым и завершается успешно, вызывая сбой связывания у детей / работников. В то время как порт может быть предоставлен узлу --debug = N, кажется, что не существует простого способа сделать это, когда узел вызывается в Cluster для работника (возможно, можно программно установить process.debug_port и затем включить отладку, но я пока что не работает). Это оставляет кучу вариантов: 1) запустить узел без опции --debug, и после его запуска найдите pid для рабочего процесса, который вы хотите отладить / профилировать, и отправьте ему сигнал USR1 для включения отладки. Другой вариант - написать обертку для узла, которая каждый раз вызывает двоичный файл реального узла с уникальным портом --debug. Возможно, в Cluster есть опции, которые также позволяют передавать, например, arg.

0 голосов
/ 13 июля 2018

Для тех, кто смотрит на это в 2018+, аргументы при запуске не нужны.

С эта проблема Github :

Просто экономит время для всехкоторый, возможно, был в той же лодке, что и я - менеджер по инспекциям Node.js V8 (NiM), кажется, представляет эту проблему, когда ее иначе не было бы - я потратил около часа, стуча головой, прежде чем отключитьПлагин Chrome и обнаружение, что все работает нормально при открытии из chrome: //inspect.

Я также часами читал сообщения на github, настраивая параметры gulp-typcript и gulp-sourcemaps и т. Д., Только дляэтот плагин будет проблемой.Также стоит отметить, что мне пришлось добавить порт N + 1 для удаленных целей chrome://inspect, то есть localhost:9230, для отладки моего рабочего процесса.

...