Ruby 2.4

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