BTrace 初体验 (一): 新手上路

本贴最后更新于 2160 天前,其中的信息可能已经时过境迁

背景

BTrace 是一个 java 应用动态诊断工具,类似于 OpenSolaris 平台上的 DTrace 工具。

BTrace 是一个安全无风险的工具,会向运行中的 java 类注入代码,即"bytecode tracing"。(笔者实际测试中,发现是有风险的, 在 BTrace 退出时,程序有可能会退出:( )

BTrace 适用于 linux 和 mac os x 平台。

安装

下载二进制包

直接在下载页面,下载 release 包。

设置变量

设置 JAVA_HOMEPATH 环境变量

使用

快速入门

先编写一个示例的 java 代码,再编写一个示例的 BTrace 脚本,然后再运行。

示例 java 代码

Looper.java

package testBtrace;

public class Looper {

	private static int loopCount = 0;

	private static int loopTime = 0;

	public int loop(int sleepTime) throws Exception {
		System.out.print(
				String.format("sleep %d ms, \tloop count = %d,  \ttotal time = %d\n", sleepTime, loopCount, loopTime));
		loopCount++;
		loopTime += sleepTime;
		Thread.sleep(sleepTime);
		return loopCount;
	}
}

MainLooper.java

package testBtrace;

import java.util.Random;

public class MainLooper {
	public static void main(String[] args) throws Exception {
		Looper looper = new Looper();
		Random random = new Random();
		while (true) {
			int sleepTime = random.nextInt(1000) + 1000;
			looper.loop(sleepTime);
		}
	}
}

运行效果

sleep 1698 ms, 	loop count = 0,  	total time = 0
sleep 1601 ms, 	loop count = 1,  	total time = 1698
sleep 1977 ms, 	loop count = 2,  	total time = 3299
sleep 1597 ms, 	loop count = 3,  	total time = 5276
sleep 1490 ms, 	loop count = 4,  	total time = 6873
sleep 1427 ms, 	loop count = 5,  	total time = 8363

示例 BTrace 脚本

sample 目录下有一系列示例脚本,这里选择 AllCalls1.java 脚本为模板,修改如下:

来跟踪 testBtrace.Looper 类的调用

package com.sun.btrace.samples;

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace public class AllCalls1 {
    @OnMethod(clazz="testBtrace.Looper", method="/.*/",
              location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/"))
    public static void m(@Self Object self, @TargetMethodOrField String method, @ProbeMethodName String probeMethod) { // all calls to the methods with signature "()"
        println(method + " in " + probeMethod);
    }
}

运行

设置环境变量

export BTRACE_HOME=/path/to/btrace-bin-1.3.11

运行

[abeffect@note btrace-bin-1.3.11]$ btrace pid AllCalls1.java
valueOf in loop
valueOf in loop
valueOf in loop
format in loop
print in loop
sleep in loop
valueOf in loop
valueOf in loop
valueOf in loop
format in loop
print in loop
sleep in loop

退出的方法是:通过 Ctrl-c 来弹出 BTrace 控制台,如下:

Please enter your option:
	1. exit
	2. send an event
	3. send a named event
	4. flush console output

选择 1 即可退出.

参考

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...