跟踪流星/节点光纤中的堆栈溢出

时间:2013-11-07 18:23:58

标签: node.js meteor v8 node-fibers

我现在看到这次崩溃,对节点光纤基础设施不够熟悉,无法知道从何处开始解释错误或检测代码......

Meteor server running on: http://localhost:3000/
W202407-10:06:05.740(-8)? (STDERR) /Users/dauser/.meteor/tools/0b2f28e18b/lib/node_modules/fibers/future.js:173
W202407-10:06:07.363(-8)? (STDERR)                      throw(ex);
W202407-10:06:07.363(-8)? (STDERR)                            ^
W202407-10:06:07.363(-8)? (STDERR) RangeError: Maximum call stack size exceeded
=> Exited with code: 8
=> Meteor server restarted

据我了解,有些东西反复出现,服务器堆栈爆炸,崩溃。不幸的是,我不知道这个有问题的功能在哪里 - 我看了我的Deps.autorun电话(目前只有一个),这似乎不是麻烦。我的代码都没有用显式递归实现,我没有任何理由怀疑传递大对象。显然,我当然不太确定。

我真的只是在寻找有关如何检测代码的建议,以向我展示事情失控的地方。由于Meteor在幕后做了大量工作,如果有人能给我一些关于在哪里看的指示,那将是非常有用的。

回到这一点,我仍然很遗憾在哪里看。 this建议更新到节点0.11.x会给我更多信息,但这样做似乎没有在崩溃时添加任何更多细节。

崩溃发生在任何页面交互之后 - 也就是说,服务器启动并且运行正常,但如果我在浏览器中重新加载或与页面本身交互,那么BOOM!

根据大众需求,这是服务器代码:

isAuthorized = () ->
    console.log "checking authorization"
    this.userId == Assets.getText('authorizedUsers')

Meteor.methods(
    isAuthorized : isAuthorized
    filePickerKey : () -> 
        # TODO: properly abstract this, rather than copy/paste...       
        if this.userId == Assets.getText('authorizedUsers')
            Assets.getText('fpKey')
        else
            Meteor.Error 403, 'Error 403: Forbidden')

取消注释future.js的第172行没有提供更多细节:

I2041-15:52:07.363(-8)? Resolve cb threw Maximum call stack size exceeded

而且,这是我在尝试使用node-inspector时遇到的麻烦。过去半小时我一直在玩这个,所以我可能只是犯了一些基本错误,但是: 我通过npm安装了node-inspector(npm install -g node-inspector)。

然后,我试试

$ node-inspector &
[1] 3408
$ Node Inspector v0.6.2
  info  - socket.io started
Visit http://127.0.0.1:8080/debug?port=5858 to start debugging.

$ meteor &
[2] 3413
$ [[[[[ ~/Projects/indefinite-ways ]]]]]

=> Meteor server running on: http://localhost:3000/

$ kill -s USR1 3413
Hit SIGUSR1 - starting debugger agent.
debugger listening on port 5858
到目前为止,这么好。此时,客户端未在我的浏览器中打开(即没有指向localhost:3000的选项卡)。我打开一个指向localhost:5858的Chrome标签页,看到meteor.js的来源我在meteor.js的第6行设置了一个断点

var Fiber = require('fibers');

然后打开meteor客户端选项卡(localhost:3000),再次弹出上述堆栈溢出。调试器不会在第6行停止,或以任何其他方式表示它已注意到。如果我在第3行设置断点,情况也是如此。

3 个答案:

答案 0 :(得分:4)

尝试node-inspector,它允许检查callstack。这是video presentation如何使用它,在视觉上它看起来像chrome调试器(它是相同的基础源)。

答案 1 :(得分:2)

稍微有用的答案来自unofficial Meteor FAQ

$ node-inspector &
$ NODE_OPTIONS='--debug-brk' mrt run &

这将在后台启动节点检查器进程,然后使用正确的调试标志集启动meteor的节点容器侦听。打开Chrome标签页以http://127.0.0.1:8080/debug?port=5858,让我一步一步。

此外,严格问题的答案,但上面代码中的违规行似乎是在服务器代码中调用Meteor.Error。我仍然乐意接受这个可以确定的答案。我猜测Meteor.Error根本不是EJSONable,并且在尝试解析它时,堆栈会爆炸。

答案 2 :(得分:1)

Line 173 of future.js将异常转发给下一个侦听器。在您的情况下,下一个侦听器就是实例本身,导致堆栈崩溃循环。

编辑你的future.js文件(OP中引用的路径)并取消注释它上方的console.log行...然后你应该看到更详细的解释。如果console.log输出无法解决,请在此处发布以进行进一步诊断。

根据this thread,我的猜测是与丢失的包有关。