Btrace拦截this、入参、返回

this:@Self

入参:可以用AnyType,也可以用真实的类型

返回:@Return

简单类型:直接获取

复杂类型:反射,类名+属性名

获取对象的值

执行程序


import com.imooc.monitor_tuning.chapter2.User;

public class constructor {

    public static void main(String[] args) throws InterruptedException {

        while(true){

            read(new User(1,"meimei"));

            Thread.sleep(10000);

           

        }

    }

    public static User read(User user){

        System.out.println(user);

        return user;

    }

}

Btrace脚本


import java.lang.reflect.Field;

import com.imooc.monitor_tuning.chapter2.User;

import com.sun.btrace.BTraceUtils;

import com.sun.btrace.annotations.BTrace;

import com.sun.btrace.annotations.Kind;

import com.sun.btrace.annotations.Location;

import com.sun.btrace.annotations.OnMethod;

import com.sun.btrace.annotations.ProbeClassName;

import com.sun.btrace.annotations.ProbeMethodName;

@BTrace

public class PrintArgComplex {

    @OnMethod(

            clazz="com.pcitc.constructor",

            method="read",

            location=@Location(Kind.ENTRY)

    )

    public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, User user) {

        //print all fields

        BTraceUtils.printFields(user);  //打印User的所有字段

        //print one field

        Field filed2 = BTraceUtils.field("com.imooc.monitor_tuning.chapter2.User", "name");

        BTraceUtils.println(BTraceUtils.get(filed2, user)); //打印User的name字段

        BTraceUtils.println(pcn+","+pmn);

        BTraceUtils.println();

    }

}

运行效果


e:\>java  -jar E:\constructor.jar

id=1,name=meimei

id=1,name=meimei

##

C:\Program Files\Java\jdk1.8.0_74\bin>jps

528 constructor.jar



e:\>btrace -cp "E:\constructor"  528 E:\PrintArgComplex.java

{id=1, name=meimei, }

meimei

com.pcitc.constructor,read



{id=1, name=meimei, }

meimei

com.pcitc.constructor,read

因为User不是基本类型,所以要用-cp "E:\constructor" 指定User.class的路径(com.imooc.monitor_tuning.chapter2.User

 

正则表达式

执行程序


import com.imooc.monitor_tuning.chapter2.User;

public class constructor {

    public static void main(String[] args) throws InterruptedException {

        while(true){

            read(new User(1,"meimei"));

            Thread.sleep(10000);

           

        }

    }

    public static User read(User user){

        System.out.println(user);

        return user;

    }

}

Btrace脚本

import com.sun.btrace.BTraceUtils;

import com.sun.btrace.annotations.BTrace;

import com.sun.btrace.annotations.OnMethod;

import com.sun.btrace.annotations.ProbeClassName;

import com.sun.btrace.annotations.ProbeMethodName;

@BTrace

public class PrintRegex {

    @OnMethod(

            clazz="com.pcitc.constructor",

            method="/.*/"

    )

    public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn) {

        BTraceUtils.println(pcn+","+pmn);

        BTraceUtils.println();

    }

}

拦截该类下的所有方法,clazz和method都可以用正则表达式

运行效果


e:\>java  -jar E:\constructor.jar

id=1,name=meimei

id=1,name=meimei

##

C:\Program Files\Java\jdk1.8.0_74\bin>jps

7312 constructor.jar

e:\>btrace 7312 E:\PrintRegex.java

com.pcitc.constructor,read



com.pcitc.constructor,read

Windows下杀死线程的命令

taskkill /pid[进程码] -t(结束该进程) -f(强制结束该进程以及所有子进程)

C:\Program Files\Java\jdk1.8.0_74\bin>taskkill /pid 7820 /F

 

打印Jinfo

执行程序


import com.imooc.monitor_tuning.chapter2.User;

public class constructor {

    public static void main(String[] args) throws InterruptedException {

        while(true){

            read(new User(1,"meimei"));

            Thread.sleep(10000);

           

        }

    }

    public static User read(User user){

        System.out.println(user);

        return user;

    }

}

 

Btrace脚本


import com.sun.btrace.BTraceUtils;

import com.sun.btrace.annotations.BTrace;

@BTrace

public class PrintJinfo {

    static {

    BTraceUtils.println("System Properties:"); //系统属性

    BTraceUtils.printProperties();

    BTraceUtils.println("VM Flags:"); //虚拟机参数

    BTraceUtils.printVmArguments();

    BTraceUtils.println("OS Enviroment:");// 操作系统的环境变量

    BTraceUtils.printEnv();

    BTraceUtils.exit(0);

    }

}

类似于jinfo是输出

 

运行效果


e:\>java  -jar E:\constructor.jar

id=1,name=meimei

id=1,name=meimei

##

C:\Program Files\Java\jdk1.8.0_74\bin>jps

7312 constructor.jar

e:\>btrace 7312 E:\PrintJinfo.java

System Properties:

java.vm.version = 25.74-b02

sun.jnu.encoding = GBK

java.vendor.url = http://java.oracle.com/

java.vm.info = mixed mode

user.dir = e:\

sun.cpu.isalist = amd64

java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment

sun.os.patch.level = Service Pack 1

user.home = C:\Users\Administrator

java.io.tmpdir = C:\Users\ADMINI~1\AppData\Local\Temp\

java.awt.printerjob = sun.awt.windows.WPrinterJob

java.version = 1.8.0_74

file.encoding.pkg = sun.io

sun.stderr.encoding = ms936

java.vendor.url.bug = http://bugreport.sun.com/bugreport/

……

注意事项

默认只能本地运行,除非修改源码

生产环境下可以使用,但是被修改的字节码不会被还原,修改后,jvm不重启,被修改后的字节码还是被执行的,脚本不要太消耗资源,因为调试进程退出了,但字节码依然还会进行

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值