TracePoint浅析

原创 2014年01月21日 16:39:17

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/

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[内核文档]使用Linux内核的追踪点[Tracepoint]

本文档介绍了Linux内核中的追踪点及其使用方法。文档中提供的例子详细说明了如何在内核中插入追踪点,如何将探测函数与追踪点联系起来。同时也提供了一些探测函数的例子。 Ø  追踪点的目的代码中的追踪点提...
  • arethe
  • arethe
  • 2011-04-01 10:11
  • 7888

使用 ftrace 调试 Linux 内核,第 1 部分

简介: ftrace 是 Linux 内核中提供的一种调试工具。使用 ftrace 可以对内核中发生的事情进行跟踪,这在调试 bug 或者分析内核时非常有用。本系列文章对 ftrace 进行了介绍,分...

利用ftrace跟踪内核static tracepoint——实例writeback event

和很多linux内核子系统一样,static tracepoint有很多层次,其中某个层次都展示给不同层次的开发者来满足他们的不同需求。关于linux tracepoint的详细信息,我们可以在lin...

Linux内核tracepoints

内核中的每个tracepoint提供一个钩子来调用probe函数。一个tracepoint可以打开或关闭。打开时,probe函数关联到tracepoint;关闭时,probe函数不关联到tracepo...

Linux内核tracepoints

tcp tracepoints

Tracing on Linux (tracepoint induction)

原文链接:http://lyl19.blog.163.com/blog/static/19427205520136173531972/ The Linux tracing APIs are a ...

Linux内核中trace_xxxx()函数的定义

Linux中trace_xxxx()函数的定义 以trace_netif_receive_skb(skb);为例 该函数的定义: 其中DEFINE_EVENT定义为(incl...

Linux trace使用入门

概念 trace 顾名思义追踪信息,可通俗理解为一种高级打印机制,用于debug,实现追踪kernel中函数事件的框架,源码位于:\kernel\trace\trace.c,有兴趣可以研究 终...
  • jscese
  • jscese
  • 2015-06-13 13:35
  • 7252

Ceph RBD请求过程的分析

Ceph RBD请求过程的分析 RBD是ceph中提供块存储的客户端服务,只所以说是客户端服务是相对于RADOS而言,RBD是基于librados API开发的一个块存储服务。 本文会通过rbd的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)