Отладка 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, поэтому я надеюсь, что там что-то очевидное, я здесь отсутствует.
Ответы
Ответ 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.
Ответ 3
Для тех, кто хочет отлаживать дочерние процессы в VS Code, просто добавьте это в конфигурацию launch.json:
"autoAttachChildProcesses": true
https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_remote-debugging
Ответ 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, следуйте моему посту здесь.