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

Отладка Node.js процессов с помощью cluster.fork()

У меня есть код, который очень похож на образец в документации Cluster на 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);
    }
  });
}

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

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

4b9b3361

Ответ 1

var fixedExecArgv=[];
fixedExecArgv.push('--debug-brk=5859');
cluster.setupMaster({ 
  execArgv: fixedExecArgv 
});

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

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

Ответ 2

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

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

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

Ответ 4

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

Из этого выпуска Github:

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

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

Ответ 5

если вы используете VSCode для отладки, вам нужно указать порт и и "autoAttachChildProcesses": true в файле lanuch.json.

Если вы выполняете отладку непосредственно в DevTool, вам необходимо добавить соединение с соответствующим портом в консоли.

enter image description here

Ответ 6

Используйте флаг --inspect для версии узла выше или равной 7.7.0 для отладки процесса js узла, если кто-то хочет получить дополнительную информацию о том, как отладить обработку кластера и настроить инструменты отладки Chrome для Node JS, следуйте моему посту здесь.