BTrace是一种安全,动态的Java跟踪工具。BTrace通过动态(字节码)检测正在运行的Java程序的类来工作。BTrace将跟踪操作插入到正在运行的Java程序的类中,并对跟踪的程序类进行热交换。
探针点
执行一组跟踪语句的“location”或“event”。探针点是我们想要执行一些跟踪语句的感兴趣的“位置”或“事件”。
跟踪操作或操作
探测器“触发”时执行的跟踪语句。
行动方法
探测器触发时执行的BTrace跟踪语句是在类的静态方法中定义的。这种方法称为“动作”方法。
BTrace程序是一个普通的Java类,它有一个或多个public static void
用BTrace注释注释的方法。注释用于指定跟踪的程序“位置”(也称为“探测点”)。跟踪操作在静态方法体内指定。这些静态方法称为“动作”方法。
为了保证跟踪操作是“只读”(即跟踪操作不会改变跟踪的程序状态)和有界(即跟踪操作在有限时间内终止),BTrace程序只允许执行一组有限的行动。特别是BTrace类
public static
方法的com.sun.btrace.BTraceUtils
类可以从BTrace程序调用。static public void
BTrace类只允许返回方法。所有领域都必须是静态的。for, while, do..while
)
// import all BTrace annotations
import com.sun.btrace.annotations.*;
// import statics from BTraceUtils class
import static com.sun.btrace.BTraceUtils.*;
// @BTrace annotation tells that this is a BTrace program
@BTrace
public class HelloWorld {
// @OnMethod annotation tells where to probe.
// In this example, we are interested in entry
// into the Thread.start() method.
@OnMethod(
clazz="java.lang.Thread",
method="start"
)
public static void func() {
// println is defined in BTraceUtils
// you can only call the static methods of BTraceUtils
println("about to start a thread!");
}
}
上面的BTrace程序可以针对正在运行的Java进程运行。这个程序将打印“即将开始一个线程!” 每当目标程序即将通过Thread.start()
方法启动一个线程时,在BTrace客户端。还有其他有趣的探索点可能。例如,我们可以在从方法返回时插入跟踪操作,从方法返回异常,在方法中获取或设置字段,创建对象/数组,行号,抛出异常。有关详细信息,请参阅 @OnMethod和其他注释。
btrace
BTrace使用命令行工具btrace运行,如下所示:
btrace [-I ] [-p ] [-cp ] []
哪里
include-path
是一组搜索头文件的包含目录。BTrace包含一个简单的预处理,支持#define,#include和条件编译。它是不是像一个完整的C / C ++预处理程序-但有用的子集。请参阅示例“ThreadBean.java”。如果未指定-I,则BTrace将跳过预处理器调用步骤。port
是BTrace代理侦听的端口。这是可选参数。classpath
是一组目录,jar文件,其中BTrace在编译期间搜索类。默认为“。”。pid
是跟踪的Java程序的进程IDbtrace-script
是跟踪计划。如果它是“.java”,则在提交之前编译它。或者,假设它是预编译的[即,它必须是.class]并提交。可选的
port
是BTrace代理程序侦听客户端的服务器套接字端口。默认是2020。path
是用于编译BTrace程序的类路径。默认为“。”。args
是传递给BTrace程序的命令行参数。BTrace程序可以使用内置函数“$”和“$ length”访问它们。
可以使用btracec脚本预编译BTrace程序。btracec是一个类似javac的程序,它接受一个BTrace程序并生成一个.class文件。
btracec [-I ] [-cp ] [-d ]
哪里
include-path
是一组搜索头文件的包含目录。BTrace包含一个简单的预处理,支持#define,#include和条件编译。它是不是像一个完整的C / C ++预处理程序-但有用的子集。请参阅示例“ThreadBean.java”。如果未指定-I,则BTrace将跳过预处理器调用步骤。classpath
是用于编译BTrace程序的类路径。默认为“。”directory
是存储编译的.class文件的输出目录。默认为“。”。此脚本使用BTrace编译器类 - 而不是常规javac,因此将在编译时验证您的BTrace程序[以便您可以在运行时避免BTrace验证错误]。
到目前为止,我们已经了解了如何跟踪正在运行的Java程序。也可以在其中启动使用BTrace代理的应用程序。如果您想从“开始”开始跟踪应用程序,您可能希望使用BTrace代理启动应用程序并指定跟踪脚本[即,BTrace代理是按需加载以及预先加载可加载代理程序]您可以使用以下命令启动应用程序并指定BTrace脚本文件。但是,您需要预编译BTrace脚本以实现此类用法。
java -javaagent:btrace-agent.jar=script=
以这种方式启动应用程序时,跟踪输出将转到当前目录中名为noServer=true
BTrace代理的参数来避免为其他远程BTrace客户端启动服务器。
有一个方便的脚本叫做btracer来执行上述操作:
btracer
方法注释
java.awt.Component
或两个前进内指定正则表达式斜线。参考样品 NewComponent.java和Classload.java。正则表达式可以匹配的零个或更多的类在这种情况下所有匹配类仪表化的。例如/java\\.awt\\..+/
匹配java.awt包中的所有类。此外,方法名称也可以是正则表达式 - 匹配零个或多个方法。请参阅示例MultiClass.java。还有另一种方法可以抽象地指定跟踪类和方法。可以通过注释指定跟踪的类和方法。例如,如果将“clazz”属性指定为@javax.jws.WebService
BTrace,则将检测由WebService批注注释的所有类。类似地,方法级别注释可用于抽象地指定方法。请参阅示例 WebServiceTracker.java。也可以将正则表达式与注释结合起来 - 比如说 @/com\\.acme\\..+/
匹配由任何与给定正则表达式匹配的注释注释的任何类。通过指定超类型可以匹配多个类。即,匹配给定超类型的子类型的所有类。+java.lang.Runnable
匹配实现java.lang.Runnable接口的所有类。请参阅示例SubtypeTracer.java。参数注释
字段注释
@com.sun.btrace.annotations.Export
注释可以与BTrace字段(静态字段)一起使用,以指定该字段必须映射到jvmstat计数器。使用此功能,BTrace程序可以将跟踪计数器公开给外部jvmstat客户端(例如jstat)。请参阅示例 ThreadCounter.java@com.sun.btrace.annotations.Property
注释可用于将特定(静态)字段标记为MBean特性。如果BTrace类具有至少一个具有@Property属性的静态字段,则创建MBean并向平台MBean服务器注册。诸如VisualVM,jconsole之类的JMX客户端可用于查看此类BTrace MBean。将BTrace附加到目标程序后,可以将VisualVM或jconsole附加到同一程序并查看新创建的BTrace MBean。使用VisualVM和jconsole,您可以使用MBeans选项卡查看BTrace域并查看其属性。请参阅示例ThreadCounterBean和 HistogramBean.java。@com.sun.btrace.annotations.TLS
注释可以与BTrace字段(静态字段)一起使用,以指定该字段是线程本地字段。每个Java线程都获得该字段的单独“副本”。BTrace程序可以使用这些线程本地字段来识别我们是否从同一线程到达多个探测操作。请参阅示例 OnThrow.java和 WebServiceTracker.java类注释
@com.sun.btrace.annotations.DTrace
注释可用于将简单的单线程D-script(在BTrace Java类中内联)与BTrace程序相关联。请参阅示例DTraceInline.java。@com.sun.btrace.annotations.DTraceRef
注释可用于将D-script(存储在单独的文件中)与BTrace程序相关联。请参阅示例DTraceRefDemo.java。@com.sun.btrace.annotations.BTrace
必须使用注释将给定的Java类指定为BTrace程序。此注释由BTrace编译器以及BTrace代理强制执行。Solaris DTrace是一个用于Solaris程序的动态,安全的跟踪系统 - 内核和用户登陆程序。由于brace与DTrace和BTrace有明显的相似之处,因此可以预期整合b / w BTrace和DTrace。BTrace与DTrace集成的方式有两种。
dtraceProbe
- 请参阅上面提到的BTraceUtils javadoc。要使此功能起作用,您需要在Solaris 10或更高版本上运行。对于其他平台(Solaris 9或更低版本或任何其他操作系统),dtraceProbe()
将是无操作。BTrace样品
关于样品的一行:
defineClass
由任何用户定义的类加载器在每个成功的类加载(返回)上打印堆栈跟踪。deadlock()
内置函数。File{Input/Output}Stream
构造函数入口点打印文件以进行读/写。javax.swing.JComponent
由app创建的对象 - 按子类名称和计数的直方图)。@Property
注释公开Map作为MBean属性。printVmArguments()
,printProperties()
并 printEnv()
内置函数。dumpHeap()
内置函数以转储(hprof二进制格式)目标应用程序的堆转储。jstackAll()
内置函数以打印所有线程的堆栈跟踪。field()
和objectValue()
内置函数。clazz
和注释method
字段将跟踪代码插入到多个类的多个方法中@OnMethod
。java.awt.Component
创建并递增计数器并根据计时器打印计数器。@OnExit
探针和exit(int)
内置函数。@OnTimer
在BTrace程序中演示多个计时器探测器()。URL.openConnection
成功返回时打印URL 。该程序也使用jurls.d D-script(显示通过DTrace打开的URL的直方图)。