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

Debugging 使用cluster.fork()调试Node.js进程,debugging,node.js,fork,cluster-computing,Debugging,Node.js,Fork,Cluster Computing,我有一些代码与群集文档中的示例非常相似,即: var cluster=require('cluster'); var server=require('./mycustomserver'); var numpus=require('os').cpus().length; if(cluster.isMaster){ var i; //主进程 对于(i=0;i

我有一些代码与群集文档中的示例非常相似,即:

var cluster=require('cluster');
var server=require('./mycustomserver');
var numpus=require('os').cpus().length;
if(cluster.isMaster){
var i;
//主进程
对于(i=0;i
我已经安装了node inspector,并尝试使用它和Eclipse V8插件来调试我的应用程序,但看起来我无法将调试器连接到分叉的集群实例以在有趣的服务器逻辑上设置断点——我只能调试产生集群进程的应用程序部分。有人知道我是否真的可以做这样的事情,或者我必须重构我的应用程序,以便在调试模式下只使用一个线程吗


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

我已经在这里开了一张罚单:

虽然尚未修复,但有一个解决方法:

FWIW:我怀疑的原因是节点调试器需要绑定到调试端口(默认值:5858)。如果您使用的是集群,我猜主/控制器首先绑定,然后成功绑定,导致子/工作者中的绑定失败。虽然可以向node--debug=N提供端口,但当在集群内为worker调用node时,似乎不容易做到这一点(可以通过编程方式设置process.debug_端口,然后启用调试,但我还没有做到这一点)。这就留下了一系列选项:1)启动节点时不带--debug选项,在它运行后,找到要调试/配置的工作进程的pid,并向它发送USR1信号以启用调试。另一个选项是为节点编写一个包装器,该包装器每次调用实际节点二进制文件,并将--debug设置为唯一的端口。集群中可能有允许您通过的选项,例如arg

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


我将我的
server.js
更改为仅fork一个worker,主要用于测试它,然后将代码添加到fork之上。这为我解决了调试问题。感谢Sergey解释并提供解决方案

对于任何在2018+关注这一点的人来说,不需要任何创业论据

发件人:

对于任何可能与我同舟共济的人来说,这只是一个节省时间的方法——Node.js V8——inspector Manager(NiM)似乎在这个问题不存在的时候引入了这个问题——在禁用Chrome插件之前,我花了大约一个小时的时间敲打自己的头,发现当从chrome://inspect.


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

对于希望在VS代码中调试子进程的人,只需将此添加到launch.json配置:

"autoAttachChildProcesses": true

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

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

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

"autoAttachChildProcesses": true