首页 分类 关于我
ruby
Nginx 配置示例 工程师的产品观 理理File/Dir/Pathname(一) TracePoint介绍 ruby中的return 如何动态改变某个class的祖先链 ObjectSpace介绍 Rails日志实现探索(3) Rails日志实现探索(2) Rails日志实现探索(1) Rails中的request rescue exception in ruby 设计模式之观察者模式 require 的故事 ruby中的编码 研究ruby的一些小技巧 Rails中间件 ruby对象的序列化 ActiveSupport宝藏之MessageVerifier 如何写rakefile Ruby on Rails 环境及准备 基于Rack的项目初始化
git
如何移除某次提交之前的版本历史 Git 不常用的好用的命令 Git高级技巧之忽略文件
database
Mysql数据库编码 从mongodb向mysql迁移数据
工具
搭建ipsec服务
linux
Linux 常用查看命令

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: 开始定义一个class或module;
  • end: 结束定义一个class或module;

  • 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。

使用实战

© 2018 www.xinshengyin.com All rights reserved.

版权所有