Ruby 2.7.7+pg-1.4.4连接PostgreSQL触发Segmentation fault错误求助
连接PostgreSQL触发Segmentation Fault的原因分析
问题背景
在以下环境中连接PostgreSQL时出现Segmentation fault at 0x0000000000000000错误:
- Ruby版本:2.7.7
- 系统:Ubuntu 22.04.1 LTS
- Rails版本:5.2.6.2
- 使用的pg gem版本:1.4.4
- 附加依赖:activerecord-postgis-adapter 5.2.3、ar-octopus 0.10.2
切换到Ruby 2.7.4时可正常建立连接,完整错误栈如下:
/home/vital/.rvm/gems/ruby-2.7.7/gems/pg-1.4.4/lib/pg/connection.rb:626: [BUG] Segmentation fault at 0x0000000000000000 ruby 2.7.7p221 (2022-11-24 revision 168ec2b1e5) [x86_64-linux] -- Control frame information ----------------------------------------------- c:0075 p:---- s:0448 e:000447 CFUNC :connect_poll c:0074 p:0551 s:0444 e:000443 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/pg-1.4.4/lib/pg/connection.rb:626 c:0073 p:0343 s:0431 e:000430 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/pg-1.4.4/lib/pg/connection.rb:759 c:0072 p:0007 s:0420 e:000419 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/pg-1.4.4/lib/pg/connection.rb:695 c:0071 p:0019 s:0414 e:000413 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/pg-1.4.4/lib/pg.rb:69 c:0070 p:0014 s:0408 e:000407 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-5.2.6.2/lib/active_record/connection_adapters/postgresql_adapter.rb:692 c:0069 p:0027 s:0403 e:000402 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-5.2.6.2/lib/active_record/connection_adapters/postgresql_adapter.rb:223 c:0068 p:0012 s:0395 e:000394 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-postgis-adapter-5.2.3/lib/active_record/connection_adapters/postgis_adapter. [FINISH] c:0067 p:---- s:0387 e:000386 CFUNC :new c:0066 p:0110 s:0379 e:000378 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-postgis-adapter-5.2.3/lib/active_record/connection_adapters/postgis/create_c c:0065 p:0021 s:0372 e:000371 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-5.2.6.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:83 c:0064 p:0021 s:0368 e:000367 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-5.2.6.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:87 c:0063 p:0014 s:0364 e:000363 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-5.2.6.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:85 c:0062 p:0012 s:0358 e:000357 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-5.2.6.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:81 c:0061 p:0011 s:0352 e:000350 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-5.2.6.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:53 c:0060 p:0021 s:0346 e:000342 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-5.2.6.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:38 c:0059 p:0047 s:0339 e:000338 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-5.2.6.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:10 c:0058 p:0008 s:0333 e:000332 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-5.2.6.2/lib/active_record/connection_handling.rb:118 c:0057 p:0003 s:0329 e:000328 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord-5.2.6.2/lib/active_record/connection_handling.rb:90 c:0056 p:0008 s:0325 e:000324 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/ar-octopus-0.10.2/lib/octopus/model.rb:159 c:0055 p:0003 s:0321 e:000320 METHOD /home/vital/.rvm/gems/ruby-2.7.7/gems/activerecord- -- C level backtrace information ------------------------------------------- /home/vital/.rvm/rubies/ruby-2.7.7/lib/libruby.so.2.7(rb_vm_bugreport+0x4ae) [0x7f98fa0cfeae] /home/vital/.rvm/rubies/ruby-2.7.7/lib/libruby.so.2.7(rb_bug_for_fatal_signal+0xeb) [0x7f98f9f3c16b] /home/vital/.rvm/rubies/ruby-2.7.7/lib/libruby.so.2.7(sigsegv+0x4d) [0x7f98fa04b07d] /ruby-2.7.7/lib/libruby.so.2.7(rb_nogvl+0x97) [0x7f98fa0845a7] [0x7f98f590533c] [0x7f98f590da2a] /home/vital/.rvm/rubies/ruby-2.7.7/lib/libruby.so.2.7(vm_call_cfunc+0x126) [0x7f98fa0aef66] ... 7f98fa1f8000-7f98fa1fa000 r--p 00000000 103:02 2230375 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 7ffdc5a6c000-7ffdc5a70000 r--p 00000000 00:00 0 [vvar] 7ffdc5a70000-7ffdc5a72000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]
错误原因
- Ruby 2.7.7与pg gem 1.4.4的兼容性问题:Ruby 2.7.7对底层C扩展的调用逻辑做了细微调整,而pg 1.4.4的C扩展代码未适配该变化,导致调用
connect_poll时出现空指针引用,触发段错误。 - 系统库依赖不匹配:Ubuntu 22.04自带的libpq库版本,与Ruby 2.7.7编译时依赖的库版本存在兼容性差异;而Ruby 2.7.4编译时依赖的库版本更适配当前系统的libpq,因此未出现问题。
- PostGIS适配器的适配缺失:当前使用的activerecord-postgis-adapter 5.2.3未针对Ruby 2.7.7做适配,在创建数据库连接时传递了错误参数或调用了未正确初始化的方法,间接引发pg gem的段错误。
内容的提问来源于stack exchange,提问作者Vital
相关产品推荐
相关产品推荐

