Rails многострочная отладка в byebug или как спасти в одну строку
Иногда мне нужно отладить какое-то неприятное исключение, обратная трассировка которого скрыта или усечена, например ArgumentError
без каких-либо следов стека.
Я привык к отладке с помощью byebug. Проблема в том, что интерпретатор byebug представляет собой REPL, поэтому невозможно писать многострочный код. Я пытаюсь выяснить, как сделать inline-спасение и распечатать оттуда обратную трассировку, т.е. я хочу встроенную, совместимую с REPL, версию
begin
....
rescue => e
puts e.backtrace.join("\n")
end
я пытался
begin; my_crashing_method.call; rescue Exception => e; puts e.backtrace; end
Но эта строка вызывает SyntaxError
*** SyntaxError Exception: (byebug):1: syntax error, unexpected keyword_rescue
rescue Exception => e
^
Я не уверен, что мне не хватает?
РЕДАКТИРОВАТЬ
Вышеприведенная строка отлично работает на обычной оболочке IRB/Rails, но не в оболочке byebug
IRB
begin my_crashing_method.call; rescue Exception => e; puts e.backtrace end
Stack Trace успешно показывает
Byebug
(byebug) begin; my_crashing_method.call; rescue Exception => e; puts e.backtrace
*** SyntaxError Exception: (byebug):1: syntax error, unexpected end-of-input
begin
^
nil
*** NameError Exception: undefined local variable or method `my_crashing_method' for #<StaticPagesController:0x007fae79f61088>
nil
*** SyntaxError Exception: (byebug):1: syntax error, unexpected keyword_rescue
rescue Exception => e
^
nil
*** NameError Exception: undefined local variable or method `e' for #<StaticPagesController:0x007fae79f61088>
nil
1 ответ
Когда вы вводите многострочный код ruby или в одну строку в byebug, вам нужно выходить из точки с запятой, используя обратную реакцию. Следующее должно сделать свое дело.
begin\; my_crashing_method.call\; rescue Exception => e\; puts e.backtrace end
https://github.com/deivid-rodriguez/byebug/blob/master/GUIDE.md#command-syntax