introspection/tracepoint_events.rb

tests/_examples/introspection/tracepoint_events.rb in the metorex repository.

class Greeter
  def greet(name, punctuation: "!")
    "hello #{name}#{punctuation}"
  end

  def fail_out
    raise ArgumentError, "no name given"
  end
end

seen = []

tracer = TracePoint.new(:call, :return) do |point|
  seen.push([point.event, point.method_id, point.defined_class.to_s, point.parameters])
end

tracer.enable
Greeter.new.greet("world", punctuation: "?")
tracer.disable

seen.each { |row| puts(row.inspect) }

raised = nil
watcher = TracePoint.new(:raise) do |point|
  raised = point.raised_exception
end

watcher.enable
begin
  Greeter.new.fail_out
rescue ArgumentError
end
watcher.disable

puts(raised.class)
puts(raised.message)

names = nil
scope = TracePoint.new(:return) do |point|
  names = point.binding.local_variables.sort
end
scope.enable
Greeter.new.greet("again")
scope.disable
puts(names.inspect)

Output:

[:call, :greet, "Greeter", [[:req, :name], [:key, :punctuation]]]
[:return, :greet, "Greeter", [[:req, :name], [:key, :punctuation]]]
ArgumentError
no name given
[:name, :punctuation]