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的一个文件。
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