Btrace简单使用

介绍

Btrace是什么,能做什么,这里不予介绍,网上一搜一大片。本文只介绍Btrace的基本用法和示例,用作备忘。

目前最新的版本为1.2.5.1,除了单独使用(支持mac、windows和linux)之外,还可以在jvisualvm上安装插件,通过GUI使用。

下载linux版本,解压后,主要目录如下,bin是命令目录,build中是实现btrace的jara包,samples目录下有大量脚本示例可供参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
├── bin
│   ├── btrace
│   ├── btrace.bat
│   ├── btracec
│   ├── btracec.bat
│   ├── btracer
│   └── btracer.bat
├── build
│   ├── btrace-agent.jar
│   ├── btrace-boot.jar
│   └── btrace-client.jar
└── samples
├── AWTEventTracer.java
├── AllCalls1.java
├── AllCalls2.java
├── AllCalls3.java
├── AllLines.java
├── AllMethods.java
├── AllSync.java
├── ArgArray.java
├── Classload.java
├── CommandArg.java
├── DTraceInline.java
├── DTraceRefDemo.java
├── Deadlock.java
...
└── syscalls.d

使用示例

示例java代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
package tmp;
public class Test {
public static void main(String[] args) throws InterruptedException {
while (true) {
print("abcde");
Thread.sleep(5000);
}
}

public static void print(String abc) {
System.out.println(abc);
}
}

btrace脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TracingScript {
/* put your code here */
@TLS
static long beginTime;

@OnMethod(clazz="tmp.Test",method="print")
public static void begin(){
println("start");
beginTime = timeMillis();
}

@OnMethod(clazz="tmp.Test",method="print",location=@Location(Kind.RETURN))
public static void after(){
jstack();//打印方法栈
println("done");
println(strcat(strcat("Test Execute Time:", str(timeMillis() - beginTime)), "ms"));
}
}

使用jvisualvm

安装btrace插件,使用jvisualvm插件管理器安装或者直接从kenai.com下载安装,右键单击选择Trace application,即可。

启动java示例代码,点击start启动btrace脚本,观察输出如下:

服务端使用

上传btrace脚本文件,然后btrace <pid> 脚本文件,观察输出即可。

更多高级特性参看btrace示例脚本。