首页 > 其他分享 >BTrace使用

BTrace使用

时间:2023-02-23 14:25:24浏览次数:29  
标签:java int BTrace 使用 com example BTraceTest

来源《深入理解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

相关文章