BTrace-无代码侵入的Java调试工具

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”即可

原文地址:https://www.cnblogs.com/lichmama/p/13541759.html