2012-03-13 19 views
12

Tengo algo de código que se parece mucho a la muestra en la documentación de clústeres en http://nodejs.org/docs/v0.6.0/api/cluster.html, a saber:depuración Node.js procesos con 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); 
    } 
    }); 
} 

He instalado node- inspector y traté de usarlo junto con el complemento Eclipse V8 detallado en https://github.com/joyent/node/wiki/Using-Eclipse-as-Node-Applications-Debugger para depurar mi aplicación, pero parece que no puedo conectar un depurador a instancias de clúster bifurcadas para poner puntos de interrupción en la interesante lógica del servidor; solo puedo depurar el parte de la aplicación que genera los procesos de clúster. ¿Alguien sabe si puedo hacer algo así, o tendré que refactorizar mi aplicación para usar solo un hilo cuando esté en modo de depuración?

Soy un novato en Node.js, así que espero que haya algo obvio que me falta aquí.

Respuesta

3

ya que abrió un billete de esto aquí: https://github.com/dannycoates/node-inspector/issues/130

Aunque no es fijo, sin embargo, hay una solución:

Fwiw: La razón por la que sospecho es que el depurador nodo necesita para enlazar con el puerto de depuración (predeterminado: 5858). Si está utilizando Cluster, supongo que el maestro/controlador se une primero y tiene éxito, lo que hace que el enlace en los hijos/trabajadores falle. Aunque se puede suministrar un puerto al nodo --debug = N parece que no hay una manera fácil de hacerlo cuando se invoca el nodo dentro del clúster para el trabajador (es posible establecer programáticamente process.debug_port y luego habilitar la depuración, pero todavía no lo tengo funcionando). Lo que deja un montón de opciones: 1) iniciar el nodo sin la opción --debug, y una vez que se está ejecutando, busque el pid para el proceso de trabajo que desea depurar/perfil, y envíele una señal USR1 para habilitar la depuración. Otra opción es escribir un contenedor para el nodo que llama al nodo binario real con --debug establecido en un puerto único cada vez. Posiblemente hay opciones en Cluster que le permiten pasar, como arg también.

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

El crédito va a Sergey's post.

He cambiado mi server.js para tenedor solo un trabajador, principalmente para probar esto y luego he añadido el código sobre la bifurcación. Esto solucionó el problema de depuración para mí. Gracias Sergey por explicar y brindar la solución.