使用btrace可以在不改進代碼,不影響當前線上運行的基礎上進行運行時環境的跟蹤,可以免去打日誌,發部等繁瑣的工作
使用Btrace可以從官網上下載相應二進制文件
下載地址爲:http://kenai.com/projects/btrace/downloads
下載後解壓,需要配置環境變量
將目錄 btrace/bin 配置到自己的PATH環境變量中, 同進也可以將btrace/build配置到classpath當中去
LINUX下編輯/etc/profile文件,可將上述配置弄好,然後執行source /etc/profile可使用變量生效
配置完成後在終端執行 btrace 命令,若出現如下結果表明安裝正確
Usage: btrace <options> <pid> <btrace source or .class file> <btrace arguments>
where possible options include:
-classpath <path> Specify where to find user class files and annotation processors
-cp <path> Specify where to find user class files and annotation processors
-I <path> Specify where to find include files
-p <port> Specify port to which the btrace agent listens for clients
嘗試第一個BTrace應用
編寫測試類 Case1 and CaseObject
import java.util.Random;
public class Case1{
public static void main(String[] args) throws Exception{
Random random=new Random();
CaseObject object=new CaseObject();
boolean result=true;
while(result){
result=object.execute(random.nextInt(1000));
Thread.sleep(1000);
}
}
}
class CaseObject{
private static int sleepTotalTime=0;
public boolean execute(int sleepTime) throws Exception{
System.out.println("sleep: "+sleepTime);
sleepTotalTime+=sleepTime;
Thread.sleep(sleepTime);
return true;
}
}
第二步,編寫BTrace角本 TraceMethodArgsAndReturn.java
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;
@BTrace
public class TraceMethodArgsAndReturn{
@OnMethod(
clazz="CaseObject",
method="execute",
location=@Location(Kind.RETURN)
)
public static void traceExecute(@Self CaseObject instance,int sleepTime,@Return boolean result){
println("call CaseObject.execute");
println(strcat("sleepTime is:",str(sleepTime)));
println(strcat("sleepTotalTime is:",str(get(field("CaseObject","sleepTotalTime"),instance))));
println(strcat("return value is:",str(result)));
}
}
注意,在這裏我們兩個文件都放在同一個目錄,同時需要將第一個java文件編譯成class文件,即字節碼
將Case1程序運行起來,他將是一個無限循環的程序,這樣可以保證一直在運行,方便我們去捕獲運行時的一些信息
下一步我們將用jps命令去查看case1進程的pid是多少, 假如我們獲得的Case1的pid是4444
最後一步我們將執行btrace角本去獲得相關信息, 執行命令如下
btrace <options> <pid> <btrace source or .class file> <btrace arguments>
在我們這個實例中就是:
btrace 4444 TraceMethodArgsAndReturn.java
執行完後你就可以看到效果了啦.........................