2012-03-13 34 views
12

我有一些代碼,看起來很像在http://nodejs.org/docs/v0.6.0/api/cluster.html集羣文檔中的樣品cluster.fork()處理,即:Node.js的調試與

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,所以我希望有一些東西很明顯,我在這裏失蹤。

回答

3

我已經開了票這個位置:https://github.com/dannycoates/node-inspector/issues/130

雖然它沒有固定的,有一個變通方法:

FWIW:我懷疑的原因是,該節點調試器需要綁定到調試端口(默認:5858)。如果您正在使用Cluster,我猜測主/控制器首先綁定併成功,導致子/員工綁定失敗。雖然可以提供一個端口到節點--debug = N似乎有沒有簡單的方法來做到這一點,當節點集羣的工人中調用(有可能以編程方式設置process.debug_port,然後啓用調試,但我還沒有得到那個工作)。留下一堆選項:1)啓動節點而不--debug選項,一旦運行,找到您要調試/配置文件中的工作進程的PID,以及向它發送USR1信號啓用調試。另一個選擇是編寫一個節點的包裝器,它調用真正的節點二進制文件,每次將--debug設置爲一個唯一的端口。 Cluster中有可能讓你傳遞諸如arg的選項。

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

貸記Sergey's post

我改變了我的server.js主要叉只有一個工人來測試此加入分岔上面的代碼。這爲我解決了調試問題。謝謝謝爾蓋解釋並提供解決方案!