Project

General

Profile

Actions

Feature #19572

closed

Add a new TracePoint event for rescued exceptions

Added by st0012 (Stan Lo) 12 months ago. Updated 8 months ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:113096]

Description

Summary
Support a new rescue event type in TracePoint. When the event is triggered, TracePoint#rescued_exception can be used to access the exception.

Reason
Currently, TracePoint supports raise events, which can be helpful for debugging by showing which exception occurs at which location. By adding a rescue event type, we can improve the developer's debugging experience by making it easier to check where an exception is rescued.

Currently, the most effective way to check where an exception is rescued involves setting a breakpoint at the exception's raised location and stepping through the code to see whether the debugger stops inside a rescue block. However, this can be a tedious process, especially in large applications with deep call stacks. By using a TracePoint event for rescue, developers can easily track exceptions as they are rescued by adding a few lines of code:

TracePoint.trace(:rescue) do |tp|
  puts "Exception rescued: #{tp.rescued_exception} at #{tp.path}:#{tp.lineno}"
end		  		  

This new TracePoint event will also improve the ruby/debug's ExceptionTracer and provide users with a better debugging experience.

Actions #1

Updated by st0012 (Stan Lo) 12 months ago

  • Subject changed from Proposal: New TracePoint event for rescued exceptions to Add a new TracePoint event for rescued exceptions

Updated by Eregon (Benoit Daloze) 12 months ago

Makes sense. FWIW TruffleRuby has a command-line option to print stacktraces of where exceptions are rescued, this would be a generalization of that.

Updated by ko1 (Koichi Sasada) 11 months ago

Sorry for late response.

Two points:

  1. How should we handle C level rescue?

Some C code catch the exception. Should we trap it on this TracePoint?
rb_rescue() is easy to implement this TP hook.
However some core feature handle it without rb_rescue(), for example all exceptions are caught at the end of exception without rb_rescue().

For example only supports Ruby-level rescue is one idea, but not sure it can satisfice the purpose.

  1. debugging experience

This new TracePoint event will also improve the ruby/debug's ExceptionTracer and provide users with a better debugging experience.

Could you explain more with examples?

Updated by st0012 (Stan Lo) 11 months ago

We discussed this at the RubyKaigi dev-meeting as a topic and I also did a follow up discussion with @ko1 (Koichi Sasada). IIRC, the conclusion was:

  • This rescue event is only for Ruby-level rescue. If there's a need for C-level rescue tracking, we may introduce a c_rescue event, but I currently don't have a plan for it.
  • Instead of adding TP#rescued_exception, @ko1 (Koichi Sasada) suggested using the raised_exception API for now. Consider rescue will likely be used with raise together, using the same API to access the exception can simplify implementation, so I agree with it.
  • There was no objection in introducing this event.
  • @ko1 (Koichi Sasada) was ok with adopting it in ruby/debug's ExceptionTracer.

@ko1 (Koichi Sasada) is there anything I missed or you may want to add?

Actions #5

Updated by ko1 (Koichi Sasada) 8 months ago

  • Status changed from Open to Closed

Applied in changeset git|d68c01fd314ebd6dc1d89c95a2734fad4f0953b0.


support rescue event for TracePoint

fix [Feature #19572]

Actions

Also available in: Atom PDF

Like0
Like0Like1Like0Like0Like0Like0