首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

btrace一些您不知道的事(源码入手)

2012-12-22 
btrace一些你不知道的事(源码入手)背景??? 周五下班回家,在公司班车上觉得无聊,看了下btrace的源码(自己反

btrace一些你不知道的事(源码入手)
背景?

?? 周五下班回家,在公司班车上觉得无聊,看了下btrace的源码(自己反编译)。 一些关于btrace的基本内容,可以看下我早起的一篇记录:btrace记忆

?

?? 上一篇主要介绍的是btrace的一些基本使用以及api,这里我想从btrace源码本身进行下介绍。至于btrace的优势,能用来干些什么,自己上他的官网看下或者google一下,花个半小时就能明白了。

?

?? 至于为什么会去反编译查看btrace源码,主要是会在部门整个关于btrace的分享。同时btrace的相关技术文档缺乏,javadoc很多时候说的不明不白,作者也没有提供源码开源,所以就有了这次的分享。

Btrace涉及相关技术
    asm?instrument???http://download.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html JVM TI(java tool api)?? http://download.oracle.com/javase/6/docs/jdk/api/attach/spec/com/sun/tools/attach/VirtualMachine.html Java Compiler Api?? http://download.oracle.com/javase/6/docs/api/javax/tools/package-summary.html

大家可以先去预备一下知识。

?

Btrace的大体设计

下面来看一个Btrace的设计图:


btrace一些您不知道的事(源码入手)

?

?

说明:?

1. BtraceClient : 为我们使用的btrace的本地api,一般我们使用的bin/btrace会在本地启动一个btrace jvm,其内部使用了Java Complier Api, JVMTI技术,以及创建了一个socket。

?

Java Complier Api:动态的将我们传递的监控的java源文件动态编译成.class文件JVMTI: 主要是利用了java 1.6之后的VirtaulMachine技术,动态的attach到一个已启动的jvm上,为他去启动一个BtraceAgent。该Agent会为BtraceClient启动一个server socket进行通讯。(多进程之间的通讯)本地socket: BtraceClient和BtraceAgent之间的数据通讯,比如生成的.class发送到BtraceAgent,还有一些Event事件等等。BtraceAgent同样可以将服务端print()的数据通过socket的方式回传给BtraceClient进行打印2. BtraceAgent:为我们在目标jvm上植入的btrace agent实现。主要是Instrumentation技术, asm字节码处理技术。BtraceAgent的启动可以有两种方式: BtaceClient动态attach后进行启动, 另一种就是在目标jvm启动之前添加agent参数进行启动。BtraceAgent会启动一个server socket,与BtraceClient客户端进行交互,客户端可以将监控的.class文件通过socket发送,同样也可以在jvm启动时直接指定对应本地的.class做为监控脚本。BtraceAgent在接受到监控指令后,会遍历当前所有已经加载的class类,挨个进行匹配检查,并生成相应的监控字节码(监控方法)。

?

?

btrace的包结构:

btrace-client.jarbtrace-boot.jarbtrace-agent.jar

btrace-client

???一般我们通常直接使用的命令,比如:

?

注意其中的if (!BTraceRuntime.enter(InstrumentTracer.runtime)) return; 再看一下BTraceRuntime中对应方法的实现:

?

?

说明:?

?

在btrace-client和btrace-agent分别都有对诸多限制的检查。btrace-client代码类:?http://kenai.com/projects/btrace/sources/hg/content/src/share/classes/com/sun/btrace/compiler/VerifierVisitor.javabtrace-agent代码类:?http://kenai.com/projects/btrace/sources/hg/content/src/share/classes/com/sun/btrace/runtime/MethodInstrumentor.java

补充说明:

?

正因为btrace有这诸多的限制,才可以让我们的监控代码可以更加的放心,这也正是btrace能普及的一个很重要的原因。不得不说的一个点:对String的"+"限制使用,让我们使用起来很不爽,不过还好在btrace 1.2之后,作者提供了一个StringBuilder。相比于strcat已经好用多了

6. btrace对string字符串的处理

可以参看总结3,突破对应的限制。不是非常建议,因为总结4中提出即使btrace client退出后,服务端一直会运行btrace script。所以一旦有写的动作,会是一个长期持续的过程btrace 1.2 release说明中,已经提到增加了StringBuilder进行字符串处理,至少比先前的strcat使用上已经方便很多了。具体查看:http://kenai.com/jira/browse/BTRACE-38

7. btrace的相关源码:

官网上找到一个,不过是web版本: http://kenai.com/projects/btrace/sources/hg/show/src/share/classes/com/sun/btrace 附件中自己使用了jd-gui反编译生成了一个。

8. btrace中对OnMethod的Location使用上,以及一些annotation使用不明确,可以查看:http://kenai.com/projects/btrace/sources/hg/content/src/share/classes/com/sun/btrace/runtime/Instrumentor.java

?

说明: self, ProbeClassName , ProbeMethodName 在任何的Kind中都支持,所以就不在每个表格中赘述。



呵呵,我土了, 先前不了解mercurial工具。 只用过svn和git,长见识了   

热点排行