【浅度渣文】BTrace简介

原文链接:http://www.dubby.cn/detail.html?id=9060

别着急着上手,请按捺住你的迫切的心情,稍微花点时间看看BTrace的介绍,然后开始动手操作。注意,这里给出最简单,最基本,也是最常用的使用方法。

BTrace是一个安全的,动态的Java跟踪工具。BTrace通过运行Java程序的动态(字节码)工具类来工作。BTrace将追踪操作插入到正在运行的Java程序的类中,并将跟踪的程序类热插拔。

BTrace术语

  • 探测点(Probe Point)
    • 执行一组跟踪语句的“位置”或“事件”。探测点是我们想要执行一些跟踪语句的“地点”或“事件”。
  • 跟踪行动(Trace Actions)
    • 每当探测器“触发”时执行的跟踪语句。
  • 行动方法(Action Methods)
    • 在探测器触发时执行的BTrace跟踪语句是在类的静态方法内部定义的。这种方法被称为“行动”方法。

BTrace程序结构

BTrace程序是一个普通的Java类,它有一个或多个public static void使用BTrace注释进行注释的方法。注释用于指定跟踪的节目“位置”(也称为“探测点”)。跟踪动作是在静态方法体内部指定的。这些静态方法被称为Action Methods。

BTrace限制

为了保证跟踪动作是“只读的”(即跟踪动作不会改变被跟踪的程序的状态)和有界的(即跟踪动作在有限的时间内终止),一个BTrace程序被允许只做一套有限的行动。特别是一个BTrace类:

  • 不能new新的对象。
  • 不能new新的数组。
  • 不能抛异常。
  • 不能捕获异常。
  • 不能随意调用方法——只能调用com.sun.btrace.BTraceUtils的静态方法。
  • 不能为追踪的目标对象赋值成员变量,不能为追踪的目标类赋值静态变量(不能改变追踪的应用程序的状态)。但是,你可以给自己这个类设置静态变量。
  • 不能有实例方法和字段,只允许有static public void的方法。所有的字段必须是静态的。
  • 不能有外部类,内部类,嵌套的或局部类。
  • 不能有同步块或同步方法。
  • 不能有控制语句(for, while, do..while)。
  • 不能继承其他类(父类只能是java.lang.Object)。
  • 不能实现接口。
  • 不能有断言。
  • 不能字面值。

一个简单的BTrace程序

// import all BTrace annotations
import com.sun.btrace.annotations.*;
// import statics from BTraceUtils class
import static com.sun.btrace.BTraceUtils.*;

// @BTrace annotation tells that this is a BTrace program
@BTrace
public class HelloWorld {
 
    // @OnMethod annotation tells where to probe.
    // In this example, we are interested in entry 
    // into the Thread.start() method. 
    @OnMethod(
        clazz="java.lang.Thread",
        method="start"
    )
    public static void func() {
        // println is defined in BTraceUtils
        // you can only call the static methods of BTraceUtils
        println("about to start a thread!");
    }
}

上面的BTrace程序可以针对正在运行的Java进程运行。只要目标程序即将按Thread.start()方法启动一个线程,这个程序就会在BTrace客户端打印“about to start a thread!” 。还有其他有趣的探测点。例如,我们可以在方法返回时插入跟踪动作,从方法返回异常,在方法中获取或设置字段,创建对象/数组,创建行号,引发异常等等。

运行BTrace的步骤

首先你需要下载BTrace,可以去Github上下载最新的,如果网络不便访问Github,可以从我的网盘上下载v1.3.9。
Github:https://github.com/btraceio/btrace/releases/tag/v1.3.9
百度网盘:https://pan.baidu.com/s/1kVJ0zXl

  1. 你需要配置BTRACE_HOME,你也可以把$BTRACE_HOME/bin拼接到你的PATH后面。
  2. 用jps找到你想要追踪的Java进程的PID。
  3. 写一个BTrace程序——建议你可以直接从样本中修改。
  4. 使用以下命令来执行追踪btrace <pid> <btrace-script>

BTrace的命令行不仅如此,还可以指定头文件的目录,指定classpath,还可以预编译成class,甚至可以使用BTrace代理启动应用程序,但是,一般来说这些都不常用。所以这里跳过,感兴趣的朋友可以关注我的后续文章,或者直接去Github上看介绍

BTrace注释

从上面的介绍中可以了解到,写Btrace程序,主要就是要了解Btrace给我们提供的各个注解,还有com.sun.btrace.BTraceUtils给我们提供的一些静态方法。

方法注释

  • @ com.sun.btrace.annotations.OnMethod 注解可用于指定方法内的目标类,目标方法和“位置”。当匹配方法到达指定位置时,将调用由此注释注释的操作方法。在OnMethod注解中,跟踪的类名由“clazz”属性指定,跟踪的方法由“method”属性指定。“clazz中”可以是一个完全合格的类名(像java.awt.Component或两个斜线指定正则表达式。正则表达式可以匹配的零个或更多的类,如/java\\.awt\\..+/ 匹配java.awt包中的所有类。此外,方法名称也可以是一个正则表达式 - 匹配零个或多个方法。还有另外一种方法来抽象地指定跟踪的类和方法。跟踪的类和方法可以通过注释来指定。例如,如果指定了“clazz”属性,@javax.jws.WebService BTrace将处理所有由WebService注释注释的类。类似地,方法级别注释可以被用来抽象地指定方法。也可以将正则表达式与注释组合在一起,比如 @/com\\.acme\\..+/匹配任何注解匹配给定正则表达式的任何类。通过指定超类型可以匹配多个类。即匹配给定超类型的所有类型的子类型。+java.lang.Runnable匹配所有实现java.lang.Runnable接口的类。
  • @ com.sun.btrace.annotations.OnTimer 注释可以用来指定必须每N毫秒周期运行一次的跟踪操作。时间段被指定为该注解的长“值”属性。
  • @ com.sun.btrace.annotations.OnError 注释可用于指定通过追踪某些其他探测器的操作而引发任何异常时运行的操作。当由同一个BTrace类中的任何其他BTrace操作方法引发任何异常时,将调用由此注释注释的BTrace方法。
  • @ com.sun.btrace.annotations.OnExit 注释可用于指定在BTrace代码调用“exit(int)”内置函数完成跟踪“会话”时运行的操作。
  • @ com.sun.btrace.annotations.OnEvent 注释用于将跟踪方法与BTrace客户端发送的“外部”事件相关联。BTrace客户端发送“事件”时,将调用由此注释注释的BTrace方法。客户端可以根据某种形式的用户请求发送事件(如按下Ctrl-C或GUI菜单)。字符串值可以用作事件的名称。这样,只要外部事件“触发”,就可以执行某些跟踪操作。截至目前,每当使用Ctrl-C(SIGINT)时,命令行BTrace客户端发送“事件”。在SIGINT上,将显示一个控制台菜单,用于发送事件或退出客户端[这是SIGINT的默认设置]。
  • @ com.sun.btrace.annotations.OnLowMemory 注释可用于跟踪内存阈值超过事件。
  • @ com.sun.btrace.annotations.OnProbe 注解可避免在BTrace脚本中使用实现内部类。@OnProbe探测器规格通过BTrace VM代理映射到一个或多个@OnMethod规范。目前,这种映射是使用XML探针描述符文件[由BTrace代理访问的]来完成的。

参数注释

  • @ com.sun.btrace.annotations.Self 注释可以用来标记一个参数来保存* this (或 self *)的值。
  • @ com.sun.btrace.annotations.Return 注解可以用来标记一个参数来保存返回值。
  • @ com.sun.btrace.annotations.CalledInstance 注解可以用来标记一个参数来保存被调用的实例值。
  • @ com.sun.btrace.annotations.CalledMethod 可以用来标记一个参数来保存被调用的方法名称。

字段注释

  • @com.sun.btrace.annotations.Export注释可以与BTrace字段(静态字段)一起使用,以指定字段必须映射到jvmstat计数器。使用这个,BTrace程序可以将跟踪计数器暴露给外部jvmstat客户端(如jstat)。
  • @com.sun.btrace.annotations.Property注释可用于将特定(静态)字段标记为MBean属性。如果一个BTrace类拥有至少一个具有@Property属性的静态字段,则创建一个MBean并向平台MBean服务器进行注册。可以使用JMX客户端(如VisualVM,jconsole)查看这些BTrace MBean。将BTrace附加到目标程序后,可以将VisualVM或jconsole附加到同一程序,并查看新创建的BTrace MBean。使用VisualVM和jconsole,可以使用MBeans选项卡查看BTrace域并查看它的属性。
  • @com.sun.btrace.annotations.TLS注释可以与BTrace字段(静态字段)一起使用来指定字段是线程本地字段。每个Java线程都获得一个单独的“复制”字段。这些线程本地字段可以被BTrace程序用来识别我们是否来自同一个线程的多个探测器动作。

类注释

  • @com.sun.btrace.annotations.DTrace注释可以用来将简单的单线程D脚本(在BTrace Java类中内联)与BTrace程序相关联。
  • @com.sun.btrace.annotations.DTraceRef注释可用于将D脚本(存储在单独的文件中)与BTrace程序相关联。
  • @com.sun.btrace.annotations.BTrace必须使用注释来将给定的Java类指定为BTrace程序。这个注解由BTrace编译器和BTrace代理强制执行。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,014评论 11 349
  • 刚刚谈到跟我们玩的很好的同学快生日了,说到送什么礼物,一个舍友说对方喜欢吃果皮单,打算送她果皮单,我就随口说了句低...
    Singaforever阅读 919评论 0 0
  • 自律是用来解决问题的,如果没有遇到问题,就可以不用自律。 当我们遇到问题时,反应在甜面包热汤模型中,小我的自然反馈...
    MYOB阅读 236评论 0 0