来源《深入理解java虚拟机》
书中第四章提到一个VisualVM插件,叫做BTrace,竟然可以在不改变原有代码也不停进程的基础上,
在进程嵌入一段代码,获取进程中的一些方法参数和返回值。
首先执行以下代码,在命令行输入一行,就可以进行一次随机数加法
但是只打印了结果,我们并不清楚入参是什么
package com.example; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * * @Date : 2023/2/23 13:43 * @Description: */ 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)); } } }
如果想要知道某一次计算的a,b是什么,可以打开VisualVM,安装插件BTrace
在BTrace中输入这么一段代码,点击start
@BTrace public class TracingScript { /* put your code here */ @OnMethod( clazz="com.example.BTraceTest", method="add", location=@Location(Kind.RETURN) ) public static void func(@Self com.example.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))); } }
就可以获取输出
* Starting BTrace task ** Compiling the BTrace script ... *** Compiled ** Instrumenting 1 classes ... *** Done ** BTrace up&running *** Done ** BTrace up&running 调用堆栈: com.example.BTraceTest.add(BTraceTest.java:14) com.example.BTraceTest.main(BTraceTest.java:24) 方法参数A:349 方法参数B:756 方法结果:1105 调用堆栈: com.example.BTraceTest.add(BTraceTest.java:14) com.example.BTraceTest.main(BTraceTest.java:24) 方法参数A:694 方法参数B:99 方法结果:793 ** BTrace has stopped ** BTrace has stopped
真让人大开眼界!
标签:java,int,BTrace,使用,com,example,BTraceTest From: https://www.cnblogs.com/wangbin2188/p/17147782.html