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

Posted

技术标签:

【中文标题】使用 cluster.fork() 调试 Node.js 进程【英文标题】:Debugging Node.js processes with cluster.fork() 【发布时间】:2012-03-30 07:08:53 【问题描述】:

我有一些代码看起来很像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 新手,所以我希望这里有一些我明显遗漏的东西。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:
var fixedExecArgv=[];
fixedExecArgv.push('--debug-brk=5859');
cluster.setupMaster( 
  execArgv: fixedExecArgv 
);

归功于Sergey's post。

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

【讨论】:

【参考方案3】:

对于 2018 年及以上的任何人来说,都不需要启动参数。

来自this Github issue:

对于可能与我在同一条船上的任何人来说,这只是一个节省时间的方法——Node.js V8——检查器管理器(NiM)似乎引入了这个问题,否则它不会出现——我花了在禁用 Chrome 插件并发现从 chrome://inspect 打开时一切正常。

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

【讨论】:

【参考方案4】:

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

"autoAttachChildProcesses": true

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

【讨论】:

【参考方案5】:

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

如果直接在 DevTool 中调试,需要在控制台中添加对应端口的连接。

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于使用 cluster.fork() 调试 Node.js 进程的主要内容,如果未能解决你的问题,请参考以下文章

使用 node-inspector 调试 node.js

Nodejs集群仅将任务分配给一个工作者(任何)

如何使用 node-inspector 调试 nodeunit

vscode调试pomelo和pomelo使用vscode调试

node.js调试方法

Node.js调试指南