Rails视图ivars在红宝石1.9中自发燃烧

Jon*_*her 5 ruby haml ruby-on-rails ivar

我有一个Rails 3/ruby​​ 1.9.2 webapp.每隔一段时间 - 它可能只有100000中的1个请求 - 我得到一个我无法解释的错误报告.

确切的错误会有所不同,但它们似乎与我的视图中的实例变量突然变为零无关.最近最明显的例子是这个代码在帮手中 -

 @swf_object_count||=0
 @swf_object_count+=1
Run Code Online (Sandbox Code Playgroud)

- 提出"NoMethodError:未定义的方法`+'为nil:NilClass".但请注意,错误不仅限于这种情况,这两行代码仅用于说明,而不是可以解决问题的方法.

错误基本上不可能重现:我自己从未见过它,只看到了它产生的错误报告.我相信当我们从REE切换到ruby 1.9.2时,错误首次出现.

可能相关或不相关的其他详细信息:

  • 我们在Solaris 10上运行ruby1.9.2p290,使用unicorn分叉实例
  • 我们没有使用线程或光纤(更正:我们的应用程序本身没有,但我们确实使用NewRelic,它有一个后台线程来收集/发布统计数据.)
  • 我们混合了.haml和.erb视图,但我只看到过这种情况来自.haml.(虽然我们没有很多.erbs)
  • 我从未见过这种情况发生在控制器代码中
  • 我偶尔会看到关于"未定义的方法'对于Bar"的错误,当我知道一个我们从未称之为Bar.foomethod的事实时.这可能与上面描述的bug有关,其中Bar对象自发地替换了Foo ivar.

我非常难以追踪这一点.任何建议,或有任何人看到任何听起来相似的东西?

Til*_*ilo 0

我的第一个想法是线或纤维——但你说你不使用它们。嗯...这可能是由陈旧的会话触发的吗?

这确实是一个非常广泛且定义松散的问题..

也许您可以编写一个脚本来分析您的日志文件,并尝试缩小发生这种情况的时间/路径。但这也很难调试,因为您可能在此过程中进行了一些代码更改,其中一些更改产生了看起来相似的有效错误。

Unicorn 实例可能会死亡,然后重新启动。这可能会扰乱当前会话。这可能是您可能想要尝试的东西 - 例如,使用具有两个独角兽的测试环境,在会话中杀死一个,然后看看这如何影响您的日志。

您可能应该安装一个工具,每当触发异常时,Rails 服务器都会通过电子邮件向您发送详细的日志记录..这可能是更清楚地了解那里发生的情况的最佳方法..

例如:您的 Gemfile 中的这个 Gem:

# Receive exception notifications from production
gem 'exception_notification_rails3', :require => 'exception_notifier'
Run Code Online (Sandbox Code Playgroud)

并在您的 config/environments/production.rb 文件中:

  config.middleware.use ExceptionNotifier,
    :email_prefix => "[Exception] ",
    :sender_address => %{"Exception Notifier" <your-system@your-domain.com>},
    :exception_recipients => %w{person1@your-domain.com person2@your-domain.com}
Run Code Online (Sandbox Code Playgroud)

另请参阅: https: //github.com/railsware/exception_notification