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 ::add_filter, ::on, and ::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)
- A
- O
- S
stdout | = | STDOUT |
verbose | = | false |
display_process_id | = | false |
display_thread_id | = | true |
display_c_call | = | false |
EVENT_SYMBOL | = | { "line" => "-", "call" => ">", "return" => "<", "class" => "C", "end" => "E", "raise" => "^", "c-call" => "}", "c-return" => "{", "unknown" => "?" } |
Symbol table used for displaying trace information |
||
Single | = | new |
Reference to singleton instance of Tracer |
[RW] | display_c_call | display C-routine calls in trace output (defaults to false) |
[RW] | display_c_call? | display C-routine calls in trace output (defaults to false) |
[RW] | display_process_id | display process id in trace output (defaults to false) |
[RW] | display_process_id? | display process id in trace output (defaults to false) |
[RW] | display_thread_id | display thread id in trace output (defaults to true) |
[RW] | display_thread_id? | display thread id in trace output (defaults to true) |
[RW] | stdout | output stream used to output trace (defaults to STDOUT) |
[R] | stdout_mutex | mutex lock used by tracer for displaying trace output |
[RW] | verbose | display additional debug information (defaults to false) |
[RW] | verbose? | display additional debug information (defaults to false) |
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
Disable tracing
Start tracing
Example
Tracer.on
# code to trace here
Tracer.off
You can also pass a block:
Tracer.on {
# trace everything in this block
}
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}"
})