可以在没有完整堆栈跟踪的情况下识别“SystemStackError:堆栈级别太深”的来源吗?

时间:2011-12-06 19:29:53

标签: ruby-on-rails-3 heroku stack-trace spree

我在Heroku Bamboo MRI(Ruby)1.9.2上的Rails 3.0.9上运行Spree 0-60-stable

2011年12月3日星期六或之前的一段时间,我开始在之前没有抛出该错误的控制器中收到“SystemStackError(堆栈级太深)”消息。自11月28日以来,我没有重新编译过slu ..我首先尝试重新启动我的网络流程,但无济于事。我已经做了一个名义上的改变(我的Gemfile中有一行空格)所以我可以重新编译一个slug并将其推高。没变。我仍然得到错误。我去看看我可能迁移到的可用堆栈,但除了我在Bamboo-mri-1.9.2之外的其他任何堆栈都明确支持我的应用程序正在使用的ruby版本。

错误(根据Heroku支持)是:

ActionView :: Template ::错误(堆栈级别太深)

他们继续说,“这意味着你的模板中有一些东西正在进行可能的递归调用。虽然缺少代码更改可能表明我们的结果有些奇怪的行为,但也有可能发生了变化在您的数据库中或某些事情是基于时间的,导致行为发生变化。在任何一种情况下,完整的堆栈跟踪都会有所帮助。您是否使用Airbrake或Exceptional来捕获此错误并确定来源?“

我已经添加了 Airbrake (Hoptoad)和 Exceptional ,以检查它们可能在堆栈跟踪方面显示的内容。两者都提供相同的文件/行引用,但没有进一步的信息:

.bundle /宝石/红宝石/ 1.9.1 /宝石/ ActionPack的-3.0.9 / LIB / action_controller /金属/ rescue.rb:19

这似乎不是很有帮助,因为它是救援本身,而不是实际触发它的任何代码行,我只有最外层的上下文。我在几个地方看到同样的错误:

所以这是我的总结问题:

  1. 我没有更改我的代码,问题出现了“无处不在”。
  2. 如果是数据更改,例如admin中的设置,那是吗?
  3. 由于缺少完整的堆栈跟踪,故障排除很困难。
  4. 最后,我的问题是:

    如果没有完整的堆栈跟踪,是否可以识别“SystemStackError:stack level too deep”的来源?

    非常感谢您的任何帮助。

2 个答案:

答案 0 :(得分:2)

在这种情况下,我使用“printf debugging”。在控制器和模板代码的各个点添加log.info "got to here 1"(2,3,4等)。

然后重现错误。 然后检查日志并查看哪些语句已记录/未记录 - 因此您没有的代码部分到达,以及是否有任何部分无休止地重复...

并且您至少缩小了代码的哪一部分是问题。

答案 1 :(得分:2)

SystemStackError通常是由一些直接或间接调用自身的递归方法引起的。这可能是由创建无限递归的错误引起的,也可能是由递归发生的某些操作引起的,因此仅适用于有限大小的数据。

实施例

class Array
  def size
    return 0 if self.empty?
    1+self[1..-1].size
  end
end

理论上这是一个正确的大小实现,但它的堆栈大小与数组大小成线性关系。在我的系统上,这个实现失败了SystemStackErrorArrays大于8714。

puts写入您的代码

如果您怀疑哪种方法可能导致这种情况,请在方法中添加puts以生成一些调试输出。如果您看到某种方法的大量输出,您可以假设错误在某个方法附近。

跟踪所有方法

使用rubys buildin钩子来跟踪所有方法创建。然后自动修改每个新创建的方法以生成一些调试输出。使用所有这些调试信息,您的代码运行速度会很慢,但您可能会在跟踪中看到递归的原因。

相关问题