2012-03-13 16 views
12

mam jakiś kod, który wygląda bardzo podobnie jak próbki w dokumentacji Cluster w http://nodejs.org/docs/v0.6.0/api/cluster.html, słownie:debugowania node.js przetwarza z cluster.fork()

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); 
    } 
    }); 
} 

mam zainstalowane przerzutami do węzłów chłonnych inspektor i próbował użyć go oraz wtyczki Eclipse V8 wyszczególnionej w https://github.com/joyent/node/wiki/Using-Eclipse-as-Node-Applications-Debugger do debugowania mojej aplikacji, ale wygląda na to, że nie mogę podłączyć debuggera do rozwidlonych instancji klastra, aby umieścić punkty przerwania w interesującej logice serwera - mogę tylko debugować część aplikacji, która spawnuje procesy klastra. Czy ktokolwiek wie, czy mogę zrobić coś takiego, czy też będę musiał zmienić swoją aplikację, aby używać tylko jednego wątku w trybie debugowania?

Jestem nowicjuszem Node.js, więc mam nadzieję, że jest coś oczywistego, czego tu brakuje.

Odpowiedz

3

już otwarty bilet na ten temat tutaj: https://github.com/dannycoates/node-inspector/issues/130

chociaż nie jest jeszcze ustalona, ​​jest to obejście:

FWIW: Powodem Podejrzewam, że debugger węzeł musi wiązać się z portem debugowania (domyślnie: 5858). Jeśli korzystasz z Cluster, domyślam się, że master/kontroler najpierw łączy się i kończy sukcesem, powodując niepowodzenie bindowania u dzieci/pracowników. Chociaż port może być dostarczony do węzła --debug = N, wydaje się, że nie ma łatwego sposobu, aby to zrobić, gdy węzeł jest wywoływany w klastrze dla pracownika (może być możliwe programowe ustawienie procesu.debug_port, a następnie włączenie debugowania, ale ja jeszcze tego nie zrobiłem). Pozostawia kilka opcji: 1) uruchom węzeł bez opcji --debug, a po uruchomieniu znajdź pid dla procesu roboczego, który chcesz debugować/profil, i wyślij mu sygnał USR1, aby włączyć debugowanie. Inną opcją jest napisanie wrappera dla węzła, który wywołuje binarny węzeł rzeczywisty z opcją --debug ustawioną na unikalny port za każdym razem. Są prawdopodobnie opcje w Cluster, które pozwalają ci przejść, na przykład arg.

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

zasługa Sergey's post.

Zmieniłem mój server.js na widelec tylko jeden pracownik głównie do testowania tego, a następnie dodałem kod powyżej rozwidlenia. Naprawiło to dla mnie problem debugowania. Dziękuję Sergeyowi za wyjaśnienie i dostarczenie rozwiązania !!!

Powiązane problemy