debugging“超出最大调用堆栈大小”

我有一个服务器,我可以导致死亡与以下输出:

events.js:38 EventEmitter.prototype.emit = function(type) { ^ RangeError: Maximum call stack size exceeded 

但是,如果没有堆栈转储或跟踪,我无法find这是无限recursion还是只是一个稍大的链,更不用说问题函数的位置了。

使用--trace选项运行节点导致我的testing不仅运行缓慢(正如人们所期望的),而是不会重现该问题。

任何人有任何解决scheme或提示,以达到这个底部?

看来现在的答案是:坐下来等待Node.js更新到更新的V8版本,或者使用这个Chromium项目错误报告中的补丁build立自己的版本。

这个来自v8-dev邮件列表的归档线程显示了其中的讨论

  • 戴夫·史密斯提出了这个问题,并提出了一个补丁
  • Chromium项目的Yang Guo对此进行了讨论,提出了一个针对该问题的Chromium bug,并应用了不同的修复方法
  • 戴夫指出,节点(当时的0.8)正在使用V8 3.11,并要求关于补丁的后移。 杨回复说,这个补丁可能会在V8 3.15版本下载,不会被回溯。

请注意,Node.js v0.8使用V8 3.11; Node.js 0.10目前使用的是V8 3.14。 所以Chromium接受的这个补丁在Node方面还是“未来的”。

(这个答案要归功于@Coderoshi,因为它是通过跟踪他的答案中的线索,我学到了这一切。)

它是一个“稍大的连锁”似乎不太可能。

这可能是一个调用触发事件的函数。

所以如果代码的放慢使得无限recursion停止。 我的猜测是,你有一个队列,而在较慢的模式下,它没有被填满一样快。

如果这没有帮助,那么我想我需要更多的信息。 也许有人有这个虽然。

此修补程序可能会帮助您find解决scheme。 它极大地扩展了堆栈跟踪:

https://github.com/dizzyd/node/commit/40434019540ffc17e984ff0653500a3c5db87deb