为了账号安全,请及时绑定邮箱和手机立即绑定

BTrace简介与使用说明

标签:
Java

   简介

    Btrace (Byte Trace)是sun推出的一款java 动态、安全追踪工具,可以不停机的情况下监控线上情况,并且做到最少的侵入,占用最少的系统资源。BTrace应用较为广泛的原因应该是其安全性和无侵入性,其中热交互技术,使得我们无需启动Agent的情况下动态跟踪分析,其安全性不会导致对目标Java进程的任何破坏性影响,使得BTrace成为我们线上产品问题定位的利器。无侵入性无需我们对原有代码做任何修改,降低上线风险和测试成本,并且无需重启启动目标Java进程进行Agent加载即可动态分析和跟踪目标程序,可以说BTrace可以满足大部分的应用场景。

   安装

    下载BTrace

     BTrace已经迁移到GitHub, 最新到版本是v1.3.11  下载 https://github.com/btraceio/btrace/releases/download/v1.3.11/btrace-bin-1.3.11.zip 后解压到指定目录

       配置BTRACE_HOME

1vi .bash_profile

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/HomeBTRACE_HOME=/Users/david/Downloads/btrace-bin-1.3.11PATH=$PATH:$BTRACE_HOME/bin:$JAVA_HOME/bin:$HOME/binexport JAVA_HOMEexport BTRACE_HOMEexport PATH

 配置完成后执行  source .bash_profile

  在终端中输入btrace 可以看到如下内容


$ btraceUsage: btrace <options> <pid> <btrace source or .class file> <btrace arguments>where possible options include:  --version             Show the version  -v                    Run in verbose mode  -o <file>             The path to store the probe output (will disable showing the output in console)-u                    Run in trusted mode  -d <path>             Dump the instrumented classes to the specified path  -pd <path>            The search path for the probe XML descriptors  -classpath <path>     Specify where to find user class files and annotation processors  -cp <path>            Specify where to find user class files and annotation processors  -I <path>             Specify where to find include files  -p <port>             Specify port to which the btrace agent listens for clients  -statsd <host[:port]> Specify the statsd server, if any

  

BTrace使用

  1. jps命令查出需要监控的jvm pid

  2. 编写BTrace跟踪程序 

  3. 执行:btrace <pid> BTrace跟踪程序

BTrace注解

     

 @ProbeClassName

       用于标记处理方法的参数,仅用户@OnMethod, 该参数的值就是被跟踪的类名称

   @ProbeMethodName

       用于表姐处理方法的参数,仅用户 @OnMethod,该参数值是被跟踪方法名称

   @Self

     当前截取方法的封闭实例参数

@Return

    当前截取方法的的返回值, 只对 location=@Location(Kind.RETURN) 生效

@Duration

    当前截取方法的执行时间

@TargetInstance

 当前截取方法内部调用的实例

@TargetMethodOrField

   当前截取方法内部被调用的方法名

  @OnMethod

     作用

       用于指定跟踪方法到目标类,目标方法和目标位置

    格式

     @OnMethod(clazz=<cname_spec>[, method=<mname_spec>]? [, type=<signature>]? [, location=<location_spec>]?)

    参数说明

         clazz  用户限定目标类

        cname_spec = <class_name> | +<class_name> | /regex/  class_name 是完全限定类名 +class_name 完全限定类名称前加上“+”表示这个类的所有子类或实现,/regex/就是用户识别类名称的标准正则表达式

      method 用户限定目标方法, mname_spec表示简单的方法名称,不包含签名和返回类型;

      type:用户限定目标方法的签名和返回类型 <return_type> ((arg_type(,arg_type)*)?  return_type就是方法的返回类型,如void, java.lang.String; arg_type就是参数类型

     location 用于限定目标方法的位置, 通过@Location注解进行指定

       @Location 属性有:

  1. value 默认值为Kind.ENTRY 即参数的入口位置

  2. where 限定探测位置 默认值为 Where.BEFORE 也可以设置为Where.AFTER

  3. clazz

  4. method

  5. field

  6. type

  7. line

     其中 @Kind注解的值有

  • Kind.ENTRY-被trace方法参数

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

  • Kind.THROW -抛异常

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

  • Kind.CATCH -捕获异常

  • Kind.FIELD_SET -属性值

  • Kind.LINE -行号

  • Kind.NEW -类名

  • Kind.ERROR -抛异常

    获取截取方法 类,方法,实例,返回值以及耗时信息


@BTracepublic class TracingScript {    @OnMethod(clazz="+java.util.Map",method="put",location=@Location(Kind.RETURN))  public static void testB(@ProbeClassName String pcm,@ProbeMethodName String pmn,@Self Object self,@Duration long duration,@Return  Object result){           println(strcat(strcat(strcat(strcat(pcm,"#"),pmn)," called in"),str(self)));            println(strcat(strcat("result is ",str(result)),strcat(" duration is ",str(duration))));                      }       }

  输出的结果是:

 


java.util.HashMap#put called in{name=javax.management.ObjectName$Property@338bf6b2, type=javax.management.ObjectName$Property@6f24f3ca}result is null duration is 2488java.util.HashMap#put called in{javax.management.ObjectName=java.lang.Object@74685cec}result is null duration is 5692java.util.HashMap#put called in{type=javax.management.ObjectName$Property@582e822b}result is null duration is 2957java.util.HashMap#put called in{name=javax.management.ObjectName$Property@10dc9047, type=javax.management.ObjectName$Property@582e822b}result is null duration is 2683

  获取截取方法内部调用实例以及方法


@OnMethod(clazz="+java.util.Map",method="get",location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/"))     public static void testA(@ProbeClassName String pcm, @TargetInstance Object target, @TargetMethodOrField String field){               println(strcat("target is",strcat(strcat(str(target),"#"),field)));        }

  输出的结果是:

12target isjava.io.ObjectStreamClass$WeakClassKey@3952cb51#hashCodetarget isjava.io.ObjectStreamClass$WeakClassKey@3952cb51#equals

  

 

@OnTimer

   用于指定跟踪操作定时执行。

@OnError

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

原文出处:https://www.cnblogs.com/wei-zw/p/9502274.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消