【问题标题】:Ruby 1.8.7 works. Ruby 1.9.2 produces 'Trace/BPT trap: 5'Ruby 1.8.7 有效。 Ruby 1.9.2 产生“跟踪/BPT 陷阱:5”
【发布时间】:2012-10-18 23:39:04
【问题描述】:

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

Ruby 1.8.7 (RVM 1.8.7) 一切正常。

Ruby 1.9.2 有两个 gemset。 RVM 1.9.2 有另一个应用程序的 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)

感谢您的帮助。

【问题讨论】:

  • 我已经查看了该问题和答案。我的所有宝石都没有被注释掉。我使用 RVM 对两个版本的 Ruby 和 gem 进行了全新安装。我们使用的是 MySQL 而不是 Postgresql。我可能会遗漏一些东西。有什么我没看到的吗?
  • @jay 这是一个猜测,你可以尝试卸载那个 rmagick gem 然后再次运行服务器吗?我这样说是因为 rmagick 使用一些与系统相关的库进行图像处理,并且可能其中一些可能与您正在运行的操作系统不兼容并可能引发此错误
  • @Raghu 你是对的。 rmagick 是问题的 1/2。完整的解决方案如下。
  • @jay 很高兴听到您解决了问题。

标签: ruby-on-rails ruby


【解决方案1】:

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

您如何管理宝石和宝石组?您似乎正在使用捆绑程序,这很好,但是您如何在 ruby​​ 和 gemsets 版本之间切换?您使用的是 rvm 还是 rbenv?你有 Gemfile 吗?

如果您不使用 bundler,则可以使用 rails 2.3.11 来执行此操作,它只需要一些工作。我强烈推荐这个,这样你就可以更好地管理你的依赖关系。

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

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

godrubygems-updaterdoc 等其他 gem 通常不在应用内使用,并且可能没有密切关系。

【讨论】:

  • 自发布问题后取出 cgi_multipart_eof_fix。使用 RVM。将删除我绝对不需要的所有内容,然后编辑问题。谢谢。
  • 卸载了应用程序不需要的所有 gem,包括 bundler。稍后我会担心如何使用 bundler 进行处理。
【解决方案2】:

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

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

如果您使用纯 Ruby gems,而 Ruby 正在崩溃,那么您很可能在解释器本身中发现了一个错误。这没什么好害怕的。如果我是你,我会卷起袖子,潜入 C 源代码(从 github.com/ruby/ruby 克隆它),然后修复这个问题!但是如果你没有 C 方面的技能,你可能不想尝试它。

如果你想尝试调试解释器,首先要找到它崩溃的点。为此,将启动代码(例如application.rbboot.rb 等与puts "got to #{__FILE__}:#{__LINE__}" 调用一起乱扔,并尝试准确指出崩溃发生的位置。如果需要,您可以打开您的宝石并添加@987654331 @ 也会调用它们(只需进入 RVM 保存 Ruby 代码的目录并进行编辑)。

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

如果你真的能解决问题并为 Ruby 贡献一个补丁,那将意味着你有一些很好的吹牛的权利!

【讨论】:

  • 这里有很好的信息。我从 10 岁起就没有编程了 :=] 所以其中一些超出了我目前的能力(参见个人资料)。很想知道卡努克人在赞比亚做什么。
  • 很高兴听到这对您有所帮助!我目前在赞比亚做志愿者。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2014-03-19
    相关资源
    最近更新 更多