Rails6でセグメンテーションエラーが発生する問題を解決した

目次

概要

WebアプリケーションをRuby on Rails(Rails)を使って作成しているのですが、ある時実行中にセグメンテーションエラーが発生するようになりました。

ここでは、私が遭遇したセグメンテーションエラーの解決方法について紹介します。

環境

  • Rails 6.0.2

内容

私がセグメンテーションエラーを発見したのは、CIでのテストの実行をしたときでした。 手元の開発環境では発生してはいなかったので、なぜ発生したのか、どのようなときに発生するのかが分からずかなり苦労しました。

セグメンテーションエラーの発生時には次のようなログが出力されていました。

…/usr/local/bundle/gems/sassc-2.2.1/lib/sassc/engine.rb:42: [BUG] Segmentation fault at 0x0000000000000000

見たところ、sasscでエラーが発生しているようです。

解決方法

エラーメッセージで色々と調べてみると、そもそもRails 6.0において、標準で使われるようになったSprocketsのあたりが怪しいということのようです。 また、Rails 6.0ではSprocketsの関係で、assetsのコンパイルが並列で行われるということのようで、これが悪さをしている可能性があるということのです。

ソースはここです。

url helpers aren’t thread safe · Issue #581 · rails/sprockets

そこで、並列で実行しないようにしました。 その設定は、config/initializers/assets.rbに記述します。 次の内容を記述します。

Rails.application.config.assets.configure do |env|
  env.export_concurrent = false
end

私の場合はこれでセグメンテーションエラーが解決しました。

さいごに

今回の対応は、あまりいい対応ではありません。

gemの方では、この記事の執筆時点で対応中ということのようなので、気長に対応されるまで待ちたいと思います。