首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Tracer

Parent:Object

输出Ruby程序的源代码级执行轨迹。

它通过注册一个具有Kernel#set_trace_func的事件处理程序来处理传入事件。它还提供了用于过滤不需要的跟踪输出的方法(请参阅::add_filter,::on和::off)。

示例

考虑下面的Ruby脚本

代码语言:javascript
复制
class A
  def square(a)
    return a*a
  end
end

a = A.new
a.square(5)

使用上面的脚本运行ruby -r tracer example.rb将输出以下跟踪到STDOUT(注意,你也可以明确地require 'tracer'

代码语言:javascript
复制
#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类中执行的代码行的示例:

代码语言:javascript
复制
Tracer.add_filter do |event, file, line, id, binding, klass, *rest|
  "Kernel" == klass.to_s
end
代码语言:javascript
复制
# File lib/tracer.rb, line 263
def Tracer.add_filter(p = proc)
  Single.add_filter(p)
end

off() Show source

禁用跟踪

代码语言:javascript
复制
# File lib/tracer.rb, line 236
def Tracer.off
  Single.off
end

on() { || ... } Show source

开始追踪

示例

代码语言:javascript
复制
Tracer.on
# code to trace here
Tracer.off

你也可以传递一个块:

代码语言:javascript
复制
Tracer.on {
  # trace everything in this block
}
代码语言:javascript
复制
# 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执行一行就调用它。

示例:

代码语言:javascript
复制
Tracer.set_get_line_procs("example.rb", lambda { |line|
  puts "line number executed is #{line}"
})
代码语言:javascript
复制
# 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

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com