我有一台服务器,我可以通过以下输出导致死亡:
events.js:38
EventEmitter.prototype.emit = function(type) {
^
RangeError: Maximum call stack size exceeded
但是,如果没有堆栈转储或跟踪,我无法找到这是无限递归还是只是一个稍微过大的链,更不用说问题函数的位置了。
使用--trace
选项运行节点导致我的测试不仅运行缓慢(正如人们预期的那样),而且不能重现问题。
任何人都有任何解决方案或提示,以了解这个问题?
答案 0 :(得分:9)
目前似乎答案是:坐稳并等待Node.js更新到更新的V8版本,或者使用the patch from this Chromium project bug report构建自己的版本。
This archived thread from the v8-dev mailing list显示讨论
注意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