BTrace使用
来源《深入理解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
真让人大开眼界!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性