Project

General

Profile

Feature #8661

Add option to print backstrace in reverse order(stack frames first & error last)

Added by gary4gar (Gaurish Sharma) almost 4 years ago. Updated 7 days ago.

Status:
Closed
Priority:
Normal
Target version:
-
[ruby-core:56096]

Description

Currently the way ruby prints the backtrace is that the error comes first & then the stack frames. like this

  Main Error Message
stack frame 1
stack frame 2
stack frame 3
.....

this is perfectly fine provided

  1. Backstraces are short, so fits in terminal.hence, no need to scroll.
  2. you read it from top to bottom.

But, I am a rails developer where

  1. Backstraces are always HUGE, therefore seldom don't fit in terminal. Means LOTS of scrolling to do everytime we get an error.
  2. in terminal we tend to read backstraces from bottom to top, especially when tailing(tail -f) the production logs.
  3. people, who practice Test-driven development literally spend most of their time scrolling to read backstraces to the point most end up buying a larger display.

Proposed Solution:
Please add a way so we can configure backstraces to be printed in reverse order. so if you are reading from bottom, say from terminal, you can get the main error message without need to scroll. like this

stack frame 3
stack frame 2
stack frame 1
 Main Error Message
..... 

this would save lot of time because when the error message is print at the bottom, no need to scroll for reading it. Not sure if this can be done today. I tried Overriding Exception#backtrace but it caused stack level too deep & illegal hardware instruction Error.

Attached are currently what backstrace currently looks like & how there be an option to make it look for comparison.

current.log View - here is currently backtraces are printed (5.13 KB) gary4gar (Gaurish Sharma), 07/21/2013 05:20 AM

proposed.log View - here is how I wish they could printed, so its easier read in terminal (4.9 KB) gary4gar (Gaurish Sharma), 07/21/2013 05:20 AM

Associated revisions

Revision 57685
Added by nobu (Nobuyoshi Nakada) 3 months ago

eval_error.c: backstrace in reverse order

  • eval_error.c (rb_threadptr_error_print): print backtrace and error message in reverse order if STDERR is unchanged and a tty. [Feature #8661]

Revision 58785
Added by naruse (Yui NARUSE) 8 days ago

Add NEWS about [Feature #8661]

Revision 58786
Added by nobu (Nobuyoshi Nakada) 8 days ago

eval_error.c: enrich backtrace

  • eval_error.c (print_backtrace): add frame number when printing in reverse order. [Feature #8661]

History

#1 [ruby-core:56109] Updated by jballanc (Joshua Ballanco) almost 4 years ago

You can already accomplish something like this yourself:

begin
  raise "Hello!"
rescue Exception => e
  puts e.backtrace.reverse.join("\n")
  puts e.message
end

Simple!

#2 [ruby-core:56117] Updated by nobu (Nobuyoshi Nakada) almost 4 years ago

(13/07/23 4:56), Joshua Ballanco wrote:

You can already accomplish something like this yourself:

begin
  raise "Hello!"
rescue Exception => e
  puts e.backtrace.reverse.join("\n")

You don't need to join.

  puts e.message
end

Simple!

#3 [ruby-core:78808] Updated by nofxx (Marcos Piccinini) 5 months ago

Already doing the rescue & reverse, but need to do it on every project...

Another use case is when using some monitor (e.g. guard) to run tests as you code:
When there's a fail one needs to switch to terminal and scroll up to see the lines that matter.

#4 [ruby-core:79669] Updated by nobu (Nobuyoshi Nakada) 3 months ago

  • Description updated (diff)

#5 Updated by nobu (Nobuyoshi Nakada) 3 months ago

  • Status changed from Open to Closed

Applied in changeset ruby-trunk:r57685.


eval_error.c: backstrace in reverse order

  • eval_error.c (rb_threadptr_error_print): print backtrace and error message in reverse order if STDERR is unchanged and a tty. [Feature #8661]

#6 [ruby-core:81087] Updated by Eregon (Benoit Daloze) 17 days ago

Should matz give an opinion on this feature?

It's a pretty big change for the user, I got confused a couple times by it when running trunk.
Particularly, if a test framework prints a backtrace in the old order, but then some exception kills the test framework then there is a mix of backtrace in old and new order.

I see from the commit this is limited to top-level backtraces printed to stderr.
This is good to limit breaking compatibility but also inconsistent with the Exception#backtrace order for instance.
Even then, it might already break compatibility significantly if anyone depends on the output of the top-level exception handler.

Also, I am not sure this addresses the OP concern, since the display of the backtrace in Rails is rarely an exception going to the top-level (which would be affected by this change) but managed by some handler printing the exception in the log (managed by Rails and can only be changed there).

In any case, if this remains for 2.5 it should be mentioned in the NEWS file.

#7 [ruby-core:81088] Updated by Eregon (Benoit Daloze) 17 days ago

  • Assignee set to matz (Yukihiro Matsumoto)

#8 [ruby-core:81100] Updated by ko1 (Koichi Sasada) 16 days ago

  • Status changed from Closed to Assigned

Agreed. I got confusing too. (not sure it is a matter of experience or not...)

#9 Updated by naruse (Yui NARUSE) 8 days ago

We expect some people may object this.
Therefore we're gathering feedback now (so thank you for your feedback).

To gather feedback wider, we'll give final decision after preview 1, including rspec and Rails will follow this change or not.

In any case, if this remains for 2.5 it should be mentioned in the NEWS file.

Yeah, NEWS should include this and note as EXPERIMENTAL.
I add it.

#10 Updated by naruse (Yui NARUSE) 8 days ago

  • Status changed from Assigned to Closed

Applied in changeset ruby-trunk:trunk|r58785.


Add NEWS about [Feature #8661]

#11 Updated by naruse (Yui NARUSE) 8 days ago

  • Status changed from Closed to Assigned

#12 Updated by nobu (Nobuyoshi Nakada) 8 days ago

  • Status changed from Assigned to Closed

Applied in changeset ruby-trunk:trunk|r58786.


eval_error.c: enrich backtrace

  • eval_error.c (print_backtrace): add frame number when printing in reverse order. [Feature #8661]

#13 [ruby-core:81299] Updated by shyouhei (Shyouhei Urabe) 7 days ago

FYI it is intentional for this feature being automatically enabled right now, instead of some configuration like the OP requests.

The reason behind this is that stderr is expected to be passed to other processes (like some logging infrastructure for instance). If the order of backtraces is configurable, it becoms impossible for such outer-process things to detect which. So configuration is a bad idea in this area. Either the backtrace is ascending or descending, that order should be static and should never be configurable.

P.S. I get confused too so I personally don't like the way it is.

Also available in: Atom PDF