2012-03-13 27 views
12

Tôi đã có một số mã trông rất giống với mẫu trong tài liệu Cụm tại http://nodejs.org/docs/v0.6.0/api/cluster.html, để wit:Debugging Node.js xử lý với 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); 
    } 
    }); 
} 

Tôi đã cài đặt node- kiểm tra và đã thử sử dụng cả nó và plugin Eclipse V8 chi tiết tại https://github.com/joyent/node/wiki/Using-Eclipse-as-Node-Applications-Debugger để gỡ lỗi ứng dụng của tôi, nhưng có vẻ như tôi không thể móc một trình gỡ lỗi lên đến các trường hợp chia nhóm để đặt điểm ngắt tại logic máy chủ thú vị - Tôi chỉ có thể gỡ lỗi một phần của ứng dụng sinh ra các tiến trình cluster. Có ai biết nếu tôi có thể trong thực tế làm một điều như vậy, hoặc tôi sẽ phải refactor ứng dụng của tôi để sử dụng chỉ có một sợi duy nhất khi ở chế độ gỡ lỗi?

Tôi là người mới sử dụng Node.js, vì vậy tôi hy vọng có điều gì đó hiển nhiên tôi bị thiếu ở đây.

Trả lời

3

tôi đã mở một vé về vấn đề này ở đây: https://github.com/dannycoates/node-inspector/issues/130

Mặc dù nó không cố định nêu ra, có một cách giải quyết:

FWIW: Lý do tôi nghi ngờ là debugger nút cần phải liên kết với cổng debug (mặc định: 5858). Nếu bạn đang sử dụng Cluster, tôi đoán master/controller liên kết đầu tiên, và thành công, làm cho bind trong các child/worker thất bại. Trong khi một cổng có thể được cung cấp cho node --debug = N thì dường như không có cách nào dễ dàng để thực hiện điều này khi nút được gọi trong Cluster cho người lao động (có thể lập trình process.debug_port và sau đó cho phép gỡ lỗi, nhưng tôi vẫn chưa làm việc đó). Mà để lại một loạt các tùy chọn: 1) bắt đầu nút mà không có tùy chọn --debug, và một khi nó đang chạy, tìm pid cho quá trình công nhân bạn muốn gỡ lỗi/hồ sơ, và gửi nó một tín hiệu USR1 để cho phép gỡ lỗi. Một tùy chọn khác là viết trình bao bọc cho nút gọi là nhị phân nút thực với --debug được đặt thành một cổng duy nhất mỗi lần. Có thể có các tùy chọn trong Cluster cho phép bạn vượt qua như arg.

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

Tín dụng chuyển đến Sergey's post.

Tôi đã thay đổi server.js để chỉ ngã ba một công nhân chủ yếu để thử nghiệm điều này, sau đó thêm mã ở trên forking. Điều này đã khắc phục sự cố gỡ lỗi cho tôi. Cảm ơn bạn Sergey đã giải thích và cung cấp giải pháp !!!

Các vấn đề liên quan