5

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

确切的错误各不相同,但它们似乎与我认为实例变量突然变为 nil 一样。最近发生了最明显的例子,其中这个代码在一个助手中 -

 @swf_object_count||=0
 @swf_object_count+=1

- 引发“NoMethodError:nil:NilClass 的未定义方法‘+’”。但是,请注意,错误不仅限于这种情况,这两行代码仅用于说明,而不是可以解决“解决”问题的方法。

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

可能相关或不相关的其他细节:

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

我很难追踪这个。有什么建议,或者有没有人看到任何听起来相似的东西?

4

2 回答 2

0

在你的助手中操纵视图 ivars 是一个糟糕的主意。我不确定您为什么会遇到并发问题,但我怀疑如果您以不同的方式构建代码,它们会消失。

也许您可以让助手计算增量值,并在您的视图中执行类似的操作

@swf_object_count + swf_increment_helper_value

于 2011-10-20T14:01:01.093 回答
0

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

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

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

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

您可能应该安装一个工具,您的 Rails 服务器会在触发异常时通过电子邮件向您发送详细的日志记录。这可能是更好地了解那里发生的事情的最佳方式。

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

# Receive exception notifications from production
gem 'exception_notification_rails3', :require => 'exception_notifier'

并在您的 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}

另见: https ://github.com/railsware/exception_notification

于 2011-10-19T03:38:29.343 回答