Ruby 1.8.7有效。 Ruby 1.9.2生成'Trace / BPT trap:5'

时间:2012-10-16 17:02:25

标签: ruby-on-rails ruby

我在两个安装了RVM的Ruby版本上运行Rails 2.3.11应用程序。两个版本的Ruby都具有完全相同的宝石,每个宝石的版本完全相同。我卸载了应用程序中不需要的每个gem。

使用Ruby 1.8.7(RVM 1.8.7)一切正常。

Ruby 1.9.2有两个gemsets。 RVM 1.9.2有另一个app的gemset。 RVM 1.9.2@this_app有以下列出的宝石。使用RVM 1.9.2@this_app我得到:

Trace/BPT trap: 5

日志停止,但没有指出错误是什么。有宝石兼容性问题吗?这是宝石列表:

actionmailer (2.3.11)
actionpack (2.3.11)
activerecord (2.3.11)
activeresource (2.3.11)
activesupport (2.3.11)
devise (1.0.10)
google4r-checkout (1.0.6.1)
i18n (0.6.0)
json (1.6.1)
liquid (2.2.2)
money (3.7.1)
mysql (2.8.1)
rack (1.1.2)
rails (2.3.11)
rake (0.9.2)
rmagick (2.13.1)
warden (0.10.7)

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

这似乎是已安装的gem列表,而不是Gemfile中的内容。

你是如何管理宝石和宝石的?你似乎在使用bundler,这很好,但你如何在ruby和gemsets的版本之间切换?你在使用rvm还是rbenv?你有Gemfile吗?

如果您没有使用bundler,可以使用rails 2.3.11这样做,只需要一些工作。我强烈建议您这样做,以便更好地管理您的依赖项。

然后我会考虑从Gemfilebundle install中删除任何内容以进行更新,然后再次尝试运行。

例如,我认为您不再需要cgi_multipart_eof_fix,具体取决于您的部署方式。

godrubygems-updaterdoc等其他宝石通常不会在应用中使用,并且可能与其密切相关。

答案 1 :(得分:1)

所以我认为你甚至无法使用ruby ./script/server成功启动应用程序?它没有启动,然后在第一次请求时崩溃了?

当Ruby开始崩溃时,首先要看的是你是否使用任何二进制(不是纯Ruby)宝石。仅查看上面的列表,我相信jsonmysqlrmagick可能是二进制的。暂时从你的Gemfile中注释掉它们(如果你必须注释掉部分应用程序代码,那么就这样做)。尝试使用bundle exec ruby ./script/server启动应用,看看它是否崩溃。 (我认为Rails可能需要json,在这种情况下你将无法禁用那个。)

如果您使用纯Ruby宝石,并且Ruby正在崩溃,那么您可能在解释器本身中发现了一个错误。没什么值得害怕的;如果我是你,我会卷起袖子,潜入C源(从github.com/ruby/ruby克隆),然后解决这个问题!但如果你没有C语言技能,你可能不想尝试。

如果你想尝试调试解释器,首先要找到它崩溃的点。为此,请使用application.rb调用将启动代码(例如boot.rbputs "got to #{__FILE__}:#{__LINE__}"等)丢弃,并尝试准确查明崩溃发生的位置。如果需要,可以打开你的宝石并向它们添加puts调用(只需进入RVM保存Ruby代码并编辑的目录)。

一旦找到它崩溃的点,你就可以进入C源代码并找到崩溃来自的任何平台方法或构造的实现。要获得有关内部发生情况的更多信息,请添加调试printf调用并使用make && make install重新编译解释器。 (请注意,来自C级printf的消息似乎与Ruby级别puts的顺序交错。)暂时编辑PATH,以便克隆的{{}中新编译的二进制文件1}}目录将充当系统ruby/bin

如果你真的可以解决问题并为Ruby提供补丁,这对你来说意味着一些非常好的吹牛权利!

答案 2 :(得分:0)

不喜欢回答我自己的问题,但找到了尚未提供的完整答案。

部分问题是rmagick兼容性。我在应用程序中注释了对rmagick的引用,但仍然遇到了同样的错误。

最大的影响因素是RVM安装了rubygems 1.8.24。 rubygems 1.6.x上的任何内容都不适用于rails 2.3.x应用程序。命令'rvm ruby​​gems 1.6.2'安装了一个兼容的版本。