首页 > 其他 > 详细

TracePoint浅析

时间:2014-01-21 23:30:43      阅读:461      评论:0      收藏:0      [点我收藏+]

TracePoint是一款跟踪Ruby代码的工具,可以细粒度的监控Ruby程序,但是只支持2.0.

基础知识

一个简单的例子

非tracepoint的例子

tracer = lambda do |event, file, line, id, binding, klass| 
  to_display = [event, File.basename(file), line, klass, id]
  puts "%10s in %s at line %-2d %s:%s" % to_display
end

set_trace_func tracer


klass 是 类名 id 是方法名

TracePoint的例子

trace = TracePoint.new(:raise) do |tp|
  p [tp.lineno, tp.event, tp.raised_exception]
end

trace.enable # or trace.disable

0/0


基本范式

TracePoint.new(Event) do |tp|
   # tp 是一个 TracePoint 对象,有此刻正在运行的程序的所有的信息,包括事件等
end


Events

class level

TracePoint.new(:module)
TracePoint.new(:class)
TracePoint.new(:end)

method level

:call
:return
:c_call
:c_return


block level

:b_call
:b_return
thread level
:thread_begin
:thread_end


other level


TracePoint的实例方法

控制方法

disable
enable
disable?
enable?

inspect # 返回关于tracepoint status字符串



获取调用类和方法

defined_class # 类名称
meethod_id # 方法名称
raise_exception # 抛出的异常
return_value # 方法的返回值


其他

event # 当前trigger的事件
lineno # 运行的行数
path: 该运行的文件的位置


结合Rails

使用rack middleware 整合如 Rails

# update application.rb 
# config.middleware.insert_before(ActionDispatch::Static, TracePoint::Middleware)
class TracePoint
  class Middleware

    def initialize(app)
      @app = app
    end

    def call(env)
      stats = {}
      trace = TracePoint.new(:call) do |tp|
        stats[tp.defined_class] ||= {}
        stats[tp.defined_class][tp.method_id] ||= 0
        stats[tp.defined_class][tp.method_id] += 1
      end
      trace.enable
      response = @app.call(env)
      trace.disable

      puts env[‘PATH_INFO‘]
      puts "#{stats.keys.size} classes used"
      puts "#{stats.map{|k,v| v.keys}.flatten.size} methods used"
      puts "#{stats.map{|k,v| v.values}.flatten.sum} methods dispatched"
      #File.open("tmp/#{env[‘PATH_INFO‘].gsub(‘/‘, ‘_‘)}_req_stats.json", "w"){|f| f << stats.to_json }
      puts ""
      response
    end

  end
end


https://gist.github.com/chucai/8037079

参考资料

http://www.slideshare.net/markykang/mangling-ruby-withtracepoint https://www.youtube.com/watch?v=V_dZQ6AeZDE http://www.ruby-doc.org/core-2.0.0/TracePoint.html http://matt.aimonetti.net/posts/2013/03/05/inspecting-rails-4-request-dispatch-using-ruby-2-dot-0/

TracePoint浅析

原文:http://blog.csdn.net/hexudong08/article/details/18615455

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!