btrace使用

btrace使用

目录btracee是btrace的解压目录

btrace/btrace是btrace的项目工程

root@ubuntu:/usr/local/bogon/btrace# tree btrace
btrace
├── bin
├── btrace-agent.jar
├── btrace-boot.jar
├── btrace-client.jar
└── src
    ├── btrace
    ├── HelloWorld.class
    ├── HelloWorld.java
    └── TraceHelloWorld.java

3 directories, 6 files
root@ubuntu:/usr/local/bogon/btrace# cd -
/usr/local/bogon
root@ubuntu:/usr/local/bogon# tree btrace
btrace
├── bin
│   ├── btrace
│   ├── btrace.bat
│   ├── btracec
│   ├── btracec.bat
│   ├── btracer
│   └── btracer.bat
├── btrace
│   ├── bin
│   ├── btrace-agent.jar
│   ├── btrace-boot.jar
│   ├── btrace-client.jar
│   └── src
│       ├── btrace
│       ├── HelloWorld.class
│       ├── HelloWorld.java
│       └── TraceHelloWorld.java
├── btrace-bin.tar.gz
├── btrace.zip
├── build
│   ├── btrace-agent.jar
│   ├── btrace-boot.jar
│   └── btrace-client.jar
├── COPYRIGHT
├── docs

在src目录直接执行btrace pid TraceHelloWorld.java

# ../../bin/btrace 9221 TraceHelloWorld.java
the class name=>HelloWorld
the class method=>execute
the class method params=>1498
the class method execute time=>1499
-------------------------------------------
the class name=>HelloWorld
the class method=>execute
the class method params=>1903
the class method execute time=>1903
-------------------------------------------

如:TraceHelloWorld

# cat TraceHelloWorld.java 

import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.str;
import static com.sun.btrace.BTraceUtils.strcat;
import static com.sun.btrace.BTraceUtils.timeMillis;

import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.ProbeClassName;
import com.sun.btrace.annotations.ProbeMethodName;
import com.sun.btrace.annotations.TLS;
@BTrace
public class TraceHelloWorld {

        @TLS
        private static long startTime = 0;

        @OnMethod(clazz = "HelloWorld", method = "execute")
        public static void startMethod(){
                startTime = timeMillis();
        }

        @OnMethod(clazz = "HelloWorld", method = "execute", location = @Location(Kind.RETURN))
        public static void endMethod(){
                println(strcat("the class method execute time=>", str(timeMillis()-startTime)));
                println("-------------------------------------------");
        }

        @OnMethod(clazz = "HelloWorld", method = "execute", location = @Location(Kind.RETURN))
        public static void traceExecute(@ProbeClassName String name,@ProbeMethodName String method,int sleepTime){
                println(strcat("the class name=>", name));
                println(strcat("the class method=>", method));
                println(strcat("the class method params=>", str(sleepTime)));

        }
}

比如我这里跟踪Jedis的连接ConnectionTrace

import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.timeMillis;

import com.sun.btrace.BTraceUtils.Threads;
import com.sun.btrace.annotations.Export;
import com.sun.btrace.annotations.OnExit;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.Return;
import com.sun.btrace.annotations.Self;
import com.sun.btrace.annotations.TLS;

public class ConnectionTrace {
	@TLS
	private static long startTime = 0;
	
	 @Export private static long openedCount; 
	 @Export private static long penedCount; 
	 @Export private static long closedCount; 
	 
	 
	@OnMethod(clazz = "/*.jedis.Connection/", method = "makeObject")
	public static void startMethod(@Return Object obj){
		startTime = timeMillis();
		penedCount++;  
        println("One connection is opened!");  
        println(obj);  
        Threads.jstack();  
	}
	
	@OnMethod(clazz = "/*.jedis.Connection/", method = "destroyObject")
	public static void endMethod(@Self Object obj){
		closedCount++;  
        println("One connection is closed!");  
	    println(obj);  
	    Threads.jstack();
	}
	
	@OnExit  
    public static void f(){  
          println("Total opened connection:");  
          println(openedCount);  
          println("Total closed connection:");  
          println(closedCount);   
    }  
}
原文地址:https://www.cnblogs.com/donganwangshi/p/4253317.html