ruby-on-railsrubybyebug

Rails multiline debug in byebug or how to rescue in single line


Sometimes I need to debug some nasty exception that has its backtrace hidden or truncated, like an ArgumentError without any stack trace.

I am used to debugging with byebug. The problem is that the byebug interpreter is a REPL, so it's not possible to write multiline code. I am trying to figure out how to make an inline rescue and print the backtrace from there, ie I want an inline, REPL compatible, version of

begin 
  .... 
rescue => e 
  puts e.backtrace.join("\n")
end

I have tried

begin; my_crashing_method.call; rescue Exception => e; puts e.backtrace; end

But that line raises a SyntaxError

*** SyntaxError Exception: (byebug):1: syntax error, unexpected keyword_rescue
rescue Exception => e
      ^

I'm not sure what I am missing ?

EDIT

The line above works fine on a regular IRB/Rails shell but not from a byebug shell

IRB

begin my_crashing_method.call; rescue Exception => e; puts e.backtrace end

Stack Trace shows successfully

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

Solution

  • When you enter multiple lines ruby code or in a single line on byebug, you need to escape the semicolon using backlash. The following should do the trick.

    begin\; my_crashing_method.call\; rescue Exception => e\; puts e.backtrace end
    

    https://github.com/deivid-rodriguez/byebug/blob/master/GUIDE.md#command-syntax