• VisualVM实现不中断程序和修改代码的前提下打印函数的入参和返回值


    在VisualVM中下载BTrace插件

    -w900

    安装此插件并激活

    写调试程序

    public class BTraceTest {
    
        public int add(int a, int b) {
            return a + b;
        }
    
        public static void main(String[] args) throws IOException {
            BTraceTest test = new BTraceTest();
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            for (int i=0; i < 10; i++) {
                reader.readLine();
                int a = (int) Math.round(Math.random() * 1000);
                int b = (int) Math.round(Math.random() * 1000);
                System.out.println(test.add(a, b));
            }
        }
    
    }
    

    运行并写在BTrace中写调试程序

    用VisualVM模式下进行调试

    -w1226

    找到运行的程序

    -w1190

    右击添加BTrace调试代码

    -w530

    -w1083

    /* BTrace Script Template */
    import com.sun.btrace.annotations.*;
    import static com.sun.btrace.BTraceUtils.*;
    
    @BTrace
    public class TracingScript {
    	/* put your code here */
      @OnMethod(
          clazz="com.baiyuliuguang.test.JVMTest.BTraceTest",
          method="add",
          location=@Location(Kind.RETURN)
        )
        public static void func(@Self com.baiyuliuguang.test.JVMTest.BTraceTest instance,int a, int b,@Return int result){
              
              println("调用堆栈:");
              jstack();
              println(strcat("方法参数A:", str(a)));
              println(strcat("方法参数B:", str(b)));
              println(strcat("方法结果:", str(result)));
            }
    }
    

    点击start开启调试

    -w1109

    运行结果

    -w1247

    -w1007

    可以对比看到运行结果与BTrace调试输出结果一致,但是我们没有增加任何源代码,只需要在BTrace中增加调试即可。

  • 相关阅读:
    [java学习]java聊天室通信原理
    竖变横表存储过程(万能型)
    到底是什么(反射,泛型,委托,泛型)
    删除表里重复记录两种方法
    三个SQL视图查出所有SQL Server数据库字典
    三种分页语句
    DBHelper
    SQL全局变量
    今天比较STRING和INT,很奇怪
    表之间数据交换与翻页存储过程
  • 原文地址:https://www.cnblogs.com/yantt/p/visualvm-shi-xian-bu-zhong-duan-cheng-xu-he-xiu-ga.html
Copyright © 2020-2023  润新知