Tracer
class Tracer
Parent:Object
输出Ruby程序的源代码级执行轨迹。
它通过注册一个具有Kernel#set_trace_func的事件处理程序来处理传入事件。它还提供了用于过滤不需要的跟踪输出的方法(请参阅::add_filter,::on和::off)。
示例
考虑下面的Ruby脚本
class A
def square(a)
return a*a
end
end
a = A.new
a.square(5)
使用上面的脚本运行ruby -r tracer example.rb
将输出以下跟踪到STDOUT(注意,你也可以明确地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
用于显示传入事件的符号表:
+}+
调用一个C语言例程
+{+
从C语言例程返回
+>+
调用Ruby方法
C
启动一个类或模块定义
E
完成一个类或模块的定义
-
在新行上执行代码
+^+
引发异常
+<+
从Ruby方法返回
常量
EVENT_SYMBOL
用于显示跟踪信息的符号表
Single
参考Tracer的单例实例
display_c_call display_process_id display_thread_id stdout verbose
属性
display_c_callRW
在跟踪输出中显示C-routine调用(默认为false)
display_c_call?RW
在跟踪输出中显示C-routine调用(默认为false)
display_process_idRW
在跟踪输出中显示进程ID(默认为false)
display_process_id?RW
在跟踪输出中显示进程ID(默认为false)
display_thread_idRW
在跟踪输出中显示线程ID(默认为true)
display_thread_id?RW
在跟踪输出中显示线程ID(默认为true)
stdoutRW
用于输出跟踪的输出流(默认为STDOUT)
stdout_mutexR
互斥锁被跟踪器用于显示跟踪输出
verboseRW
显示额外的调试信息(默认为false)
verbose?RW
显示额外的调试信息(默认为false)
公共类别方法
add_filter(p = proc) Show source
用于过滤不需要的跟踪输出
仅输出在Kernel类中执行的代码行的示例:
Tracer.add_filter do |event, file, line, id, binding, klass, *rest|
"Kernel" == klass.to_s
end
# File lib/tracer.rb, line 263
def Tracer.add_filter(p = proc)
Single.add_filter(p)
end
off() Show source
禁用跟踪
# File lib/tracer.rb, line 236
def Tracer.off
Single.off
end
on() { || ... } Show source
开始追踪
示例
Tracer.on
# code to trace here
Tracer.off
你也可以传递一个块:
Tracer.on {
# trace everything in this block
}
# File lib/tracer.rb, line 225
def Tracer.on
if block_given?
Single.on{yield}
else
Single.on
end
end
set_get_line_procs(file_name, p = proc) Show source
注册一个事件处理程序p
,每file_name
执行一行就调用它。
示例:
Tracer.set_get_line_procs("example.rb", lambda { |line|
puts "line number executed is #{line}"
})
# File lib/tracer.rb, line 250
def Tracer.set_get_line_procs(file_name, p = proc)
Single.set_get_line_procs(file_name, p)
end