Межпоточное нарушение в rb_gc()

Кодовая база, над которой я работаю, недавно была обновлена ​​с Ruby 1.9.2 до Ruby 1.9.3 и с Rails 3.1 до Rails 3.2.2. Поскольку я использую RVM, я просто сделал rvm install 1.9.3, и я ожидал, что это все, что было необходимо.

Когда я бегу

rails s

я получаю ошибку

[ОШИБКА] нарушение межпоточности на rb_gc()

Я нашел несколько ссылок, касающихся этой проблемы. На StackOverflow есть один, но на самом деле он не дает отвечать. Самый многообещающий ответ — на сайте RVM:

В каждом случае, который я видел до сих пор, это всегда заканчивалось тем, что ruby ​​gem/библиотека с расширениями C была скомпилирована для другого ruby ​​​​и/или архитектуры, отличной от той, которая пытается его загрузить. Попробуйте удалить и переустановить драгоценные камни с расширениями C, которые ваше приложение использует для поиска этого багара.

Это довольно полезно, но мой Ruby-fu недостаточно силен, чтобы знать, какие гемы имеют расширения C, а какие я должен попытаться переустановить. Многие другие ссылки по этой теме, кажется, предполагают, что виноват json gem, поэтому я попытался следовать предложенному решению.

gem uninstall json 
gem install --platform=ruby

Для меня это ничего не изменило — я по-прежнему получаю точно такую ​​же ошибку при попытке запустить среду Rails.

Как отследить эту проблему?

Если это поможет, вот вывод из списка драгоценных камней:

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)

person Jaco Pretorius    schedule 16.04.2012    source источник
comment
я знаю, что трассировка стека от ruby ​​огромна, но можете ли вы найти место, где он упал, и опубликовать соответствующую часть? Я столкнулся с подобным сбоем в ruby, и это была жемчужина, благодаря которой я смог вернуться к другой версии и избежать сбоя. Ответ может быть в трассировке стека.   -  person edk750    schedule 21.04.2012
comment
Оказывается, моя проблема была на самом деле с гемсетом rvm. Мне просто нужно было уничтожить набор драгоценных камней и воссоздать его — это решило проблему.   -  person Jaco Pretorius    schedule 24.04.2012


Ответы (5)


Вот различные подходы, которые вы можете попробовать.

уборка

Чтобы очистить старые версии ваших драгоценных камней:

gem cleanup --dryrun

json

Чтобы временно проверить, не является ли проблема json gem, переключитесь с json (нативный) на json (чистый ruby) и измените свой Gemfile:

gem install json_pure 

самоцветы

В вашем списке драгоценных камней есть несколько, которые кажутся мне родными:

  • bcrypt
  • бсон
  • эрубис
  • ffi (обеспечивает множество собственных подключений)
  • корнишон
  • кгио
  • меньше
  • нокогири
  • капли дождя
  • therubyracer (много непредсказуемых проблем ИМХО)
  • единорог

ффи

Ваш драгоценный камень ffi особенно интересен — вы случайно не знаете, что вы с ним делаете?

ffi позволяет коду Ruby вызывать собственный код, например, если какой-то части вашего приложения Ruby необходимо подключиться к собственным библиотекам.

Когда вы диагностируете свою проблему, я бы сначала посмотрел на этот драгоценный камень.

make-файлы

Чтобы найти любой из ваших гемов, у которых есть файлы Makefile, что является хорошим показателем того, что у них есть собственный код:

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

Чтобы найти все свои драгоценные камни и удалить их:

find / | grep "/ruby/gems/"

ядерная бомба РВМ

Чтобы уничтожить RVM или его части, вы можете использовать rvm uninstall, rvm implode или этот скрипт, который уничтожает RVM и находит все оставшиеся части:

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

попробуй rbenv + упаковщик

Я перешел с использования rvm на использование rbenv + bundler, и он отлично работает для меня.

Инструмент rbenv является прямым конкурентом rvm для управления версиями Ruby: https://github.com/sstephenson/rbenv

Bundler — отличный способ управлять гемсетами и зависимостями гемов: http://gembundler.com/

заваривать

Если вы работаете на Mac и используете MacPorts, чтобы перейти на Homebrew:

http://mxcl.github.com/homebrew/

person joelparkerhenderson    schedule 22.04.2012
comment
На самом деле это не решило проблему, но я думаю, что сброс RVM также исправил бы ее (поскольку моя проблема на самом деле заключалась в неправильном наборе драгоценных камней) - person Jaco Pretorius; 24.04.2012
comment
Попытка rbenv + rbenv-gemset + rbenv-installer в прошлом году была серьезно нарушена, и сообщество не отреагировало на это. github.com/jamis/rbenv-gemset/issues/17 - person ; 24.04.2012
comment
@Barry Вы правы насчет rbenv-gemset - это плагин к rbenv, и ИМХО не используйте его; вместо этого используйте rbenv + упаковщик. Bundler — лучший инструмент для управления гемсетами, он прекрасно работает с rbenv, Rails и даже с созданием отдельных проектов на Ruby. - person joelparkerhenderson; 24.04.2012
comment
@joelparkerhenderson Бандлер крутой. Используется в производстве вместе с GemFury для развертывания корпоративного приложения Ruby (серверного) для Mac, Windows и Linux. - person ; 26.04.2012

  1. Удалите все версии json gems, запустив: gem uninstall json

  2. Затем запустите: gem install json --platform=ruby

  3. Запустить пакет еще раз:bundle install

person Johnny Woo    schedule 03.04.2013

Вам следует попробовать уничтожить все ваши драгоценные камни и переустановить их для своего приложения с помощью команды bundle.

Цитируя документацию RVM по этой ошибке:

Попробуйте удалить и переустановить драгоценные камни с расширениями C, которые ваше приложение использует для поиска этого багара.

Команда для удаления драгоценных камней с помощью RVM проста:

rvm uninstall
person hagope    schedule 19.04.2012
comment
Я пробовал это, все еще получая ту же ошибку - даже после удаления ВСЕХ локальных драгоценных камней. Даже клонировал мой репозиторий и начал с нуля - все та же проблема. - person Jaco Pretorius; 19.04.2012

Чистая переустановка последней версии RVM — лучший вариант.

rvm implode

rm -rf ~/.rvm

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

person Community    schedule 24.04.2012

Прежде чем перейти к чистой установке ruby/rvm, вы должны проверить, удалили ли вы ruby ​​1.8.7 (который устанавливается по умолчанию в большинстве дистрибутивов). Я полагаю, что это мешало некоторым моим драгоценным камням, скомпилированным с 1.9.2 (думаю, это был один из нативных). Я полностью удалил 1.8.7 с помощью apt-get, затем создал новый профиль rvm (изменив имя профиля в .rvmrc), а затем запустил установку пакета, чтобы полностью обновить все драгоценные камни.

person RonanOD    schedule 24.04.2012