TracePoint介绍

引子

最近发布了一次app升级,发现日志里总是报一个警告:Digest::Digest is deprecated; use Digest

已经确定这个错误不是从app里报出来的,而是来自于某个依赖的gem。

而我们引用的gem有100多个,要找到这个警告来自于哪个gem还真是很伤神。

在网上找解决方案的时候发现了一个方法:set_trace_func。在新版本的ruby(2.1.5以上)中,这个方法已经废弃了,ruby提供了一个更好的的替代:核心类TracePoint

TracePoint介绍

TracePoint可以用来收集特定的事件在被调用时的信息。

这些事件包括:

  • line: 执行下一行代码;
  • raise: 抛出异常;

  • class: 开始定义一个classmodule

  • end: 结束定义一个classmodule;

  • call:调用一个ruby定义方法的时候;

  • return: 从一个ruby方法中返回;

  • c_call: 调用一个c语言程序;

  • c_return: 从一个C语言程序的调用中返回;

  • b_call: 调用一个block;

  • b_return: block调用结束;

  • thread_begin: 开启一个新线程;

  • thread_end: 一个线程结束;

针对这些事件,支持的信息有:

  • binding
  • defined_class
  • disable
  • enable
  • enabled?
  • event
  • inspect
  • lineno
  • method_id
  • path
  • raised_exception
  • return_value
  • self

当然并不是所有的事件都支持这些信息,如果调用的事件不支持某个事件的时候,将会抛出一个RuntimeError

使用实战