zoukankan      html  css  js  c++  java
  • 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”即可

  • 相关阅读:
    第09组 Alpha事后诸葛亮
    第09组 Alpha冲刺(4/4)
    第09组 Alpha冲刺(3/4)
    第09组 Alpha冲刺(2/4)
    第09组 Alpha冲刺(1/4)
    机器学习第二次作业
    机器学习第一次作业
    机器学习第一次个人作业
    第04组 Beta冲刺(4/4)
    第04组 Beta冲刺(3/4)
  • 原文地址:https://www.cnblogs.com/lichmama/p/13541759.html
Copyright © 2011-2022 走看看