Techioz Blog

Ruby 2.6.5 および PostgreSQL の pg-gem セグメンテーション フォールト

概要

コンソールからはデータベースに触れる操作を行うことができません。セグメンテーション違反が発生します。

.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/pg-1.1.4/lib/pg.rb:56: [BUG] 0x0000000000000110 でのセグメンテーション違反 Ruby 2.6.5p114 (2019-10-01 リビジョン 67812) [x86_64-darwin18]

これは文字通り、MyModel.new を含む、データベースを必要とする可能性のあるあらゆる操作です。

– コントロールフレーム情報 ————————————– – c:0071 p:—- s:0406 e:000405 CFUNC :初期化 c:0070 p:—- s:0403 e:000402 CFUNC :新規 c:0069 p:0016 s:0398 e:000397 メソッド /Users/xxx/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/pg-1.1.4/lib/pg.rb :56 c:0068 p:0107 s:0393 e:000392 メソッド /Users/xxx/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters /postgres

pg gemをアンインストールして再インストールしました。そしてデータベースを再構築しました。そしてPostgreSQLを再起動しました。

Puma で実行しているときに他の人が問題を報告しているのを見たことがありますが、私の構成は Puma では機能しますが、コンソールでは失敗します。

わかりやすくするために編集します:

はい、バンドラーを使用します。

Rails c または Bundle exec Rails c を使用して Rails コンソールを起動すると、同じスタック トレースで同じ効果 (セグメンテーション違反) が発生します。

Gemfile.lock には pg (1.1.4) があります

バンドルパスを指定して再バンドルしました。スタック トレースにはそのバンドル パスが含まれるようになったので、デフォルトでバンドラーは rbenv パスを使用していたと思います。

解決策

質問のコメントセクションにリンクされているhttps://github.com/ged/ruby-pg/issues/291に従って、gssencmode: disableをdatabase.ymlに追加すると、セグメンテーションフォールトが停止します。他の環境では OS X を使用しないため、開発およびテスト環境のオプションのみに追加しました。

default: &default
  adapter: postgresql

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

gssencmode は Postgresql 12 で追加されました。

根本的なバグはここで追跡されています https://www.postgresql.org/message-id/93f7379b-2e2f-db0c-980e-07ebd5de92ff%40crunchydata.com