Часто мне сложно отлаживать бесконечные рекурсии при кодировании ruby. Есть ли способ получить обратную трассировку из SystemStackError
, чтобы узнать, где именно происходит бесконечный цикл?
Пример
Для некоторых методов 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'
[...]
Есть ли способ сделать это?
EDIT:
Как вы можете видеть из приведенного ниже ответа, Рубиний может это сделать. К сожалению, некоторые ошибки rubinius помешают мне использовать его с программным обеспечением, которое я хотел бы отлаживать. Поэтому, если быть точным, вопрос:
Как получить обратную трассировку с помощью МРТ (по умолчанию ruby) 1.9?