当我们的线上环境出现问题,而又没有日志打印出来时,生产环境又不能远程debug,这个时候要怎么办呢?
能不能在程序运行的时候查看程序正在执行的入参,出参,执行过程等。Btrace就是一个好用的工具来动态的跟踪正在运行的Java程序。
1 下载Btrace,解压到本地的目录中。
wget -c https://github.com/btraceio/btrace/releases/download/v1.3.11.3/btrace-bin-1.3.11.3.tgz tar -xf btrace-bin-1.3.11.3.tgz -C mkdir ~/software/btrace tar -xf btrace-bin-1.3.11.3.tgz -C ~/software/btrace ls ~/software/btrace CHANGELOG.md LICENSE README.md bin docs COPYRIGHT LICENSE-3RD-PARTY.txt THIRDPARTYLICENSEREADME.txt build samples ~/software/btrace/bin/btrace --version BTrace v.1.3.11.3 (20181217) 复制代码
2 编写Btrace脚本,前提是首要要有我们生产环境的代码可以用于trace,首先提供一段生产环境中MVC的代码。
@RequestMapping("/btrace") @ResponseBody public Set btraceTest( String s1, String s2 ){ HashSet<Object> set = new HashSet<>(); set.add(s1); set.add(s2); return set; } 复制代码
3 导入我们的Btrace包下的jar包,引入项目,进行使用。
ls ~/software/btrace/build btrace-agent.jar btrace-boot.jar btrace-client.jar i386 复制代码
4 编写Btrace脚本,以刚才的MVC 入口为例。
package me.aihe.jmxdemo; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.*; import java.util.Set; @BTrace public class BtraceDemo { @OnMethod(clazz = "me.aihe.jmxdemo.JmxdemoApplication", method = "btraceTest", location = @Location(Kind.RETURN)) public static void methodDetail(@Self Object self, String s1, String s2, @Return Set result, @Duration long time) { BTraceUtils.println(); BTraceUtils.println(); BTraceUtils.println("方法调用栈: "); BTraceUtils.println("入参1:" + s1 + ",入参2:" + s2); BTraceUtils.println("返回值: result=" + result); BTraceUtils.println("时间(ns): " + time); BTraceUtils.println(); } } 复制代码
5 查看我们正在运行的JVM程序,获取其PID,然后使用Btrace执行脚本
jps 26040 JmxdemoApplication # 语法:btrace pid btrace脚本位置 ~/software/btrace/bin/btrace 26040 /Users/aihe/IdeaProjects/jmxdemo/src/main/java/me/aihe/jmxdemo/BtraceDemo.java 复制代码
6 还有更多的使用案例,在下载的包中已经有提供: