Ruby をコーディングしていると、無限再帰のデバッグに苦労することがよくあります。SystemStackError
無限ループが正確に発生する場所を見つけるために a からバックトレースを取得する方法はありますか?
例
いくつかのメソッドが与えられfoo
、それらはループ内bar
でbaz
互いに呼び出します:
def foo
bar
end
def bar
baz
end
def baz
foo
end
foo
このコードを実行すると、メッセージが表示されますtest.rb:6: stack level too deep (SystemStackError)
。スタックの最後の 100 行を取得すると便利なため、次のようfoo
にbar
との間のループであることがすぐにわかりますbaz
。
test.rb:6: stack level too deep (SystemStackError)
test.rb:2:in `foo'
test.rb:10:in `baz'
test.rb:6:in `bar'
test.rb:2:in `foo'
test.rb:10:in `baz'
test.rb:6:in `bar'
test.rb:2:in `foo'
[...]
これを達成する方法はありますか?
編集:
以下の回答からわかるように、ルビニウスはそれを行うことができます。残念ながら、いくつかのrubinius のバグにより、デバッグしたいソフトウェアで rubinius を使用できません。正確に言うと、質問は次のとおりです。
MRI (デフォルトの Ruby) 1.9 でバックトレースを取得するにはどうすればよいですか?