btrace 是一个可以不用重启线上java业务查问题的神器,安全可靠的动态跟踪工具。下面说一下btrace在windows和linux环境下的使用。
github地址:https://github.com/jbachorik/btrace
下载之后可以分别在windows和linux下解压。
一、Win7
首先配置环境变量
注意一定要配置变量名BTRACE_HOME,btrace脚本里面会引用到,不然报错。
第二,编写btrace诊断脚本,需要用到btrace安装路径/build下的几个jar包(btrace-agent.jar,btrace-boot.jar,btrace-client.jar),引入到要编写诊断脚本的项目里。
具体怎么编写脚本,请到网上查btrace的详细用法,下面只是举个例子:
package btrace;
import static com.sun.btrace.BTraceUtils.printArray;
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.Return;
import com.sun.btrace.annotations.Self;
@BTrace
public class SelfAndArgTest {
@OnMethod(clazz="+cn.remotejob.service.IJobService",method="getJob",location=@Location(Kind.RETURN))
public static void onDetail(@Self Object self,int id,@Return AnyType val){
BTraceUtils.println("self="+self+",id="+id+",val="+val);
BTraceUtils.println(); //must add println(),otherwise can not print the last record
}
@OnMethod(clazz="cn.remotejob.web.JobController",method="detail",location=@Location(Kind.RETURN))
public static void onDetail(@Self Object self,AnyType[] args,@Return AnyType val){
printArray(args);
BTraceUtils.println("val="+val);
BTraceUtils.println(); //must add println(),otherwise can not print the last record
}
}
接下来在命令窗口执行命令btrace 99336 E:/workspace/test/src/btrace/SelfAndArgTest.java
其中99336是要诊断的java应用程序的进程ID,E:/workspace/test/src/btrace/SelfAndArgTest.java是btrace诊断脚本。
二、CentOS
和Windows下类似。首先配置环境变量,vim /etc/profile
JAVA_HOME=/xxx/jdk1.7.0_79
BTRACE_HOME=/xxx/btrace-bin-1.3.10
PATH=$BTRACE_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:$JAVA_HOME/bin:/root/bin:$M2_HOME/bin
注意,请将$BTRACE_HOME变量配置到PATH的最前面,不然可能会报以下错误
Invalid path 7584 specified: 2/No such file or directory
这是因为CentOS系统下已经有了一个同名的命令btrace,导致真正的btrace诊断命令并没有被执行。
可以通过which btrace确认路径是否是你的btrace配置路径。
好了,保存文件。
使修改的配置生效:source /etc/profile
把btrace诊断脚本SelfAndArgTest.java放到一个位置,执行btrace命令就行了。