SystemStackError: 栈层级太深 - sql.active_record?

3

我遇到了一个非常大的问题。我的应用程序正在执行几千个SQL查询,然后突然出现了这个错误。如果我通过rake任务或直接通过rails控制台执行代码都没有区别。

有人知道这是什么意思吗?从来没有看到过与rails记录器相关的这个错误。

环境:
ruby-2.1.2
postgres 9.3
rails 4.1.5

Could not log "sql.active_record" event. SystemStackError: stack level too deep ["/Users  /ghostrifle/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/tagged_logging.rb:46"]
SystemStackError: stack level too deep
from /Users/ghostrifle/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/irb/workspace.rb:86
Maybe IRB bug!

在第23个调用者之后,异常被抛出。

以下是SystemStackError异常的检查结果。

[
  "/Users/ghostrifle/Entwicklung/xxx_main/lib/tasks/tree_spot.rake:42:in `block (2 levels) in <top (required)>'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/task.rb:240:in `call'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/task.rb:240:in `block in execute'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/task.rb:235:in `each'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/task.rb:235:in `execute'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/task.rb:179:in `block in invoke_with_call_chain'",
  "/Users/ghostrifle/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/task.rb:172:in `invoke_with_call_chain'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/task.rb:165:in `invoke'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/application.rb:150:in `invoke_task'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/application.rb:106:in `block (2 levels) in top_level'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/application.rb:106:in `each'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/application.rb:106:in `block in top_level'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/application.rb:115:in `run_with_threads'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/application.rb:100:in `top_level'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/application.rb:78:in `block in run'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/application.rb:176:in `standard_exception_handling'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/lib/rake/application.rb:75:in `run'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/gems/rake-10.3.2/bin/rake:33:in `<top (required)>'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/bin/rake:23:in `load'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/bin/rake:23:in `<main>'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `eval'",
  "/Users/ghostrifle/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `<main>'"
]

这个问题发生时有什么特别的情况吗?你检查过代码中是否存在无限递归吗?看一下这个链接:http://dalibornasevic.com/posts/5-ruby-stack-level-too-deep-systemstackerror - dabadaba
谢谢提供链接,我现在正在尝试使用ulimit命令。 - ghostrifle
嗯...我的堆栈大小为8192,但即使通过“ulimit -s 16384”增加它也没有帮助。同样的错误,还有23个调用者。 - ghostrifle
我想不出其他解决方案,只能通过查找可能的无限递归循环来检查您的代码。您什么时候确切地遇到了这个错误? - dabadaba
1个回答

0
请问能否展示一下导致问题的代码?根据我的理解,您正在保留一个堆栈,并向其中添加从数据库中获取的数据,但可能没有初始化为[]。因此,每次运行代码时,数据都会被堆积起来,最终导致了这个问题。

1
可能是因为你编写了一些无限循环的代码,例如在before_update中调用update_attributes将会创建一个无限循环,并且会抛出同样的错误'maximum stack level exceeded'。你需要检查代码并找到问题所在。 - abhsss96

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接