升级到OS Sierra后,Rails会出现分段错误,可能与sqlite3 gem有关

时间:2016-10-02 00:15:38

标签: ruby-on-rails sqlite sqlite3-ruby ruby-2.3.1

升级到OSX Sierra后,我遇到了随机分段错误的问题。它最常出现在运行rails test时,我相信它是由于sqlite3_adapter。

我目前的工作是简单地退出终端并重新启动它。这适用于大约1或2个轨道测试,而第三个我几乎可以保证得到另一个分段故障。

是否有其他人遇到此问题或找到更好的解决方法?

$ rails t
Running via Spring preloader in process 13817
/Users/USER/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/sqlite3_adapter.rb:27: [BUG] Segmentation fault at 0x00000000000110
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]

修改

在深入研究sqlite3_adapter.rb之后,我发现导致分段错误的行是创建一个新的SQlite3数据库。

db = SQLite3::Database.new(
    config[:database].to_s,
    :results_as_hash => true
)

编辑2

我没有退出并重新启动终端,而是找到了运行:

spring stop

暂时停止问题。不是解决方案,而是更好的解决方案。

编辑3

这似乎是Apple提供的libsqlite3不是fork安全的问题。更多信息可以在这里找到:

https://github.com/sparklemotion/sqlite3-ruby/issues/195

现在,我在〜/ .bashrc文件的底部创建了一个别名:

alias ss='spring stop'

问题发生时,我现在可以输入:

ss

然后重新运行测试。

7 个答案:

答案 0 :(得分:8)

看起来已经发布了补丁!补丁将在brew文件夹中查找sql​​ite3,而不是默认使用Apple提供的版本。只需运行:

bundle update

获取最新版本的sqlite3-ruby,如果您的homebrew目录中尚未安装sqlite3,请运行:

brew install sqlite3

答案 1 :(得分:4)

升级到Sierra时遇到了同样的问题。一个简单的 bundle update 就可以了!希望这可以帮助。

答案 2 :(得分:2)

尝试重建sqlite3 gem。它具有原生扩展,并且在Sierra环境中重新编译它们可能会解决问题。

执行命令

gem pristine sqlite3

哪个应该输出如下:

Restoring gems to pristine condition...
Building native extensions.  This could take a while...
Restored sqlite3-1.3.10
Building native extensions.  This could take a while...
Restored sqlite3-1.3.11

答案 3 :(得分:2)

我注意到我在尝试运行rails console --sandbox时也遇到了段错误。我发现this other question似乎解决了这个问题;专门运行

xcode-select --install

好像解决了。这绝不是科学证明的,但我现在能够运行一个rails控制台和所有没有ruby段错误的测试。

答案 4 :(得分:0)

同样的问题w / Sierra。本页面上的所有内容都不适用于我,即gem pristine sqlite3xcode-select --installsqlite3; gem uninstall sqlite3; bundle update。我最终用rbenv uninstall 2.3.1完全卸载了Ruby版本,然后重新安装了它。这很有效。我不明白为什么。

答案 5 :(得分:0)

我遇到了同样的问题,我将sqlite3 gem升级到1.3.12并且它帮助了

答案 6 :(得分:0)

之前的所有解决方案都没有奏效,所以我已经采用这种方式修复:

gem uninstall sqlite3

brew install sqlite3

gem install sqlite3 -- --with-sqlite3-include=/usr/local/Cellar/sqlite/3.15.2/include --with-sqlite3-lib=/usr/local/Cellar/sqlite/3.15.2/lib

(检查你在Cellar的版本)

这是一个临时修复,如果更新捆绑包它会停止工作,你会再次这样做,但至少我可以在我的机器上工作