Btrace的使用

本文主要介绍BTrace的使用

1.简单使用Demo

    》新建一个工程,目录如下所示:

       

    》》运行一个app程序。源码如下:

          

import org.apache.commons.lang3.StringUtils;

import java.util.Random;

/**
 * Created by dell on 2016/12/18.
 */
public class BtraceTest
{
    public static void main(String[] args)
    {
        String[] strs = {"", "1", "2"};
        Random random = new Random();

        String str;
        while (true)
        {
            str = getStr(strs, random);
            if (StringUtils.isEmpty(str))
            {
                System.out.println("It is impty.");
            }
            else
            {
                System.out.println("It is " + str);
            }

            try
            {
                Thread.sleep(5000);
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

    private static String getStr(String[] strs, Random random)
    {
        int index = random.nextInt(strs.length);

        return strs[index];
    }
}

    》》》Btrace脚本(Demo1.java),源码如下:

import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.*;

import java.util.Random;

@BTrace
public class Demo1
{
    @OnMethod(clazz = "BtraceTest",method = "getStr", location = @Location(Kind.RETURN))
    public static void m2(String[] strs, Random random, @Return String str)
    {
        BTraceUtils.println(str);
        BTraceUtils.println();
        BTraceUtils.println();
    }
}

    》》》》将脚本拷贝到${BTRACE_HOME}/samples下面,修改该文件的权限为可执行(和app程序运行的用户为同一个用户)。

   》》》》》运行app程序,在相同的用户下运行Btrace脚本,格式为${BTRACE_HOME}/bin/btrace app的pid Btrace脚本(Demo1.java),本实例使用如下命令执行:

 

zm@Inspiron:~/app/bin$ ./btrace `ps -ef |grep Btrace|grep -v grep|awk '{print $2}'` ../samples/Demo1.java
    》》》》》》可以观察该函数中的返回值。

2.使用自定义的shell脚本运行Btrace脚本,来跟踪自己的类中的数据。

    一般情况下,app程序引用三方jar包(非btrace jar包),并且跟踪的类时在三方包中,这时候就需要自己重新写一个shell脚本(或着修改已有的脚本)来运行btrace脚本了。

   举例:跟踪Apache jar包中的StringUtils.isempty(CharSequence chars)方法。app程序和上例中的一致。btrace脚本源码(Demo.java)如下:

import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;


@BTrace
public class Demo
{
    @OnMethod(clazz = "org.apache.commons.lang3.StringUtils", method = "isEmpty", location = @Location(Kind.ENTRY))
    public static void m1(java.lang.CharSequence chars)
    {
        BTraceUtils.println(chars);
        BTraceUtils.println("");
        BTraceUtils.println("");
    }
}

运行该btrace脚本使用的shell脚本(run.sh)如下:

#! /bin/sh

CUR_PATH=`pwd`
BTRACE_HOME=$(dirname "${CUR_PATH}")

#get class_path of app
for  s  in $(ls ${BTRACE_HOME}/build/*  |grep ".jar")
do
    CLASS_PATH_1=`echo $s`:${CLASS_PATH_1}
done

if [ -f "${BTRACE_HOME}/build/btrace-client.jar" ] ; then
    if [ "${JAVA_HOME}" != "" ]; then
         TOOLS_JAR="${JAVA_HOME}/lib/tools.jar"
        ${JAVA_HOME}/bin/java -cp ${CLASS_PATH_1}${TOOLS_JAR} com.sun.btrace.client.Main $*
    else
       echo "Please set JAVA_HOME before running this script"
       exit 1
    fi
else
    echo "Please set BTRACE_HOME before running this script"
    exit 1
fi

    》》》可以将Demo.java 和 run.sh放在${BTRACE_HOME}/samples,修改完权限以后,直接在app程序运行的用户下执行${BTRACE_HOME}/samples app的pid Demo.java

3.定时查看内存的脚本(每4秒打印一次),源码:

import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.OnTimer;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TraceMemory
{
    //heapUsage()/nonHeapUsage() – 打印堆/非堆内存信息,包括init、used、commit、max
    @OnTimer(4000)
    public static void printM()
    {
        //打印内存信息
        println("heap:");
        println(heapUsage());
        println("no-heap:");
        println(nonHeapUsage());
    }
}


你可能感兴趣的:(Btrace的使用)