Javascript “调试”;超过最大调用堆栈大小;

Javascript “调试”;超过最大调用堆栈大小;,javascript,node.js,debugging,v8,Javascript,Node.js,Debugging,V8,我有一台服务器,可以通过以下输出导致服务器死亡: events.js:38 EventEmitter.prototype.emit = function(type) { ^ RangeError: Maximum call stack size exceeded 但是,如果没有堆栈转储或跟踪,我无法确定这是无限递归还是仅仅是一个稍微过大的链,更不用说问题函数的位置了 使用--trace选项运行Node会导致我的测试不仅运行缓慢

我有一台服务器,可以通过以下输出导致服务器死亡:

events.js:38
EventEmitter.prototype.emit = function(type) {
                                  ^
RangeError: Maximum call stack size exceeded
但是,如果没有堆栈转储或跟踪,我无法确定这是无限递归还是仅仅是一个稍微过大的链,更不用说问题函数的位置了

使用
--trace
选项运行Node会导致我的测试不仅运行缓慢(正如人们所期望的那样),而且不会重现问题

有人有任何解决方案或技巧来弄清这一点吗?

这条链“稍微太大”的可能性似乎不大

它可能是一个调用触发自身的事件的函数

因此,如果代码的减速使无限递归停止。 我的猜测是,你有一个队列,而在较慢的模式下,它不会得到 很快就装满了

如果这没有帮助,那么我想我需要更多的信息。
也许有人对此有一个全面的了解。

此补丁可能会帮助您找到解决方案。它极大地扩展了堆栈跟踪:


目前的答案似乎是:坐好,等待Node.js更新到新的V8版本,或者使用构建自己的版本

显示一个讨论,其中

  • Dave Smith提出了这个问题,并提出了一个补丁
  • Chromium项目的杨果对此进行了讨论,针对该问题提交了一个Chromium bug,并应用了不同的修复程序
  • Dave注意到Node(当时为0.8)使用的是V8 3.11,并询问了补丁的后移植问题。杨回答说,补丁可能会在V8 3.15中发布,并且不会进行后端口
注意Node.js v0.8使用了V8 3.11;Node.js 0.10当前正在使用V8 3.14。因此,就节点而言,Chromium针对该问题接受的补丁仍然是“未来的”


(这个答案要归功于@Coderoshi,因为正是通过遵循他的答案中的线索,我才了解了这一切。)

通过比较已知发生这种情况前后的差异,解决了这个特殊问题,通过每个新的/更改的
emit
调用执行额外的日志记录,并发现作用域错误,从而导致
'drain'
事件上的联合递归-因此速度敏感。我仍然会将公认的答案授予解决这一问题的最佳总体战略。这似乎是正确的方法。我不会把这个补丁描述为“极大地扩展了堆栈跟踪”;我将其描述为“更努力地为堆栈溢出异常构造堆栈跟踪”。顺便说一句,该补丁修改的代码包含对TODO(1240995)的引用;有人知道这是指什么bug数据库吗?我没有找到任何bug 1240995,但我找到了dizzyd的补丁;看,有什么消息吗?我遇到了与调试“RangeError:超出最大调用堆栈大小”相同的问题。问题是,几天后它就出现在一个未更改的Web应用程序中,我不知道如何搜索,因此stacktrace将是一个很大的帮助。Node 0.11正在使用足够新的V8版本来显示这种情况下的堆栈跟踪。如果您能够在节点0.11下运行您的Web应用程序,请尝试。刚刚尝试了v.0.11.6,虽然我能够运行Web应用程序,但堆栈跟踪不起作用。不管怎样,我修好了程序错误,但是我认为这个评论对于类似bug的人来说是很有用的。也许这样可以节省一些时间,而不是编译不稳定的版本;-)。