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不重启,被修改后的字节码还是被执行的,脚本不要太消耗资源,因为调试进程退出了,但字节码依然还会进行