BTrace就是一个可以在不改代码、不重启应用的情况下,动态的查看程序运行细节的工具。
官方网站http://kenai.com/projects/btrace
下载地址 http://kenai.com/projects/btrace/downloads/directory/releases/current
以下示例代码来源于《深入理解Java虚拟机》
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
*
* btrace pid TracingScript.class
* 例如:btrace 8056 TracingScript.class
* @author Caijianfeng
*
*/
public class BTraceTest {
public int add(int a,int b){
int c = a + b;
return c;
}
public static void main(String[] args) throws IOException {
BTraceTest bTraceTest = new BTraceTest();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 10; i++) {
bufferedReader.readLine();
int result = bTraceTest.add(i, i+1);
System.out.println(result);
}
}
}
Btrace 脚本
import static com.sun.btrace.BTraceUtils.jstack;
import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.str;
import static com.sun.btrace.BTraceUtils.strcat;
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.Return;
import com.sun.btrace.annotations.Self;
@BTrace
public class TracingScript{
@OnMethod(
clazz = "BTraceTest",
method = "add",
location = @Location(Kind.RETURN)
)
public static void func(@Self 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)));
}
}
Btrace 在调试resin 等容器里的代码可能由于采用的是 contentClassLoader 的原因而无法代码成功。
代码库: http://code.google.com/p/swtools/source/browse/#git%2Fjava%2Fbtrace-test
###参考资料
- BTrace使用简介 http://rdc.taobao.com/team/jm/archives/509 介绍更多的Btrace的用法,如代码耗时、代码参数、执行代码的哪一行
- 《深入理解Java虚拟机》——周志明著