【问题标题】:Cross-thread violation on rb_gc()rb_gc() 上的跨线程冲突
【发布时间】:2012-04-16 14:18:29
【问题描述】:

我正在处理的代码库最近从 Ruby 1.9.2 升级到 Ruby 1.9.3,从 Rails 3.1 升级到 Rails 3.2.2。因为我使用的是 RVM,所以我只是简单地做了 rvm install 1.9.3,我原以为这是所有必要的。

当我跑步时

rails s

我得到了错误

[BUG] rb_gc() 上的跨线程冲突

我找到了许多与此问题相关的链接。有one on StackOverflow,但它并没有真正给出答案。最有希望的答案是on the RVM site

到目前为止,我所见过的每一种情况都总是以 因为带有 C 扩展的 ruby​​ gem/库是针对 不同于尝试加载的 ruby​​ 和/或架构 它。尝试使用您的 C 扩展卸载和重新安装 gem 应用程序用来追捕这个臭虫。

这很有帮助,但是我的 Ruby-fu 不够强大,无法知道哪些 gem 有 C 扩展,哪些我应该尝试重新安装。该主题的很多其他链接似乎表明 json gem 有问题,所以我尝试按照建议的解决方案进行操作。

gem uninstall json 
gem install --platform=ruby

这对我来说并没有真正改变任何事情——我在尝试启动 Rails 环境时仍然遇到完全相同的错误。

我该如何追查这个问题?

如果有帮助,这里是 gem 列表的输出:

actionmailer (3.2.2)
actionpack (3.2.2)
activemodel (3.2.2)
activerecord (3.2.2)
activeresource (3.2.2)
activesupport (3.2.2)
addressable (2.2.7)
akami (1.0.0)
arel (3.0.2)
bcrypt-ruby (3.0.1)
bson (1.6.1)
bson_ext (1.6.1)
builder (3.0.0)
bundler (1.1.3, 1.0.21)
capybara (1.1.2)
carmen (0.2.13)
childprocess (0.3.1)
ci_reporter (1.7.0)
coderay (1.0.5)
coffee-rails (3.2.2)
coffee-script (2.2.0)
coffee-script-source (1.2.0)
commonjs (0.2.5)
cucumber (1.1.9)
cucumber-rails (1.3.0)
database_cleaner (0.7.2)
devise (2.0.4)
diff-lcs (1.1.3)
ejs (1.0.0)
email_spec (1.2.1)
engineyard (1.4.28)
engineyard-serverside-adapter (1.6.3)
erubis (2.7.0)
escape (0.0.4)
execjs (1.3.0)
factory_girl (3.0.0)
factory_girl_rails (3.0.0)
faker (1.0.1)
fakeweb (1.3.0)
ffi (1.0.11)
gherkin (2.9.3)
gyoku (0.4.4)
haml (3.1.4)
haml-rails (0.3.4)
hash-deep-merge (0.1.1)
highline (1.6.11)
hike (1.2.1)
httpi (0.9.6)
i18n (0.6.0)
jasmine (1.1.2)
jasmine-core (1.1.0)
jasminerice (0.0.8)
journey (1.0.3)
jquery-rails (2.0.1)
json (1.6.6)
json_pure (1.6.6)
kaminari (0.13.0)
kgio (2.7.4)
launchy (2.0.5)
less (2.1.0)
less-rails (2.2.0)
libv8 (3.3.10.4 x86_64-darwin-11)
log4r (1.1.10)
mail (2.4.4)
metaclass (0.0.1)
method_source (0.7.1)
mime-types (1.18)
mocha (0.10.5)
mongo (1.6.1)
mongoid (2.4.7)
mongoid-rspec (1.4.4)
multi_json (1.2.0)
net-ssh (2.2.2)
newrelic_rpm (3.3.3)
nokogiri (1.5.2)
nori (1.1.0)
open4 (1.3.0)
orm_adapter (0.0.7)
polyglot (0.3.3)
pr_geohash (1.0.0)
pry (0.9.8.4)
pry-highlight (0.0.1)
pry_debug (0.0.1)
rack (1.4.1)
rack-cache (1.2)
rack-ssl (1.3.2)
rack-test (0.6.1)
rails (3.2.2)
rails-footnotes (3.7.6)
railties (3.2.2)
raindrops (0.8.0)
rake (0.9.2.2)
rdoc (3.12)
recursive-open-struct (0.2.1)
rest-client (1.6.7)
rpm_contrib (2.1.8)
rsolr (1.0.7)
rspec (2.9.0)
rspec-core (2.9.0)
rspec-expectations (2.9.0)
rspec-mocks (2.9.0)
rspec-rails (2.9.0)
rubyzip (0.9.6.1)
sass (3.1.15)
sass-rails (3.2.5)
savon (0.9.9)
selenium-webdriver (2.20.0)
settings-tree (0.2.1)
simplecov (0.6.1)
simplecov-html (0.5.3)
simplecov-rcov (0.2.3)
slop (2.4.4)
spine-rails (0.1.0)
spork (1.0.0rc2)
sprockets (2.1.2)
sunspot (1.3.1)
sunspot_mongoid (0.4.1)
sunspot_rails (1.3.1)
sunspot_solr (1.3.1)
term-ansicolor (1.0.7)
therubyracer (0.10.1)
thor (0.14.6)
tilt (1.3.3)
treetop (1.4.10)
twitter-bootstrap-rails (2.0.6)
tzinfo (0.3.32)
uglifier (1.2.4)
unicorn (4.2.1)
warden (1.1.1)
wasabi (2.1.0)
xpath (0.1.4)

【问题讨论】:

  • 我知道来自 ruby​​ 的堆栈跟踪是巨大的,但是你能找到它崩溃的地方并发布相关部分吗?我在 ruby​​ 中遇到过类似的崩溃,它是一个宝石,我能够恢复到另一个版本并避免崩溃。答案可能在堆栈跟踪中。
  • 原来我的问题实际上出在 rvm gemset 上。我只需要核对 gemset 并重新创建它 - 这解决了问题。

标签: ruby-on-rails ruby ruby-on-rails-3.1 installation ruby-1.9.3


【解决方案1】:

您可以尝试以下各种方法。

清理

清理旧版本的 gem:

gem cleanup --dryrun

json

要暂时查看 json gem 是否存在问题,请从 json(本机)切换到 json(纯 ruby​​)并更改您的 Gemfile:

gem install json_pure 

原生宝石

您的宝石列表中有一些对我来说是本地人:

  • bcrypt
  • bson
  • 厄鲁比斯
  • ffi(启用大量本机连接)
  • 小黄瓜
  • kgio
  • nokogiri
  • 雨滴
  • therubyracer(许多不可预知的问题恕我直言)
  • 独角兽

你的 gem ffi 特别有趣——你碰巧知道你在用它做什么吗?

ffi 允许 Ruby 代码调用本机代码,例如,如果您的 Ruby 应用程序的某些部分需要连接到本机库。

当你诊断你的问题时,我会先看看这个宝石。

制作文件

要查找任何具有 Makefile 文件的 gem,这很好地表明它们具有本机代码:

find / | grep "/ruby/gems/" | grep Makefile

要找到你所有的宝石以便你可以删除它们:

find / | grep "/ruby/gems/"

核弹RVM

要对 RVM 或其碎片进行核攻击,您可以使用 rvm uninstallrvm implode 或此脚本对 RVM 进行核攻击并找到任何挥之不去的碎片:

https://raw.github.com/SixArm/sixarm_unix_shell_scripts/master/rvm-uninstall-danger

试试 rbenv + bundler

我从使用 rvm 更改为使用 rbenv + bundler,它对我来说非常有用。

rbenv 工具是 rvm 管理 Ruby 版本的直接竞争对手: https://github.com/sstephenson/rbenv

Bundler 是管理 gemset 和 gem 依赖项的好方法: http://gembundler.com/

酿造

如果您在 Mac 上并使用 MacPorts,请更改为 Homebrew:

Link

【讨论】:

  • 这并没有真正解决问题,但我猜 nuking RVM 也会解决它(因为我的问题实际上是 gemset 不正确)
  • 去年试了rbenv + rbenv-gemset + rbenv-installer,严重坏了,社区也不支持。 github.com/jamis/rbenv-gemset/issues/17
  • @Barry 你说得对 rbenv-gemset ——它是 rbenv 的插件,恕我直言,不要使用它;相反,使用 rbenv + bundler。 Bundler 是管理 gemsets 的最佳选择,它与 rbenv、Rails 甚至构建独立的 ruby​​ 项目配合得很好。
  • @joelparkerhenderson Bundler 是坏蛋。在生产环境中与 GemFury 一起用于为 Mac、Windows 和 Linux 推出企业 Ruby(服务器)应用程序。
【解决方案2】:
  1. 通过运行以下命令卸载所有版本的 json gem: gem uninstall json

  2. 然后运行: gem install json --platform=ruby

  3. 再次运行包:bundle install

【讨论】:

    【解决方案3】:

    您应该尝试使用bundle 命令对您的所有 gem 进行核对并为您的应用重新安装它们。

    引用RVM documentation for this error

    尝试卸载并重新安装带有 C 扩展的 gem,您的应用程序使用这些 gem 来追捕这个 bug。

    remove gems with RVM 的命令很简单:

    rvm uninstall
    

    【讨论】:

    • 我试过了,仍然得到同样的错误——即使在删除了所有本地宝石之后。甚至克隆了我的存储库并从头开始 - 仍然是同样的问题。
    【解决方案4】:

    全新重新安装 RVM 最新版本是最佳选择。

    rvm implode

    rm -rf ~/.rvm

    curl -L get.rvm.io | bash -s stable

    【讨论】:

      【解决方案5】:

      在使用干净的 ruby​​/rvm 安装路径之前,您应该检查是否删除了 ruby​​ 1.8.7(在大多数发行版上默认安装)。我相信这会干扰我用 1.9.2 编译的一些 gem(我认为它是原生的之一)。我使用 apt-get 完全删除了 1.8.7,然后创建了一个新的 rvm 配置文件(通过更改 .rvmrc 中的配置文件名称),然后运行 ​​bundle install 以完全刷新所有 gem。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 1970-01-01
        相关资源
        最近更新 更多