gpt4 book ai didi

ruby - Ruby 1.9.2 中机架级别的 SystemStackError,而不是 1.8.7

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:27 26 4
gpt4 key购买 nike

我被引入遗留代码库,将其从 Rails 2.4/Ruby 1.8.7 升级到 Rails 3.1/Ruby 1.9.2。在这样做的过程中,我发现了一个非常有趣的问题,花了 3 天时间才弄明白。我想把它放在这里,既是为了给它一些谷歌汁,让其他人看到这个问题,也是为了问这个问题:为什么?

基本上,在运行我的应用程序时,我在 Rack 级别看到了 SystemStackError。在错误发生之前我无法通过任何请求,并且无法调试它,因为我的代码从未被触及过。在开发模式下,我可以看到网站的大部分内容,然后在访问数据库时突然收到 SystemStackError。所以我认为这是延迟加载。

切换到生产模式,异常发生在第一个请求上。服务器正常启动,但没有请求通过,我的代码也没有被触及。

快进太多小时,我追踪回溯到 Rails 中的一个循环 (full gist):

/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:102:in `initialize' 
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:238:in `new'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_controller/metal.rb:238:in `block in action'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:71:in `call'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:71:in `dispatch'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:35:in `call'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/rack-mount-0.8.3/lib/rack/mount/route_set.rb:152:in `block in call'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:96:in `block in recognize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:68:in `optimized_each'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:95:in `recognize'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/rack-mount-0.8.3/lib/rack/mount/route_set.rb:141:in `call'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:538:in `call'
/Users/john/.rvm/gems/ruby-1.9.2-p320@qstream-ruby19/gems/omniauth-1.1.0/lib/omniauth/builder.rb:48:in `call'
...

我们在这里看到的是系统从 metal.rb 循环到 url_for.rblayouts.rbrendering。 rbmetal.rburl_for.rb

经过相当大的努力,我追踪到模型文件顶部的以下行 (like so):

include ActionView::Helpers::UrlHelpers

请注意,这不是在类内部,而是在模块级别。

有趣的是,这在 Ruby 1.8.7 中有效,但在 Ruby 1.9.2 中会导致 SystemStackError

我创建了一个 Github repository illustrating this behavior .

如果你获取这个存储库,并运行 ruby18 分支,你可以加载一个页面。如果你运行 ruby19 分支,你会在任何请求上得到一个 SystemStackError(任何加载 Widget 的请求,在生产环境中运行它,它不会延迟加载)。

所以,有人知道为什么吗?

我的意思是,我想这与 Ruby 1.9 加载模块的方式有关,因为它似乎不是由 Rails 核心引起的问题。我主要关心的问题是,这是否只是代码库中惰性编程实践导致的深奥问题,或者它是否指向更深层次的问题,无论是在 Ruby 还是 Rails 中。

最佳答案

这看起来像 Bug 3144 , 表示直接引用助手。

Rails.application.routes.url_helpers

关于ruby - Ruby 1.9.2 中机架级别的 SystemStackError,而不是 1.8.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11055656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com