rspec上的Ruby分段错误

sam*_*452 5 ruby rspec-rails ruby-on-rails-3

这真的很奇怪.我在这个Rails 3.2.11应用程序中做得很好,之前运行了rspec这是我创建了一个新的分支,更改了一个文件,已经提交,并且当我遇到大量的Segmentation错误和堆栈跟踪时,运行了rspec spec /正如我所见.

我已经更新了rvm并尝试安装早期版本的ruby 1.9.3.我一直挂在原始宝石上,并通过重新启动来保护.重新启动OS X 10.8.3后,我能够干净地安装ruby 1.9.3-p429.但是rspec仍然保释.完整的堆栈跟踪是https://gist.github.com/sam452/5808849.因为它们被清理干净,所以我已经捆绑了宝石.我还尝试再次运行rspec生成器,但它似乎只覆盖了一个支持文件.铁路,耙子,黄瓜似乎运行正常.Rake在进入rspec命令时失败.

我试图从堆栈跟踪中提取看似相关的部分:

    Happenstance:tickat sam$ rspec spec/
/Users/sam/.rvm/gems/ruby-1.9.3-p429/gems/better_errors-0.8.0/lib/better_errors/core_ext/exception.rb:9: [BUG] Segmentation fault
ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-darwin12.3.0]
Run Code Online (Sandbox Code Playgroud)

控制帧信息

c:0064 p:---- s:0204 b:0204 l:000203 d:000203 CFUNC  :callers
c:0063 p:0064 s:0201 b:0201 l:000290 d:0026c0 LAMBDA /Users/sam/.rvm/gems/ruby-1.9.3-p429/gems/better_errors-0.8.0/lib/better_errors/core_ext/exception.rb:9
c:0062 p:---- s:0198 b:0198 l:000197 d:000197 FINISH
Run Code Online (Sandbox Code Playgroud)

Ruby级别回溯信息

/Users/sam/.rvm/gems/ruby-1.9.3-p429/gems/rspec-core-2.13.1/lib/rspec/core/runner.rb:17:in `block in autorun'
/Users/sam/.rvm/gems/ruby-1.9.3-p429/gems/rspec-core-2.13.1/lib/rspec/core/runner.rb:80:in `run'
/Users/sam/.rvm/gems/ruby-1.9.3-p429/gems/rspec-core-2.13.1/lib/rspec/core/command_line.rb:22:in `run'
/Users/sam/.rvm/gems/ruby-1.9.3-p429/gems/rspec-core-2.13.1/lib/rspec/core/configuration.rb:819:in `load_spec_files'
/Users/sam/.rvm/gems/ruby-1.9.3-p429/gems/rspec-core-2.13.1/lib/rspec/core/configuration.rb:819:in `each'
/Users/sam/.rvm/gems/ruby-1.9.3-p429/gems/rspec-core-2.13.1/lib/rspec/core/configuration.rb:819:in `block in load_spec_files'
/Users/sam/.rvm/gems/ruby-1.9.3-p429/gems/rspec-core-2.13.1/lib/rspec/core/configuration.rb:819:in `load'
/Users/sam/apps/tickat/spec/controllers/admin/events_controller_spec.rb:1:in `<top (required)>'
Run Code Online (Sandbox Code Playgroud)

C级回溯信息

   See Crash Report log file under ~/Library/Logs/CrashReporter or
   /Library/Logs/CrashReporter, for the more detail of.
Run Code Online (Sandbox Code Playgroud)

其他运行时信息

* Loaded script: /Users/sam/.rvm/gems/ruby-1.9.3-p429/bin/rspec
* Loaded features:
    0 enumerator.so
    1 /Users/sam/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/x86_64-darwin12.3.0/enc/encdb.bundle
    2 /Users/sam/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/x86_64-darwin12.3.0/enc/trans/transdb.bundle
    3 /Users/sam/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/site_ruby/1.9.1/rubygems/defaults.rb
Run Code Online (Sandbox Code Playgroud)

一直到2030行.

0x4*_*672 18

Rspec在某些情况下会导致分段错误,例如,如果您使用let!递归方式定义变量.这可以vm_call_cfunc - cfp consistency error在RSpec核心中产生一个Ruby Crash Report和aSegmentation fault: 11

let!(:some_var) { "Some value" }

describe '.method' do
  ...
  let!(:some_var) { create(:model, some_var: some_var) }
end
Run Code Online (Sandbox Code Playgroud)

  • 我遇到的另一个案例是意外地在它自己的`let`块中存根一个对象.例如`let(:obj){create:obj; 允许(obj).接收(:thing)}`.这是一个无限循环. (2认同)

kak*_*bei 4

确保从 Gemfile 中的测试组中删除better_errors并可能删除binding_of_caller,这就是导致错误的原因。如果您查看报告分段错误的行,就会发现它better_errors正在报告:

.../better_errors/core_ext/exception.rb:9: [BUG] Segmentation fault 
Run Code Online (Sandbox Code Playgroud)

所以你的 Gemfile 应该是这样的:

group :development do
  gem 'better_errors'
  gem 'binding_of_caller'
end

# for testing to work with rspec
group :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'ffaker'
  gem 'capybara'
  gem 'database_cleaner'
  gem 'launchy'
end
Run Code Online (Sandbox Code Playgroud)