使用cluster.fork()调试Node.js进程

Chr*_*ris 19 debugging fork cluster-computing node.js

我有一些代码看起来非常像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);
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

我安装了node-inspector并尝试使用它和https://github.com/joyent/node/wiki/Using-Eclipse-as-Node-Applications-Debugger中详细介绍的Eclipse V8插件来调试我的应用程序,但是看起来我无法将调试器挂钩到分叉集群实例以将断点放在有趣的服务器逻辑上 - 我只能调试生成集群进程的应用程序部分.有人知道我是否可以做这样的事情,或者我是否必须重构我的应用程序在调试模式下只使用一个线程?

我是Node.js的新手,所以我希望有一些明显我在这里缺失的东西.

小智 11

var fixedExecArgv=[];
fixedExecArgv.push('--debug-brk=5859');
cluster.setupMaster({ 
  execArgv: fixedExecArgv 
});
Run Code Online (Sandbox Code Playgroud)

幸得谢尔盖的职位.

我把我server.js改为fork只有一个工作人员主要用于测试,然后在分叉上面添加了代码.这为我解决了调试问题.谢谢谢尔盖解释并提供解决方案!


J. *_*lds 6

对于那些希望在 VS Code 中调试子进程的人,只需将其添加到 launch.json 配置中:

"autoAttachChildProcesses": true
Run Code Online (Sandbox Code Playgroud)

https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_remote-debugging


Oha*_*ick 3

我已经在这里开了一张关于此问题的票:https ://github.com/dannycoates/node-inspector/issues/130

尽管尚未修复,但有一个解决方法:

FWIW:我怀疑的原因是节点调试器需要绑定到调试端口(默认:5858)。如果您使用的是集群,我猜主/控制器首先绑定并成功,导致子/工作线程中的绑定失败。虽然可以向节点 --debug=N 提供端口,但当在集群中为工作线程调用节点时,似乎没有简单的方法可以做到这一点(可能可以以编程方式设置 process.debug_port 然后启用调试,但我还没有发挥作用)。这留下了一堆选项:1)在没有 --debug 选项的情况下启动节点,一旦运行,找到要调试/分析的工作进程的 pid,并向其发送 USR1 信号以启用调试。另一种选择是为节点编写一个包装器,每次调用真实节点二进制文件时将 --debug 设置为唯一的端口。Cluster 中可能还有一些选项可以让您传递,例如 arg。