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

Posted

技术标签:

【中文标题】升级到 OS Sierra 后 Rails 出现分段错误,可能与 sqlite3 gem 有关【英文标题】:Segmentation fault with Rails after upgrading to OS Sierra, possibly related to sqlite3 gem 【发布时间】:2017-02-10 06:46:54 【问题描述】:

升级到 OSX Sierra 后,我遇到了随机分段错误的问题。它最常发生在运行 rails 测试时,我相信这是由于 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

然后重新运行测试。

【问题讨论】:

【参考方案1】:

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

bundle update

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

brew install sqlite3

【讨论】:

这对我有用。如果您收到“此公式仅用于小桶,这意味着它没有符号链接到 /usr/local”消息,我会忽略它而没有问题。 快速说明一下,这是对我有用的命令的确切顺序:brew install sqlite3; gem uninstall sqlite3; bundle update 我无法让它为我工作。我已经运行了几次以及gem pristine sqlite3,但仍然没有任何效果。我正在运行 ruby​​ 2.3.3。还有什么我可以做的吗? 你安装了自制软件吗?运行 brew list 会看到什么【参考方案2】:

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

【讨论】:

这暂时有效,但看起来问题又回来了。 :( @Hutch 同样的事情发生在这里。 它帮助了我,macOS Sierra【参考方案3】:

尝试重建 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

【讨论】:

那没有做到。我也尝试卸载并重新安装 sqlite3 gem。没有运气。 这是从 Homebrew 安装 sqlite3 后所需的最后一步。【参考方案4】:

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

xcode-select --install

似乎解决了它。这还没有经过科学证明,但是我现在能够运行 rails 控制台和所有测试,而不会出现 ruby​​ 段错误。

【讨论】:

试过了,我只是得到它们已经安装了。感谢您的建议!【参考方案5】:

与 Sierra 有同样的问题。此页面上的所有内容都不适合我,即gem pristine sqlite3xcode-select --installsqlite3; gem uninstall sqlite3; bundle update。我最终用rbenv uninstall 2.3.1 完全卸载了Ruby 版本,然后重新安装了它。这行得通。我不知道为什么。

【讨论】:

【参考方案6】:

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

【讨论】:

编辑gem文件后,需要运行bundle install【参考方案7】:

以前的所有解决方案都不起作用,所以我已经修复了这个方法:

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

(检查您在地窖中的版本)

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

【讨论】:

以上是关于升级到 OS Sierra 后 Rails 出现分段错误,可能与 sqlite3 gem 有关的主要内容,如果未能解决你的问题,请参考以下文章

macmac os X更新High Sierra后出现的问题

在我的 Mac OS Sierra 构建主机上管理配置文件

MacOS Sierra升级问题小记

为啥mac升级之后,升级成mac OS Sierra 10.12.1,我的parallels Desktop就启动不了,需要重新安装吗?

升级 macOS Sierra 后 apache 无法正常工作

升级到 macOS 10.12 (Sierra) 后,使用 Capistrano 部署代码时出现问题,“权限被拒绝(公钥)”。