读书人

Btrace学习札记

发布时间: 2012-11-15 15:16:15 作者: rapoo

Btrace学习笔记

Btrace是java平台一个运行时的的监测、跟踪工具。

它有几个重要的概念:

Probe Point:探测点,意思是你想要跟踪程序的那个地方(方法执行的开始、结束,抛出、捕获异常的地方、甚至每一行)
Trace Ations:当目标程序运行到探测点时,你需要用Btrace脚本执行的动作。
Action Method:Trace Actions一般是一个个Action Method,一般是public static void修饰的。

脚本的组成:
一个Btrace脚本就是一个普通的用@Btrace注解的Java类,包含一个或多个Action Method,为了保证对目

标程序不造成影响,Btrace脚本对其可以执行的动作做了很多限制:
    不能创建对象不能抛出、捕获异常不能用synchronized关键字不能对目标程序中的instace、static变量不能调用目标程序的instance、static方法脚本的field、method都必须是static的脚本不能包括outer、inner、nested class脚本中不能有循环不能继承任何类、任何借口(其父类就是Object)不能有assert语句
命令行运行脚本:

btrace [-p 端口] [-cp 类路径] pid 你的脚本 脚本的参数

脚本可以进行编译后再运行:

btracec命令和btrace命令参数类似,多了-d参数,表示编译后的字节码的位置

可能有需求需要监控程序启动的情况,需要在应用启动时,同时运行btrace脚本:

java -javaagent:**/btrace-agent.jar=script=预编译的btrace脚本 应用的MainClass 应用的参数,如此的话,脚本的输出会保存到一个后缀为btrace的一个文件。


还有另一个方式(效果同java -javaagnet.........):
btracer 预编译的btrace脚本 应用的MainClass 应用的参数

书写脚本:
Btrace提供了一系列的注解,便于使用者告诉Btrace一些信息:
方法上的注解:

@OnMethod:指定使用当前注解的方法应该在什么情况下fire,

claszz属性指定要匹配的类的全限定类名,可以用正则表达式:/类名的Pattern/匹配,用“+类名”匹配所有子类,用“@某某注解”匹配用该注解注解过的类

method属性指定要匹配的方法名称,可以用正则表达式:/方法名称的Pattern/匹配

type属性:void (java.lang.String)可以用于匹配:public void funcName(String param) throws Exception

location属性用@Location来表明,匹配了clazz、method情况,在方法执行的何时去执行脚本(前、后、异常、行、某个方法调用)

@OnTimer:指定一个定时任务
@OnExit:当脚本运行Sys.exit(code)时触发
@OnError:当脚本运行抛出异常时触发
@OnEvent:脚本运行时Ctrl+C可以发送事件
@OnLowMemory:让你指定一个阀值,内存低于阀值触发
@OnProbe:可以用一个xml文件来描述你想在什么时候触发该方法

方法参数上的注解:
@Self:目标对象本身
@Retrun:目标程序方法返回值(Kind.RETURN)
@ProbeClassName:目标类名
@ProbeMethodName:目标方法名
@targetInstance:@Location指定的clazz、method的目标(Kind.CALL)
@targetMethodOrField:@Location指定的clazz、method的目标的方法或字段(Kind.CALL)
@Duration:目标方法执行时间
注意@Location中的值不同时,方法中能获取参数的信息是不同的

字段上的注解:
@TLS:使用threadlocal









读书人网 >系统运维

热点推荐