Outputs a source level execution trace of a Ruby program.
It does this by registering an event handler with Kernel#set_trace_func
for processing incoming events. It also provides methods for filtering unwanted trace output (see Tracer.add_filter
, Tracer.on
, and Tracer.off
).
Example
Consider the following Ruby script
class A def square(a) return a*a end end a = A.new a.square(5)
Running the above script using ruby -r tracer example.rb
will output the following trace to STDOUT (Note you can also explicitly require 'tracer'
)
#0:<internal:lib/rubygems/custom_require>:38:Kernel:<: - #0:example.rb:3::-: class A #0:example.rb:3::C: class A #0:example.rb:4::-: def square(a) #0:example.rb:7::E: end #0:example.rb:9::-: a = A.new #0:example.rb:10::-: a.square(5) #0:example.rb:4:A:>: def square(a) #0:example.rb:5:A:-: return a*a #0:example.rb:6:A:<: end | | | | | | | | | ---------------------+ event | | | ------------------------+ class | | --------------------------+ line | ------------------------------------+ filename ---------------------------------------+ thread
Symbol
table used for displaying incoming events:
- +}+
-
call a C-language routine
- +{+
-
return from a C-language routine
- +>+
-
call a Ruby method
C
-
start a class or module definition
E
-
finish a class or module definition
-
-
execute code on a new line
- +^+
-
raise an exception
- +<+
-
return from a Ruby method
Copyright
by Keiju ISHITSUKA(keiju@ishitsuka.com)
Symbol
table used for displaying trace information
display additional debug information (defaults to false)
display additional debug information (defaults to false)
output stream used to output trace (defaults to STDOUT)
mutex lock used by tracer for displaying trace output
display process id in trace output (defaults to false)
display process id in trace output (defaults to false)
display thread id in trace output (defaults to true)
display thread id in trace output (defaults to true)
display C-routine calls in trace output (defaults to false)
display C-routine calls in trace output (defaults to false)
# File tmp/rubies/ruby-2.4.10/lib/tracer.rb, line 264
def Tracer.add_filter(p = proc)
Single.add_filter(p)
end
Used to filter unwanted trace output
Example which only outputs lines of code executed within the Kernel
class:
Tracer.add_filter do |event, file, line, id, binding, klass, *rest| "Kernel" == klass.to_s end
# File tmp/rubies/ruby-2.4.10/lib/tracer.rb, line 237
def Tracer.off
Single.off
end
Disable tracing
# File tmp/rubies/ruby-2.4.10/lib/tracer.rb, line 226
def Tracer.on
if block_given?
Single.on{yield}
else
Single.on
end
end
Start tracing
Example
Tracer.on # code to trace here Tracer.off
You can also pass a block:
Tracer.on { # trace everything in this block }
# File tmp/rubies/ruby-2.4.10/lib/tracer.rb, line 251
def Tracer.set_get_line_procs(file_name, p = proc)
Single.set_get_line_procs(file_name, p)
end
Register an event handler p
which is called everytime a line in file_name
is executed.
Example:
Tracer.set_get_line_procs("example.rb", lambda { |line| puts "line number executed is #{line}" })