5

这是一个关于在使用 Ruby 和 Rails 遇到堆栈级别太深(SystemStackError)时我应该使用什么调试策略的问题。

我在使用 rspec 或 cucumber 时看到这些错误

perrys-MacBook-Pro:pc perry_mac$ cucumber
stack level too deep (SystemStackError)
/Users/perry_mac/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:240  

perrys-MacBook-Pro:pc perry_mac$ rspec
/Users/perry_mac/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:240: stack level too deep (SystemStackError)
perrys-MacBook-Pro:pc perry_mac$ 

我怀疑我在这里介绍的问题与 rspec 和 cucumber 无关。我不确定如何缩小问题范围。接下来我应该尝试什么?

我已经尝试过bundle update,运行良好。

该应用程序在 下运行良好rails s,但我想利用我编写的 rspec 和 cucumber 测试。

附录:

我通过最简单的测试看到了这一点,例如:

perrys-MacBook-Pro:pc perry_mac$ cat ./spec/controllers/page_controller_spec.rb
require 'spec_helper'

describe PageController do

end
perrys-MacBook-Pro:pc perry_mac$ rspec ./spec/controllers/page_controller_spec.rb
/Users/perry_mac/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:240: stack level too deep (SystemStackError)
perrys-MacBook-Pro:pc perry_mac$ 

附录 2:spec_helper 的 pastebin 在这里:http ://pastebin.com/ePdGyHQh

附录 3:Gemfile 的 pastebin 在这里:http ://pastebin.com/xkLYGjsY

附录 4:我已经确定这是 spec_helper.rb 中导致错误的行

require File.expand_path("../../config/environment", __FILE__)

如果我在该行之前放置了一个故意的语法错误,我会得到一个“语法错误”如果我在该行之后放置相同的语法错误,我会得到一个“堆栈太深错误”。

似乎有些进步。应该require File.expand_path("../../config/environment", __FILE__)写成别的吗?

附录 5:我将此添加到 spec_helper.rb:

puts File.path("../../config/environment") 
puts __FILE__
require File.expand_path("../../config/environment", __FILE__)

现在看到这个:

perrys-MacBook-Pro:pc perry_mac$ rspec ./spec/controllers/page_controller_spec.rb
../../config/environment
/Users/perry_mac/rails_projects/pc/spec/spec_helper.rb
/Users/perry_mac/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:240: stack level too deep (SystemStackError)
perrys-MacBook-Pro:pc perry_mac$ 

...但我不确定基于输出的含义。

附录 6:
使用 pry,我逐步完成了代码。失败前的输出 pastebin 在这里:http ://pastebin.com/c6ZfPmVn 这有帮助还是我应该包含其他内容?看起来执行一直持续到这一点:

/Users/perry_mac/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.13.1/lib/rspec/core.rb @ line 69 RSpec.reset

附录 7:我刚刚确认我可以签出具有工作 rspec 和 cucumber 的旧 git 分支。有一个工作分支可以帮助我以任何方式调试最近损坏的分支吗?

附录 8:根据 Pry 执行跟踪,错误在调用 Rspec.reset 后立即发生

4

4 回答 4

1

我发现原因使用

git bisect

git show [commitID]

我能够回顾我的提交日志并找到一个工作版本。然后,使用git bisect 此处的说明,我能够找到引入堆栈太深错误的提交。然后,我曾经git show [commitID]看到两行可能受到指责的代码行。他们是:

# file:app/controllers/thisControllerFileIhave.rb

require 'dicom'
include DICOM

进行此更改似乎已经解决了问题:

require 'dicom'
#include DICOM

老实说,我不记得为什么我添加了“包含 DICOM”(提交于 2012 年 10 月),也不明白为什么或如何导致 rspec 和 cucumber 如此壮观和神秘地失败。我也不明白如何rails s使用此代码运行应用程序,但测试套件却没有。我会感谢提出建议的发帖人git bisect,但他们的评论似乎已被删除。

我为这个问题得到的大多数答案和评论并没有直接解决调试策略,而是他们提供了作者何时看到并更正此类错误的第一手资料。我很高兴能遇到git bisectgit show而且我觉得它们是查明此类问题根源的真正有力选择。

于 2013-05-19T19:30:29.800 回答
0

我最好的选择是您在 confign/environment 中的一个文件需要规范助手本身。

假设文件 A 有这一行

require File.expand_path("../../config/environment", __FILE__)

文件B说

require 'A.rb'

我相信这会引入无限循环/堆栈错误。

于 2013-05-14T03:54:56.013 回答
0

堆栈级别太深的错误通常指向无限递归调用。尝试逐步缩小你的测试套装。你可以只用虚拟测试来运行 rspec 和 cucumber 吗?如果是,则查找导致错误的测试,如果不是,则检查您的测试环境设置、rspec 和 cucumber 设置以及初始化文件。

此外,此错误通常是由错误的包含/要求引起的。看看您在测试中包含的内容。

于 2013-05-12T23:49:36.497 回答
0

检查您的 Rails 应用程序以获取load方法。我认为您有多种load方法会尝试多次加载同一个文件。

于 2013-05-18T11:42:03.160 回答