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

时间:2012-03-13 20:26:11

标签: debugging node.js fork cluster-computing

我有一些代码看起来非常像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);
    }
  });
}

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

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

6 个答案:

答案 0 :(得分:11)

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

信用转到Sergey's post

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

答案 1 :(得分:3)

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

虽然还没有修复,但有一个解决方法:

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

答案 2 :(得分:2)

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

"autoAttachChildProcesses": true

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

答案 3 :(得分:0)

对于任何在2018年以上关注此问题的人,无需启动参数。

来自this Github issue

  

对于那些可能和我同舟共济的人来说,这只是一个节省时间的事-Node.js V8-检查器管理器(NiM)似乎会引入这个问题,否则我就不会出现这个问题–我花了在禁用Chrome插件并发现从chrome:// inspect打开时一切正常,大约需要花一个小时的时间。

我还花了几个小时阅读github帖子,调整gulp-typescript和gulp-sourcemaps等的设置,只是让那个插件成为问题。另外值得注意的是,我必须将端口N + 1添加到chrome://inspect的远程目标上,因此localhost:9230才能调试工作进程。

答案 4 :(得分:0)

如果使用VSCode进行调试,则需要在lanuch.json文件中指定端口和"autoAttachChildProcesses": true

如果直接在DevTool中进行调试,则需要将连接添加到控制台中的相应端口。

enter image description here

答案 5 :(得分:0)

对于高于或等于7.7.0的节点版本使用--inspect标志来调试node js进程, 如果有人想了解有关如何调试集群处理以及为Node JS设置chrome调试器工具的更多信息,请关注我的帖子here