Btrace简介
Btrace在程序运行的情况下动态的修改程序里的字节码,达到监控调试的目的
Btrace可以动态地向目标应用程序的字节码注入追踪代码
使用的技术:JavaComplierApi、JVMTI、Agent、Instrumentation+ASM
Btrace安装(windows)
新建环境变量BTRACE_HOME
添加path: %BTRACE_HOME%\bin
演示代码
public class Btrace {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
System.out.println("start");
while(true){
read(args[0]);
Thread.sleep(10000);
}
}
public static String read(String arg){
System.out.println("hello,"+arg);
return arg;
}
}
如何在生产环境下获取read(String arg)方法中的arg参数
运行Btrace.jar(windows)
c:\>cd /d e:\
e:\>java -jar Btrace.jar 123
start
hello,123
hello,123
…
C:\Program Files\Java\jdk1.8.0_74\bin>jps
11396 jar
执行btrace脚本
Btrace脚本在escplise编写时所需jar
编写Btrace脚本
Btrace非常像拦截器
import com.sun.btrace.AnyType;
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 PrintArgSimple {
@OnMethod(
clazz="com.pcitc.Btrace",
method="read",
location=@Location(Kind.ENTRY)
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.printArray(args);
BTraceUtils.println(pcn+","+pmn);
BTraceUtils.println();
}
}
在哪个类(clazz)的哪个方法(method)在什么时候(location)[ENTRY一进入该方法时]进行拦截
@ProbeClassName 拦截方的类名
@ProbeMethodName 拦截的方法名
AnyType[] args 方法的参数
运行Btrace脚本
使用命令 btrace <pid> <trace_script>
C:\Users\Administrator>cd /d e:\
e:\>btrace 11396 E:\PrintArgSimple.java
[123, ]
com.pcitc.Btrace,read
[123, ]
com.pcitc.Btrace,read
安装Btrace.jar(linux)
mkdir btrace
cd btace
tar –xzvf btrace-bin-1.3.11.tgz.tar.gz
执行Btrace.jar(linux)
cd /opt
java -jar Btrace.jar 123
##一个窗口
jps (14381 jar)
cd /opt/btrace/bin
./btrace 14381 /opt/PrintArgSimple.java
##运行结果
[123, ]
com.pcitc.Btrace,read
[123, ]
com.pcitc.Btrace,read