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

时间:2011-10-05 15:41:02

标签: javascript node.js debugging v8

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

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

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

使用--trace选项运行节点导致我的测试不仅运行缓慢(正如人们预期的那样),而且不能重现问题。

任何人都有任何解决方案或提示,以了解这个问题?

3 个答案:

答案 0 :(得分:9)

目前似乎答案是:坐稳并等待Node.js更新到更新的V8版本,或者使用the patch from this Chromium project bug report构建自己的版本。

This archived thread from the v8-dev mailing list显示讨论

  • Dave Smith提出了这个问题并提出了补丁
  • Chromium项目的Yang Guo讨论了它,针对该问题提交了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。因此,就Node而言,Chromium接受的补丁仍然是“未来”。

(这个答案归功于@Coderoshi,因为它是通过跟随他回答的主题来了解到这一切。)

答案 1 :(得分:4)

它似乎不太可能成为“略微过大的链条”。

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

因此,如果代码的减慢使得无限递归停止。 我的猜测是你有一个队列,并且慢速模式没有得到 填写得很快。

如果这没有用,那么我想我需要更多信息。 也许有人对此有所了解。

答案 2 :(得分:2)

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

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

相关问题