升级到macOS Sierra后,使用Rails出现段错误,可能与sqlite3 gem有关。

24
升级到OSX Sierra后,我遇到了随机分段错误的问题。这种情况最常见于运行rails测试时,我认为是由于sqlite3_adapter引起的。
我的现有解决方法是简单地退出终端并重新启动它。这对于大约1或2个rails测试有效,但到第三个测试时,我几乎可以保证会再次出现分段错误。
是否还有其他人遇到这个问题或找到更好的解决方法?
$ 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个回答

8

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

bundle update

要获取最新版本的sqlite3-ruby,并且如果您的homebrew目录中没有安装sqlite3,请运行以下命令:
brew install sqlite3

这对我有用。如果你收到“此公式仅限于桶装,这意味着它未链接到/ usr / local”的消息,则可以忽略它而不会出现问题。 - ObjectNameDisplay
2
这只是一个快速的提示,告诉你这是我使用的确切命令序列:brew install sqlite3; gem uninstall sqlite3; bundle update - Petros
我无法让它为我工作。我已经运行了几次,以及gem pristine sqlite3,但仍然没有任何作用。我正在运行ruby 2.3.3。还有其他我可以做的吗? - HighHopes
你是否已经安装了Homebrew?当你运行"brew list"时,你看到了什么? - Hutch

4

当我升级到Sierra时,我遇到了同样的问题。简单的bundle update就可以解决问题!希望这能帮到你。


1
这个方法暂时起作用了,但看起来问题又出现了。:( - Hutch
@Hutch 这里也发生了同样的事情。 - Michael McKenna
它帮助了我,macOS Sierra。 - Dmitrii Korchemkin

2
我注意到当我尝试运行rails console --sandbox时,也会出现段错误。我发现这个其他问题似乎可以解决这个问题;具体来说是运行:
xcode-select --install

似乎已经解决了这个问题。但是这并没有经过科学证明,我现在能够运行rails console和所有测试,而不会出现Ruby段错误。


尝试过了,但是我只得到它们已经安装的信息。感谢您的建议! - Hutch

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

1
那没用。我也尝试卸载并重新安装sqlite3 gem,但没有成功。 - Hutch
在使用Homebrew安装了sqlite3之后,这是所需的最后一步。 - Koraktor

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 中安装的版本)

这只是一个临时解决办法,如果更新bundle,则可能会停止工作并需要再次执行此操作,但至少我可以在我的电脑上工作。


0

遇到了与Sierra相同的问题。这个页面上的所有方法都对我无效,例如gem pristine sqlite3xcode-select --installsqlite3; gem uninstall sqlite3; bundle update。最终我完全卸载了Ruby版本,使用rbenv uninstall 2.3.1,然后重新安装它。这样就解决了问题。我不知道为什么。


0

我遇到了同样的问题,我将sqlite3 gem升级到1.3.12版本,问题得到了解决。


编辑完 gem 文件后,需要运行 bundle install。 - Aigul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接