无法安装Elixir应用依赖:执行mix deps.get触发Segmentation fault:11
mix deps.get Segmentation Fault:11的方法 我之前在OSX环境下也碰到过类似的段错误问题,结合你的场景(移除依赖后可正常运行),大概率是旧版本依赖与当前Erlang/Elixir版本或系统环境不兼容导致的,给你几个按优先级排序的排查方向:
1. 先确认版本兼容性问题
你的Elixir指定的是~>1.3,而依赖的poison: "~>1.3"是2015年的旧版本,它仅兼容Erlang/OTP 17-19系列。如果你的Erlang版本是OTP 20及以上,就会出现底层API不兼容的情况,触发内存段错误。
先运行命令查看当前Erlang版本:
elixir -v
如果Erlang版本是OTP 20+,更推荐升级Poison版本(而非降级Erlang),因为新版本依赖会修复更多兼容性问题。
2. 升级Poison到兼容版本
Elixir 1.3完全支持Poison 3.x系列(最低兼容Elixir 1.2),把mix.exs里的依赖配置修改为:
defp deps do [{:poison, "~> 3.0"}] end
然后执行以下命令清理旧缓存并重新安装:
mix clean rm -rf deps _build mix deps.get
旧版本Poison可能使用了Erlang新版本已移除的底层特性,或与OSX 10.13的系统库存在冲突,升级后基本能解决问题。
3. 彻底清理Mix缓存与构建产物
如果升级依赖后仍报错,可能是缓存的损坏文件导致的,执行以下命令彻底清理:
mix clean --all rm -rf ~/.mix/archives rm -rf deps _build
之后重新执行mix deps.get && mix compile,重新生成所有依赖和构建文件。
4. 重新安装Erlang(针对Homebrew安装的情况)
如果你的Erlang是通过Homebrew安装的,可能存在编译时的系统适配问题,重新安装Erlang确保它是针对当前OSX版本编译的:
brew uninstall erlang brew install erlang
安装完成后再尝试执行mix deps.get。
5. 限制Erlang异步线程池(备选方案)
极少数情况下,Erlang的异步线程池会和OSX的系统线程机制冲突,尝试关闭异步线程池再执行命令:
iex --erl "+A 0" -S mix deps.get
如果这个命令能正常执行,说明是线程池相关的冲突,可以后续在项目配置里调整Erlang参数。
内容的提问来源于stack exchange,提问作者paul h

