You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:10:41