BTrace入门

来源:互联网 发布:怎么下载spss软件 编辑:程序博客网 时间:2024/05/19 19:32

简介
BTrace是一种动态跟踪分析一个运行中的Java应用程序的工具。BTrace动态地向目标应用程序的字节码注入追踪代码(字节码追踪),也就是BTrace脚本。
BTrace脚本和Java差别不大,只是使用了一些annotation来标识某个类是跟踪脚本。
BTrace应运而生,可以动态地跟踪java运行程序,将跟踪字节码注入到运行类中,对运行代码侵入较小,对性能上的影响可以忽略不计。被称为”线上排查的利器”;
BTrace的最大好处,是可以通过自己编写的脚本,获取应用的一切调用信息。而不需要不断地修改代码,加入System.out.println(), 然后重启应用。同时,特别严格的约束,保证自己的消耗特别小,只要定义脚本时不作大死,直接在生产环境打开也没影响。
由于BTrace会把脚本逻辑直接侵入到运行的代码中,为了确保信息的安全性,所以在使用上做了很多限制:
1、不能创建新对象、新数组。
2、不能抛出或捕获异常
3、所有可调用的Btrace方法必须是static public void类型的,所有可调用的Btrace属性也必须是static类型的
4、不能创建外部类,内部类,嵌套类或本地类
5、不能有同步代码块或同步方法,不能使用synchronized关键字
6、不能循环(while, for ..)
7、不能实现继承与接口
8、不能创建断言与字面量
不恰当的使用BTrace可能导致JVM崩溃,如在BTrace脚本使用错误的class文件,所以在上生产环境之前,务必在本地充分的验证脚本的正确性。
Btrace可以做什么?
1、接口性能变慢,分析每个方法的耗时情况;
2、当在Map中插入大量数据,分析其扩容情况;
3、分析哪个方法调用了System.gc(),调用栈如何;
4、执行某个方法抛出异常时,分析运行时参数。
参数说明
@OnMethod
Btrace使用@OnMethod注解定义需要分析的方法入口
这里写图片描述
在@OnMethod注解中,需要指定class、method以及location等,class表明需要监控的类,method表明需要监控的方法,指定方式如下:
1、使用全限定名:clazz=”com.metty.rpc.common.BtraceCase”, method=”add”
2、使用正则表达式:clazz=”/javax.swing../”, method=”/./”
3、使用接口:clazz=”+com.ctrip.demo.Filter”, method=”doFilter”
4、使用注解:clazz=”@javax.jws.WebService”, method=”“@javax.jws.WebMethod”
5、如果需要分析构造方法,需要指定method=””

@Location
定义Btrace对方法的拦截位置,通过@Location注解指定,默认为Kind.ENTRY,Kind.RETURN,Kind.CALL,Kind.LINE和Kind.ERROR, Kind.THROW, Kind.CATCH

BTrace的安装
  BTrace的安装方式:VisualVM的插件形式存在
  VisualVM的BTrace插件安装, 通过其插件管理器来简单安装。

工具->插件->可用插件, 选择BTrace WorkBench安装。
这里写图片描述
BTrace的简单使用
被调试代码
public class Calculator {
public int add(int a,int b){
return a+b;
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
Calculator roboot = new Calculator();
while ( scanner.hasNext() ) {
int a = scanner.nextInt();
int b = scanner.nextInt();
int c = roboot.add(a, b);
System.out.println(c);
}
}
打开jvisualvm,选择Test程序,鼠标右击,选择”Trace application…”。在jvisualvm的文本框中录入如下代码。

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TracingScript {
@OnMethod(
clazz=”com.test.Calculator”, method=”add”, location=@Location(Kind.RETURN)
)
public static void func(
int a, int b,
@Return int result) {
println(“trace: =======================”);
jstack();
println(strcat(“a:”, str(a)));
println(strcat(“b:”, str(b)));
println(strcat(“result:”, str(result)));
}
}

勾选”output”,点击start按钮。
这里写图片描述

详细内容见大神整理:
http://www.jianshu.com/p/dbb3a8b5c92f

0 0