BTrace工具简介


What is Btrace?

Java进程诊断分析工具

安全的工具

无侵入性

不修改应用任何应用数据

限制跟踪行为,没能有循环

依赖组件

使用OjbectWeb ASM组件来完成字节码层面上的跟踪分析

开源组件

项目主页:http://btrace.dev.java.net

GPLv2 + CLASSPATH Exception

VisualVM 插件和开发时插件

BTrace应用较为广泛的原因应该是其安全性和无侵入性,已经热交互技术,使得我们无需启动Agent的情况下动态跟踪分析,其安全性不会导致对目标Java进程的任何破坏性影响,使得BTrace成为我们线上产品问题定位的利器。无侵入性无需我们对原有代码做任何修改,降低上线风险和测试成本,并且无需重启启动目标Java进程进行Agent加载即可动态分析和跟踪目标程序,可以说BTrace可以满足大部分的应用场景。


Probes and Actions

通过注解来完成跟踪类型的支持

l  方法调用

l  方法返回

l  捕捉方法异常

l  行号

l  字段get/set

l  方法调用/返回(在指定的方法中)

l  异常抛出前后

l  同步进入/退出

l  定时器

BTrace脚本

为了保证trace语句只读, BTrace对trace脚本有一些限制(比如不能改变被trace代码中的状态),跟踪类中必须要有一个静态方法,主要是通过调用BTraceUtils类来完成一些动作,并且这些动作是安全的,是BTrace规定的一个子集,详见如下描述:

l  BTrace禁止new类、数组,、抛异常、捕获异常

l  禁止调用除com.sun.btrace.BTraceUtil类的其他实例方法以及静态方法

l  BTrace1.2前不能有实例字段和方法,只能有无返回值的静态方法,所有字段也都必须是静态的。

l  禁止定义外部、内部、匿名, 本地类

l  禁止有同步块和同步方法

l  禁止有循环(for, while, do..while)

l  禁止实现接口, 不能扩展类,直接超类必须是java.lang.Object

l  禁止使用assert语句, 不能使用class字面值

l  禁止使用class字节码


BTrace Class

方法上的注解

l  @ OnMethod  用来指定trace的目标类和方法以及具体位置, 被注解的方法在匹配的方法执行到指定的位置会被调用。"clazz"属性用来指定目标类名, 可以指定全限定类名, 比如"java.awt.Component", 也可以是正则表达式(表达式必须写在"//"中, 比如"/java\\.awt\\..+/")。"method"属性用来指定被trace的方法. 表达式可以参考自带的例子(NewComponent.java 和 Classload.java, 关于方法的注解可以参考MultiClass.java).
有时候被trace的类和方法可能也使用了注解. 用法参考自带例子WebServiceTracker.java. 针对注解也是可以使用正则表达式, 比如像这个"@/com\\.acme\\..+/ ",也可以通过指定超类来匹配多个类, 比如"+java.lang.Runnable"可以匹配所有实现了java.lang.Runnable接口的类. 具体参考自带例子SubtypeTracer.java。

l  @OnTimer定时触发Trace,时间可以指定,单位为毫秒,具体参考自带例子 Histogram.java。

l  @OnError 当trace代码抛异常或者错误时,该注解的方法会被执行. 如果同一个trace脚本中其他方法抛异常, 该注解方法也会被执行。

l  @OnExit 当trace方法调用内置exit(int)方法(用来结束整个trace程序)时, 该注解的方法会被执行. 参考自带例子ProbeExit.java。

l  @OnEvent 用来截获"外部"btrace client触发的事件, 比如按Ctrl-C 中断btrace执行时,并且选择2,或者输入事件名称,将执行使用了该注解的方法, 该注解的value值为具体事件名称。具体参考例子HistoOnEvent.java

l  @OnLowMemory 当内存超过某个设定值将触发该注解的方法, 具体参考MemAlerter.java

l  @OnProbe 使用外部文件XML来定义trace方法以及具体的位置,具体参考示例SocketTracker1.java和java.net.socket.xml。

参数上的注解

l  @Self 用来指定被trace方法的this,可参考例子AWTEventTracer.java 和 AllCalls1.java

l  @Return 用来指定被trace方法的返回值,可参考例子Classload.java

l  @ProbeClassName (since 1.1) 用来指定被trace的类名, 可参考例子AllMethods.java

l  @ProbeMethodName (since 1.1) 用来指定被trace的方法名, 可参考例子WebServiceTracker.java。

l  @TargetInstance (since 1.1) 用来指定被trace方法内部被调用到的实例, 可参考例子AllCalls2.java

l  @TargetMethodOrField (since 1.1) 用来指定被trace方法内部被调用的方法名, 可参考例子AllCalls1.java 和 AllCalls2.java。

非注解的方法参数

未使用注解的方法参数一般都是用来做方法签名匹配用的, 他们一般和被trace方法中参数出现的顺序一致. 不过他们也可以与注解方法交错使用, 如果一个参数类型声明为*AnyType[]*, 则表明它按顺序"通吃"方法所有参数. 未注解方法需要与*Location*结合使用:

l  Kind.ENTRY-被trace方法参数

l  Kind.RETURN- 被trace方法返回值

l  Kind.THROW - 抛异常

l  Kind.ARRAY_SET, Kind.ARRAY_GET - 数组索引

l  Kind.CATCH - 捕获异常

l  Kind.FIELD_SET - 属性值

l  Kind.LINE - 行号

l  Kind.NEW - 类名

l  Kind.ERROR - 抛异常

属性上的注解

l  @Export 该注解的静态属性主要用来与jvmstat计数器做关联. 使用该注解之后, btrace程序就可以向jvmstat客户端(可以用来统计jvm堆中的内存使用量)暴露trace程序的执行次数, 具体可参考例子ThreadCounter.java

l  @Property 使用了该注解的trace脚本将作为MBean的一个属性, 一旦使用该注解, trace脚本就会创建一个MBean并向MBean服务器注册, 这样JMX客户端比如VisualVM, jconsole就可以看到这些BTrace MBean. 如果这些被注解的属性与被trace程序的属性关联, 那么就可以通过VisualVM 和jconsole来查看这些属性了. 具体可参考例子ThreadCounterBean.java 和 HistogramBean.java。

l  @TLS 用来将一个脚本变量与一个ThreadLocal变量关联. 因为ThreadLocal变量是跟线程相关的, 一般用来检查在同一个线程调用中是否执行到了被trace的方法. 具体可参考例子OnThrow.java 和 WebServiceTracker.java

类上的注解

l  @com.sun.btrace.annotations.DTrace 用来指定btrace脚本与内置在其脚本中的D语言脚本关联, 具体参考例子DTraceInline.java.

l  @com.sun.btrace.annotations.DTraceRef 用来指定btrace脚本与另一个D语言脚本文件关联. 具体参考例子DTraceRefDemo.java.

l  @com.sun.btrace.annotations.BTrace 用来指定该java类为一个btrace脚本文件.


BTrace Samples

相关实例说明

BTrace自带的sample是学习BTrace的最后资料,熟练使用BTrace中提供的sample并且能够手动进行验证,可以快速的熟悉BTrace并加载应用,自带的sample也有很大一部分可以直接或者稍加修改就可以成为我们的定位脚本,方便使用。

l  AWTEventTracer.java - 演示了对EventQueue.dispatchEvent()事件进行trace的做法, 可以通过instanceof来对事件进行过滤, 比如这里只针对focus事件trace.

l  AllLines.java - 演示了如何在被trace的程序到达probe指定的类和指定的行号时执行指定的操作(例子中指定的行号是-1表示任意行).

l  AllSync.java - 演示了如何在进入/退出同步块进行trace.

l  ArgArray.java - 演示了打印java.io包下所有类的readXXX方法的输入参数.

l  Classload.java - 演示打印成功加载指定类以及堆栈信息.

l  CommandArg.java - 演示如何获取btrace命令行参数.

l  Deadlock.java - 演示了@OnTimer注解和内置deadlock()方法的用法

l  DTraceInline.java - 演示@DTrace注解的用法

l  DTraceDemoRef.java - 演示@DTraceRef 注解的用法.

l  FileTracker.java - 演示了如何对File{Input/Output}Stream构造函数中初始化打开文件的读写文件操作进行trace.

l  FinalizeTracker.java - 演示了如何打印一个类所有的属性, 这个在调试和故障分析中非常有用. 这里的例子是打印FileInputStream类的close() /finalize() 方法被调用时的信息.

l  Histogram.java - 演示了统计javax.swing.JComponent在一个应用中被创建了多少次.

l  HistogramBean.java - 同上例, 只不过演示了如何与JMX集成, 这里的map属性通过使用@Property注解被暴露成一个MBean.

l  HistoOnEvent.java - 同上例, 只不过演示了如何在通过按ctrl+c中断当前脚本时打印出创建次数, 而不是定时打印.

l  JdbcQueries.java - 演示了聚合(aggregation)功能. 关于聚合功能可参考DTrace.

l  JInfo.java - 演示了内置方法printVmArguments(), printProperties() 和printEnv() 的用法

l  JMap.java - 演示了内置方法dumpHeap()的用法. 即将目标应用的堆信息以二进制的形式dump出来

l  JStack.java - 演示了内置方法jstackAll()的用法, 即打印所有线程的堆栈信息.

l  LogTracer.java - 演示了如何深入实例方法(Logger.log)并调用内置方法(field() )打印私有属性内容.

l  MemAlerter.java - 演示了使用@OnLowMememory 注解监控内存使用情况. 即堆内存中的年老代达到指定值时打印出内存信息.

l  Memory.java - 演示每隔4s打印一次内存统计信息.

l  MultiClass.java - 演示了通过使用正则表达式对多个类的多个方法进行trace.

l  NewComponent.java - 使用计数器每隔一段时间检查当前应用中创建java.awt.Component的个数.

l  OnThrow.java - 当抛出异常时, 打印出异常堆栈信息.

l  ProbeExit.java - 演示@OnExit注解和内置exit(int)方法的用法

l  Profiling.java - 演示了对profile的支持.  // 我执行没成功, BTrace内部有异常

l  Sizeof.java - 演示了内置的sizeof方法的使用.

l  SocketTracker.java - 演示了对socket的creation/bind方法的trace.

l  SocketTracker1.java - 同上, 只不过使用了@OnProbe.

l  SysProp.java - 演示了使用内置方法获取系统属性, 这里是对 java.lang.System的getProperty方法进行trace.

l  SubtypeTracer.java - 演示了如何对指定超类的所有子类的指定方法进行trace.

l  ThreadCounter.java - 演示了在脚本中如何使用jvmstat 计数器. (jstat -J-Djstat.showUnsupported=true -name btrace.com.sun.btrace.samples.ThreadCounter.count 需要这样来从外部通过jstat来访问)

l  ThreadCounterBean.java - 同上, 只不过使用了JMX.

l  ThreadBean.java - 演示了对预编译器的使用(并结合了JMX).

l  ThreadStart.java - 演示了脚本中DTrace的用法.

l  Timers.java - 演示了在一个脚本中同时使用多个@OnTimer

l  URLTracker.java - 演示了在每次URL.openConnection成功返回时打印出url. 这里也使用了D语言脚本.

l  WebServiceTracker.java - 演示了如何根据注解进行trace.

其他相关博文

BTrace工具简介http://mgoann.iteye.com/blog/1409667

BTrace实例应用http://mgoann.iteye.com/blog/1409676

BTrace实际案例分析http://mgoann.iteye.com/blog/1409685

时间: 2024-10-29 03:01:25

BTrace工具简介的相关文章

JS内存泄漏 和Chrome 内存分析工具简介(摘)

原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱 原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - ARIGATO 链接:http://web.jobbole.com/88463/ 点击 → 了解如何加入专栏作者 了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读

pt-online-schema-change工具简介

1.工具简介 pt-online-schema-change是percona提供的一个mysql在线修改表结构的工具 2.使用场景 当需要修改线上数据库中某个表的表结构时,发现这个表的数据量比较大,如果使用alter table语句的话可能会阻塞较长的时间,那么可以考虑使用pt-online-schema-change在线修改表结构,而不用担心阻塞应用 3.工作原理 对于要修改表结构的表,pt-online-schema-change首先会创建一个该表的拷贝,这里只拷贝表结构而不涉及到数据,然后

htop,glances和dstat工具简介

htop,glances和dstat工具简介 简介:htop,glances以及dstat是三个性能检测工具 一.htop命令: 语法:htop [options] 如图,我们键入htop后就会出现这个界面 左上部分的1,2,3,4表示我的机器是四核的,显示他们的利用情况.还有内存和交换空间使用情况.中间大部分显示是进程的相关情况.右上部分显示当前的任务数,有多少是在运行,以及负载使用情况. 1.交互式命令(直接在终端输入htop后,进入交互式界面,以下的选项都是指按键操作): (1)u: 过滤

rman备份工具简介

RMAN工具简介: 备份的文件: 数据文件 归档日志 控制文件(当前控制文件) spfile 自动管理备份相关元数据 文件名称 完成备份的scn 以数据块为单位,只备份使用过的数据块(物理层面判断是否使用) 备份时查询块状态,备份瞬间有修改块 等待块使用完成再备份 因此不会出现块分离 对备份出来的文件进行压缩 自身压缩+支持压缩参数 加参数压缩 5:1 自动检测数据块是否损坏 块损坏,不对其备份 支持增量备份 使用rman前提条件: 正确的环境变量 正确的实例名 sys用户操作(推荐) 监听不支

55种开源数据可视化工具简介

55种开源数据可视化工具简介 雪姬 2015-04-21 11:47:56 数据可视化 评论(2)   数据时代数据可视化成为理解和表达数据的有效甚至是唯一的手段. 一共56个,盘点最实用的大数据可视化分析工具 工欲善其事必先利其器,本文对55个流行的数据可视化工具开源协议,主页,文档,案例等资源的进行简单介绍,其中包括著名的D3.js,R,Gephi,Raphaël,Processing.js,Tableau Public,Google Chart Tools,Arbor.js等,资料来源ht

源代码管理工具简介

#一. 源代码管理工具简介* 有必要给大家的介绍一下,如果不说的话,大家都不知道它是干嘛的,首先我们要逐渐的建立器一个感受,对源代码管理工具的一个感觉. * 为什么会出现源代码管理工具? * 首先它得有一定的功能,对不对?任何的发明创造,都是为了解决人类的问题的,对不对?甚至一些语法规则的发明也是为了解决一定的问题的,对不对? * 我随便举个例子啊,举个简单的例子同学们理解一下,比如说像以前我们为了存储一个整形数据,是不是发明了一个叫int 类型的.后来发现不太靠谱,因为他只能存一个整数,所以就

linux下面的性能分析工具简介

iostat 命令详解 iostat用于输出cpu和磁盘I/O相关的统计信息.命令格式: Usage: iostat [ options ] [ <interval> [ <count> ] ] Options are: [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ] [ -j { ID | LABEL | PATH | UUID | ... } [ <devi

C语言工具简介

1 自动化测试: 测试代码重要性不言而喻,通过测试的自动化,生活会变得很轻松.几乎所有的程序员也都在使用自动化测试.C语言的测试框架也很多, 比如AceUnit:http://aceunit.sourceforge.net/projects/aceunit 如果你写的是命令行工具,用的是Unix命令行,可以使用shunit2工具,它允许创建shell脚本来测试脚本和命令. http://code.google.com/p/shunit2 2 GCC的优化 gcc可以自动进行很多优化,默认情况下是

(转)Synopsys工具简介

DC Ultra--Design Compiler的最高版本 在Synopsys软件中完整的综合方案的核心是DC UltraTM,对所有设计而言它也是最好级别的综合平台.DC Ultra添加了全面的数据通路和时序优化技术,并通过工业界的反复证明.DC Ultra具有独特的优化技术,能满足今天设计的各种挑战.DC Ultra提供快速的具有先进水平的数据通路优化技术,能建立快速关键路径时序.另外,DC Ultra采用后布局和优化布线技术,易于较快达到时序收敛.DC Ultra已在工业界确立了领先地位