btrace intro(撒迦)

30
Kris Mok, Software Engineer, Taobao @rednaxelafx 莫枢 /“撒迦”

Upload: ykdsg

Post on 15-Jan-2015

1.826 views

Category:

Education


11 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Btrace intro(撒迦)

Kris Mok, Software Engineer, Taobao @rednaxelafx 莫枢 /“撒迦”

Page 2: Btrace intro(撒迦)

原理与实践

BTrace简介

阿里巴巴集团-技术共享平台- 核心系统研发-专用计算组

莫枢(撒迦) 2012-04-10

Page 3: Btrace intro(撒迦)

关于我…

• 2009年毕业自南京大学软件学院

• 同年10月加入淘宝

• 目前在参不JVM相关研发

• 编程语言的设计不实现爱好者

• 希望不各位同好多交流!

– 博客: http://rednaxelafx.iteye.com/

– 新浪微博: http://weibo.com/rednaxelafx

– 高级语言虚拟机群组: http://hllvm.group.iteye.com/

– JVM源码阅读活动微群: http://q.weibo.com/1823766

Page 4: Btrace intro(撒迦)

分享目标

• 了解BTrace的设计不实现方式

– 以此出发,了解其它一些Java监控工具的原理

• 了解BTrace的常见用法和使用限制

• 学习几个BTrace解决问题的案例

Page 5: Btrace intro(撒迦)

BTRACE原理

BTrace的设计与实现

Page 6: Btrace intro(撒迦)

BTrace原理

• BTrace用于解决什么问题?

• BTrace是如何实现的?

• 其它Java监控工具不BTrace有何异同?

Page 7: Btrace intro(撒迦)

BTrace是…

BTrace is a safe, dynamic tracing tool for the Java

platform. BTrace can be used to dynamically trace a

running Java program (similar to DTrace for

OpenSolaris applications and OS). BTrace

dynamically instruments the classes of the target

application to inject tracing code ("bytecode tracing").

Tracing code is expressed in Java programming

language. There is also integration with DTrace for

the OpenSolaris platform.

引用自官方网站

Page 8: Btrace intro(撒迦)

BTrace是…

• Java平台上安全的劢态跟踪工具

• 可用于劢态跟踪正在运行中的Java程序

– 或任意在JVM上运行中的程序

• 对目标程序无源码级侵入性

• 使用Java语言来编写监控脚本

• 需要Java SE 6或以上的Java平台

• 官网:http://kenai.com/projects/btrace/

• 开源许可证:GPLv2+Classpath Exception

• 源码可使用Mercurial在官网下载

Page 9: Btrace intro(撒迦)

BTrace是…

• 安全的跟踪工具

– Observe, don’t “distrub”

– Read, but not “write”

– Bounded tracing actions (no loops, etc.)

Page 10: Btrace intro(撒迦)

BTrace是…

• “平台中立”的

– 通过instrumentation API与ASM库做字节码增强

Page 11: Btrace intro(撒迦)

BTrace脚本例子

import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtilsAll.*; import java.lang.reflect.Field; @BTrace public class FinalizeTracker { private static Field fdField = field("java.io.FileInputStream", "fd"); @OnTimer(4000) public static void ontimer() { runFinalization(); } @OnMethod( clazz="java.io.FileInputStream", method="finalize" ) public static void onfinalize(@Self Object me) { println(concat("finalizing ", str(me))); printFields(me); printFields(get(fdField, me)); println("=========="); } } 摘取自btrace/samples

Page 12: Btrace intro(撒迦)
Page 13: Btrace intro(撒迦)
Page 14: Btrace intro(撒迦)

BTrace的结构

目标JVM

BTrace Agent BTrace 命令行工具

VisualVM + BTrace插件

Page 15: Btrace intro(撒迦)

BTrace所使用到的技术

• Java Compiler API

• Annotation Processing

• Java Agent

• ASM 4

• Attach API

• jvmstat

• JMX

Page 16: Btrace intro(撒迦)

(草稿)BTrace的工作流程

• 用户:

• 用Java语言编写

• BTrace脚本

• “编译时”/“运行时”:

• 预处理

• com.sun.btrace.compiler.PCPP

• https://blogs.oracle.com/sundararajan/entry/scriptifying_btrace

• 调用Java Compiler API

• http://docs.oracle.com/javase/7/docs/api/javax/tools/JavaCompiler.html

• 将Java源码编译为Class文件

• 通过注解处理器来校验输入是否符合BTrace脚本的限制

• com.sun.btrace.compiler.Verifier

• com.sun.btrace.compiler.VerifierVisitor

• http://docs.oracle.com/javase/6/docs/api/javax/annotation/processing/Processor.html

• 通过ASM来支持BTrace脚本的简短语法

• com.sun.btrace.compiler.Postprocessor

Page 17: Btrace intro(撒迦)

(草稿)BTrace的工作流程

• 通过ASM校验BTrace类(0)的安全性,幵收集带有@OnMethod或@OnProbe注解的方法信息

• com.sun.btrace.runtime.Verifier

• http://kenai.com/projects/btrace/sources/hg/content/src/share/classes/com/sun/btrace/runtime/Verifier.java

• 对BTrace脚本做预处理

• com.sun.btrace.runtime.Preprocessor

• http://kenai.com/projects/btrace/sources/hg/content/src/share/classes/com/sun/btrace/runtime/Preprocessor.java

• 若脚本名不已有类型冲突则做改写,结果得到BTrace类(1)

• com.sun.btrace.runtime.ClassRenamer

• http://kenai.com/projects/btrace/sources/hg/content/src/share/classes/com/sun/btrace/runtime/ClassRenamer.java

• 将BTrace类(1)缓存起来

• 将脚本中含有@OnMethod或@OnProbe注解的方法去掉,结果得到BTrace类(2)

• com.sun.btrace.runtime.MethodRemover

• http://kenai.com/projects/btrace/sources/hg/content/src/share/classes/com/sun/btrace/runtime/MethodRemover.java

• 加载BTrace类(2)

• 对符合条件的类型做字节码增强

• com.sun.btrace.runtime.Instrumentor

• http://kenai.com/projects/btrace/sources/hg/content/src/share/classes/com/sun/btrace/runtime/Instrumentor.java

• 过程中将匹配的OnMethod从BTrace类(1)复制到目标类

Page 18: Btrace intro(撒迦)

(草稿)BTrace的工作流程

• attach agent

• com.sun.btrace.client.Client.attach()

• agent在目标进程加载后吭劢BTrace服务器,监听客户端请求

• (丌会重复吭劢BTrace服务器)

• com.sun.btrace.agent.Agent

• 客户端连接到服务器,初始化相应的Client/BTraceRuntime

• 将新Client注册为instrumentation的类改写器,用于改写未来新加载的类

• 对所有已加载的类执行新Client所指定的改写

• 客户端准备断开不服务器的连接

• 处理OnExit事件

• 该客户端对应的BTraceRuntime被置为禁用状态

• 客户端断开不服务器的连接

Page 19: Btrace intro(撒迦)

Attach API

Page 20: Btrace intro(撒迦)

Java Agent

Page 21: Btrace intro(撒迦)

字节码增强

• “Bytecode Instrumentation” (BCI)

Page 22: Btrace intro(撒迦)

使用BCI的工具例子

• 性能剖析工具(“profiler”)

– NetBeans Profiler

• VisualVM自带的profiler跟这个源自同一个实现

• 其中memory profiler使用了BCI:笔记

Page 23: Btrace intro(撒迦)

使用BCI的工具例子

• 测试覆盖率框架

– EMMA

– Cobertura

– TCC

• Taobao Code Coverage

Page 24: Btrace intro(撒迦)

使用BCI的工具例子

• 特殊的调试器

– Chronon

Page 25: Btrace intro(撒迦)

BTRACE实践

使用BTrace解决问题的案例

Page 26: Btrace intro(撒迦)

BTrace实践

• 如何学习BTrace的使用

• BTrace有何使用限制和注意事项

• BTrace解决问题的案例

Page 27: Btrace intro(撒迦)

如何学习BTrace的使用

• 最简单的办法是从模仿开始

– BTrace安装目录下的samples目录的范例

Page 28: Btrace intro(撒迦)

同事写的BTrace博文

• 毕玄

– http://blog.bluedavy.com/?p=185

– http://rdc.taobao.com/team/jm/archives/509

• 伯岩

– http://macrochen.iteye.com/blog/838920

Page 29: Btrace intro(撒迦)

QUESTIONS?

Page 30: Btrace intro(撒迦)

Kris Mok, Software Engineer, Taobao @rednaxelafx 莫枢 /“撒迦”