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 とキュウリの両方に依存していないと思われます。問題を絞り込む方法がわかりません。次に何を試せばいいですか?

私はすでに試しbundle updateましたが、うまくいきました。

アプリは で正常に動作rails sしますが、私が書いた rspec とキュウリのテストを利用したいと思います。

補遺:

たとえば、最も単純なテストでこれを確認します。

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 のペーストビンはこちら: http://pastebin.com/ePdGyHQh

補遺 3: Gemfile のペーストビンはこちら: 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
を使用して、コードをステップ実行しました。失敗する直前の出力のペーストビンは次のとおりです : 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 とキュウリが動作する古い git ブランチをチェックアウトできることを確認しました。作業ブランチを持つことで、最近の壊れたブランチを何らかの方法でデバッグするのに役立ちますか?

補遺 8: Pry の実行トレースによると、エラーは Rspec.reset の呼び出しの直後に発生します

4

4 に答える 4

1

を使用して原因を見つけました

git bisect

git show [commitID]

コミットのログをさかのぼって、動作するバージョンを見つけることができました。git bisect 次に、 hereの手順を使用して、スタックが深すぎるエラーを導入したコミットを見つけることができました。その後、git show [commitID]原因となる可能性のある 2 つのコード行を確認していました。彼らはいた:

# file:app/controllers/thisControllerFileIhave.rb

require 'dicom'
include DICOM

この変更を行うと、問題が修正されたようです。

require 'dicom'
#include DICOM

正直なところ、なぜ 'include DICOM' を追加したのか思い出せません (コミットは 2012 年 10 月でした)。rails sまた、このコードでアプリを実行する方法もわかりませんが、テストスイートはそうではありません。を提案してくれた投稿者に感謝しgit bisectますが、彼らのコメントは削除されたようです。

この質問に対して私が得た回答とコメントのほとんどは、作者がこのようなエラーを見て修正したときの直接の説明を提供したほど、デバッグ戦略に直接対処していませんでした. git bisectこのような問題の原因を特定するための非常に強力なオプションであるとgit show感じています。

于 2013-05-19T19:30:29.800 に答える
0

私の最善の策は、confign/environment 内のファイルの 1 つが仕様ヘルパー自体を必要とすることです。

ファイルAにこの行があるとしましょう

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

そしてファイルBは言う

require 'A.rb'

それは私が信じている無限ループ/スタックエラーを引き起こすでしょう。

于 2013-05-14T03:54:56.013 に答える
0

スタック レベルが深すぎるというエラーは、通常、無限再帰呼び出しを指します。テスト スーツを段階的に絞り込んでみてください。ダミーテストだけで rspec と cucumber を実行できますか? はいの場合は、エラーの原因となっているテストを見つけます。そうでない場合は、テスト環境の設定、rspec とキュウリの設定、および初期化ファイルを確認してください。

また、このエラーは、間違ったインクルード/要求によって引き起こされることがよくあります。テストに何を含めているかを確認してください。

于 2013-05-12T23:49:36.497 に答える