patorashのブログ

方向性はまだない

Macでrails起動時に発生したセグメンテーション違反の原因がわかった

過去に、こんな記事を書いていました。

patorash.hatenablog.com

ずっと騙し騙し、gemの再インストールをしながら使っていたのですが、いよいよresqueがまともに動かないときが頻発したので、ちゃんと調査を開始。

ちなみにこの記事を書いている時点での私のPCの環境は以下の通り。

環境 バージョン
OS Mac OS X Mojave(10.14.6)
Ruby 2.6.3(rbenvでインストール)
PostgreSQL 11.x(Dockerで起動)

PostgreSQLとの接続を疑う

過去の経緯から、PostgreSQLの接続が怪しいのかなと思っていたら、こんなStack Overflowの投稿を発見。

stackoverflow.com

回答から抜粋すると、以下のような設定(gssencmode: disable)をdatabase.ymlのdevelopmentとtestに追加したらいい、とあった。

default: &default
  adapter: postgresql

development:
  <<: *default
  gssencmode: disable
test:
  <<: *default
  gssencmode: disable

これは、PostgreSQL 12から追加されたオプションらしい。OS Xだとこれの指定がないとエラーになることがあるとか…。

とりあえず設定はしておいたが、PostgreSQLへの接続はうまくいくときといかない時があったので、設定して様子見をしておく…。

Redisへの接続で落ちる

とりあえず、これで直ったんじゃないか?と思い、heroku localコマンドでpumaとresqueを起動させたところ、ActiveJobの処理が動いたらセグメンテーション違反が発生。今度はエラーメッセージが変わった。

13:18:43 resque.1   |  /Users/****/.anyenv/envs/rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/redis-4.1.3/lib/redis/connection/ruby.rb:210: [BUG] Segmentation fault at 0x000000010cb14a3a
13:18:43 resque.1   |  ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin18]
13:18:43 resque.1   |  -- Crash Report log information --------------------------------------------
13:18:43 resque.1   |     See Crash Report log file under the one of following:
13:18:43 resque.1   |       * ~/Library/Logs/DiagnosticReports
13:18:43 resque.1   |       * /Library/Logs/DiagnosticReports
13:18:43 resque.1   |     for more details.
13:18:43 resque.1   |  Don't forget to include the above Crash Report log file in bug reports.
13:18:43 resque.1   |  -- Control frame information -----------------------------------------------
13:18:43 resque.1   |  c:0055 p:---- s:0289 e:000288 CFUNC  :getaddrinfo
13:18:43 resque.1   |  c:0054 p:0034 s:0281 e:000280 METHOD /Users/****/.anyenv/envs/rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/redis-4.1.3/lib/redis/connection/ruby.rb:210

今度はRedisに接続できなくなっている…。エラーメッセージでググったら、Rubyのバグレポートを発見。

bugs.ruby-lang.org

Third Party Issueになっていて、RubyじゃなくてMacのgetaddrinfoのバグのせいらしいことを把握。

同様に色々検索してみたのだが、やはりOS Xのgetaddrinfo由来のバグである、というバグレポートがヒットする。

bugs.ruby-lang.org

直す方法が掲示されていないのだが、RubyやGemをコンパイルする時点でバグっていそうだなと思った。

直すためにやったこと

  1. brew upgradeで、gccとかを更新すれば直るんじゃないか?と思い、雑にbrew upgradeを実行。
  2. Rubyを再インストールすれば直るんじゃないか?と思い、雑にrbenv install -f 2.6.3を実行(ここは任意のバージョンを)
  3. gemを全て再インストールすれば(略)と思い、全てのgemを削除。gemを全削除するのはここを参考にした。 qiita.com
  4. bundle installを実行

動作確認

heroku local でpumaとresqueを起動させて、ActiveJobの処理を動かしてみたところ、問題なく動いた。また、頻発していたpgのセグメンテーション違反も起きなくなったので、これで解決かもしれない…!!