【问题标题】:SystemStackError triggered by changing files while server is running?在服务器运行时更​​改文件触发 SystemStackError?
【发布时间】:2012-11-21 10:18:38
【问题描述】:

在我的 RoR 应用程序开发机器(本地服务器、OSX 10.8.1、Ruby 1.9.3、Rails 3.2.8)上,一些奇怪的东西开始凭空出现(当然……):

Rails 服务器崩溃(所有路由都被终止,服务器重启是让它再次工作的唯一方法),并出现以下日志条目:

SystemStackError (stack level too deep):
  actionpack (3.2.8) lib/action_dispatch/middleware/reloader.rb:70


  Rendered /Users/dekay/.rvm/gems/ruby-1.9.3-head@global/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.9ms)
  Rendered /Users/dekay/.rvm/gems/ruby-1.9.3-head@global/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.2ms)
  Rendered /Users/dekay/.rvm/gems/ruby-1.9.3-head@global/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (14.7ms)

我用谷歌搜索发现 SystemStackError 通常是由于无限循环造成的,但据我所知,我的代码中没有这样的循环。而且错误似乎不在应用逻辑的某个步骤。

服务器崩溃与我的操作之间的唯一关联如下:

  1. 更改应用中的一些代码
  2. 重新加载应用的当前网页
  3. Boom,服务器消失,错误消息。
  4. 在此之后没有页面工作,错误是:

    路由错误

    没有路线匹配 [GET] "/"

    尝试运行 rake 路线以获取有关可用路线的更多信息。

谁能指出我调试的正确方向,好吗? PS:我怀疑它发生在粗心的“捆绑更新”之后。可以吗?

【问题讨论】:

标签: ruby-on-rails macos error-handling ruby-on-rails-3.2


【解决方案1】:

rails app 中调试stack level too deep 错误消息并不容易,因为错误可能是由多种原因造成的,而且错误消息并没有太大帮助。

导致stack level too deep error的一些原因:

  1. 应用程序的gems & plugins and any other dependencies 不一致。
  2. Code syntax error
  3. applying db migrations erroneously 引起的不一致。

如果错误发生在系统启动时,那么这个提示将非常有用:http://www.datatravels.com/technotes/2012/07/11/awesome-debugging-for-rails-boot-stacklevel-too-de/

根据描述,该应用程序在一段时间内运行良好,然后开始崩溃 - 因此上述启动情况可能不适用。

解决问题的一种方法是使用 printf debugging 隔离导致错误的特定 line/block of code

此外,可能值得回滚更改并使系统恢复工作状态,然后逐步恢复更改以找出根本原因。

在这种情况下,bundle update 很可能确实触发了错误;因此检查新添加的依赖项并查看它们是否是罪魁祸首是个好主意。

【讨论】:

  • 感谢您的回答。真正奇怪的是,它似乎在重新加载器中发生,当我在本地更改文件时,服务器没有得到它并且似乎崩溃了。当我部署到 heroku 时,这根本不会发生。
  • Heroku deploy 强制重启服务器;所以错误不会在那里发生可能并不奇怪。重新启动后本地应用程序是否继续正常工作?或者它会在一段时间后恢复失败并出现相同的错误?
  • 如果我不更改“正在运行的系统下”的任何文件,本地应用程序运行良好。在应用程序运行时更改文件过去是安全的,我只需要重新加载网页即可获得新内容。
  • 现在,当我在更改文件和重新加载网页(而不是服务器)之间等待几秒钟时,它可以工作了。如果我太快它会崩溃。
  • 您在开发中更改了哪些文件?如果是config/initializers/ 中的内容,则必须重新启动服务器。这个答案有一些相关信息:stackoverflow.com/a/4880811/429758
猜你喜欢
  • 1970-01-01
  • 2012-10-20
  • 2016-08-21
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 2014-05-17
相关资源
最近更新 更多