BTrace使用简介

多时候在online的应用出现问题时,不少时候咱们须要知道更多的程序的运行细节,但又不可能在开发的时候就把程序中全部的运行细节都打印到日志上,一般这个时候能采起的就是修改代码,从新部署,而后再观察,但这种方法对于online应用来讲不是很好,另一方面若是碰到很差改的代码,例如引用的其余的外部的包什么的,就很麻烦了,BTrace就是一个能够在不改代码、不重启应用的状况下,动态的查看程序运行细节的工具,其官方网站在此:http://kenai.com/projects/btrace/,在这篇blog中,就来看看如何用BTrace来动态的监测方法的一些运行细节情况。
BTrace经过动态的挂接用java写的代码到运行时上来获取到一些运行细节,例如典型的使用btrace的方法为:
btrace-cp[btrace的jar所在的路径,默认为btrace/build下][pid][须要运行的java代码]
例如一段这样的代码:java

[java]
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);
}
}
}
public 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;
}
}
[/java]

如在程序运行的状况下,想知道调用CaseObject的execute方法的如下几种状况,在BTrace中能够这么作:
一、调用此方法时传入的是什么参数,返回的是什么值,当时sleepTotalTime是多少?
BTrace脚本以下:dom

[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]

而后直接执行btrace-cpbtrace/build[pid]TraceMethodArgsAndReturn.java就能够了。
当程序中调用到caseobject的execute方法时,就会在btrace的console中输出相应的信息。
二、execute方法执行耗时是多久?
BTrace脚本以下:ide

[java]
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;
@BTrace public class TraceMethodExecuteTime{
@TLS static long beginTime;
@OnMethod(
clazz="CaseObject",
method="execute"
)
public static void traceExecuteBegin(){
beginTime=timeMillis();
}
@OnMethod(
clazz="CaseObject",
method="execute",
location=@Location(Kind.RETURN)
)
public static void traceExecute(int sleepTime,@Return boolean result){
println(strcat(strcat("CaseObject.execute time is:",str(timeMillis()-beginTime)),"ms"));
}
}
[/java]

三、谁调用了execute方法?
BTrace脚本以下:工具

[java]
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;
@BTrace public class TraceMethodCallee{
@OnMethod(
clazz="CaseObject",
method="execute"
)
public static void traceExecute(){
println("who call CaseObject.execute :");
jstack();
}
}
[/java]

四、有没有人调用CaseObject中的哪一行代码?
BTrace脚本以下:网站

[java]
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;
@BTrace public class TraceMethodLine{
@OnMethod(
clazz="CaseObject",
location=@Location(value=Kind.LINE,line=5)
)
public static void traceExecute(@ProbeClassName String pcn,@ProbeMethodName String pmn,int line){
println(strcat(strcat(strcat("call ",pcn),"."),pmn));
}
}
[/java]

从上面可看出,在有了BTrace后,要动态的跟踪代码的运行细节仍是很是爽的,更多的细节的操做请你们查看BTrace的UserGuideui

相关文章
相关标签/搜索