BTrace简介
BTrace是一种安全,动态的Java跟踪工具。BTrace通过动态(字节码)检测正在运行的Java程序的类来工作。BTrace将跟踪操作插入到正在运行的Java程序的类中,并对跟踪的程序类进行热交换。
相关信息参考
https://github.com/btraceio/btrace/wiki https://www.cnblogs.com/danny-djy/p/9990566.html https://blog.csdn.net/wwd0501/article/details/94485618
关于BTrace就不做过多介绍了,通过百度或上面的链接可自行了解,这里只是简单体验下BTrace的调试过程。
>> LET'S DO THIS!
部署BTrace,从github的releases页面下载最新的二进制包(v2.0.2),将下载的压缩包解压:
mkdir btrace-2.0.2/ tar -zxf btrace-2.0.2-bin.tar.gz -C btrace-2.0.2/
编写测试用的目标程序:Test.java
import java.io.*; import java.util.*; public class Test { public String dofunc(int id) { return "ret_" + id; } public static void main(String[] args) { Random random = new Random(); Test test = new Test(); while (true) { test.dofunc(random.nextInt(100)); try { Thread.sleep(500); } catch(Exception e) {} } } }
改程序启动后,会每隔500ms调用一次dofunc方法,入参是一个整数,并返回一个字符串。
假设程序在调用dofunc时出现了问题,我们一般的做法时先去查看入参和返回值是否正常,基于这个思路我们来写一个调试脚本:Trace.java
import static org.openjdk.btrace.core.BTraceUtils.println;
import org.openjdk.btrace.core.annotations.BTrace; import org.openjdk.btrace.core.annotations.Duration; import org.openjdk.btrace.core.annotations.Kind; import org.openjdk.btrace.core.annotations.Location; import org.openjdk.btrace.core.annotations.OnMethod; import org.openjdk.btrace.core.annotations.Return; @BTrace public class Trace { @OnMethod(clazz = "Test", method = "dofunc") public static void before(int id) { println(" ==== before Test#dofunc ===="); println("id: " + id); } @OnMethod(clazz = "Test", method = "dofunc", location = @Location(Kind.RETURN)) public static void after(@Return Object ret, @Duration long time) { println(" ==== after Test#dofunc ===="); println("return: " + ret); println("cost time: " + time); } }
调试脚本只要做了2件事,1在dofunc方法调用前输出入参,2在dofunc方法调用后输出返回值。
具体调试步骤:
1.找到运行中的Test程序的PID,可通过jps:
jps -lvm | grep Test
2.启动BTrace程序:
cd btrace-2.0.2/ bin/btrace -cp libs $target-pid Trace.java
实际运行如下图所示:
能看出BTrace确实可以在程序不停机,无代码侵入的情况下进行实时调试,这点在线上定位排障非常的实用。神器,大赞!
PS:退出调试只需要按Ctrl+C,并输入“1”即可