http://www.iteye.com/topic/1005918
背景周五下班回家,在公司班车上觉得无聊,看了下btrace的源码(自己反编译)。 一些关于btrace的基本内容,可以看下我早起的一篇记录:btrace记忆 上一篇主要介绍的是btrace的一些基本使用以及api,这里我想从btrace源码本身进行下介绍。至于btrace的优势,能用来干些什么,自己上他的官网看下或者google一下,花个半小时就能明白了。 至于为什么会去反编译查看btrace源码,主要是会在部门整个关于btrace的分享。同时btrace的相关技术文档缺乏,javadoc很多时候说的不明不白,作者也没有提供源码开源,所以就有了这次的分享。 Btrace涉及相关技术
大家可以先去预备一下知识。 Btrace的大体设计下面来看一个Btrace的设计图: 说明: 1. BtraceClient : 为我们使用的btrace的本地api,一般我们使用的bin/btrace会在本地启动一个btrace jvm,其内部使用了Java Complier Api, JVMTI技术,以及创建了一个socket。
2. BtraceAgent:为我们在目标jvm上植入的btrace agent实现。主要是Instrumentation技术, asm字节码处理技术。
btrace的包结构:
btrace-client 一般我们通常直接使用的命令,比如:
都是直接调用了btrace-client包中的代码。 几个核心类介绍: 1. com.sun.btrace.client.Main (btrace的启动入口)
2. com.sun.btrace.client.Client
几点说明: * 在调用了attach方法后,会通过btrace-agent.jar中的com.sun.btrace.agent.Main启动一个ServerSocket
* 所以在submit中,会通过一个本地socket进行连接server,并提交相应的Btrace.java中的监控代码(这时应该是编译后的字节码). 3. com.sun.btrace.compiler.Verifier btrace自定义的语法校验器
4. com.sun.btrace.compiler.VerifierVisitor (具体的一些检查规则)
说明: * 看完Verifier和VerifierVisitor后,相信大家都应该明白了Btrace所谓的诸多限制,只是针对.java需要动态编译。如果我们预先生成.class文件,Btrace在1.2版本中并不会作类型合法性检查。(在将code发送给btrace-agent后,会在目标的jvm内部进行一次简单的Btrace语法检查,具体见后面Btrace-agent介绍) 5. com.sun.btrace.comm.XXX Btrace的各种command指令 btrace-agent 大致了解了Client类中的attach和submit方法后,相信也能猜到对应agent的一些设计。简单的看一下 1. com.sun.btrace.agent.Main 为attach上之后agent的总入口,会调用agentmain()方法
说明: * 目前instrument进行字节码重写时,会重新load所有的class进行处理。(Btrace可以使用正则,父类的方式进行匹配,只能是挨个Class进行处理,看下是否有匹配的OnMethod) * 相比于btrace-client提交过来的参数中,btrace-agent支持的参数中多了几个script,scriptdir等,允许在Client调用服务端一个指定的Btrace script文件进行处理,注意这里的script必须是编译后的.class文件。和通过socket提交的btrace在处理上没有太大的差异。 2. com.sun.btrace.agent.RemoteClient / FileClient : (RemoteClient为通过socket提交的script , FileClient为script和scriptDir指定的script文件)
3. com.sun.btrace.agent.ProbeDescriptorLoader
4. com.sun.btrace.agent.Client: (RemoteClient和FileClient的共同父类)
5. com.sun.btrace.runtime.Instrumentor : 是Btrace实现代码监控增强处理的核心逻辑 可以直接调用:
Btrace的几点总结1. btrace支持的监控方式
2. btrace支持的jdk版本
agent启动:
3. btrace的支持的script方式有多种。
4. btrace的使用是否会对java进程造成影响?(影响是肯定的,不过影响不大) 装载时的影响:
退出后的影响:
抓取了下btrace改写过后的类:
注意其中的if (!BTraceRuntime.enter(InstrumentTracer.runtime)) return;
再看一下BTraceRuntime中对应方法的实现:
每次执行你的监控代码之前会先进行一个判断,判断当前是否处于监控中。你的客户端发起了exit指令后,该方法判断false,直接return。
所以btrace使用退出后会让你的代码多走了一个方法调用+一个对象属性判断,所以说影响还是非常的少
5. btrace诸多的使用限制,你必须得知道:
说明:
补充说明:
6. btrace对string字符串的处理
7. btrace的相关源码:
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中都支持,所以就不在每个表格中赘述。
最后花了多个小时时间整理了这份blog,希望能给大家理解btrace,掌握btrace的使用能带来一些帮助!! 有问题和交流,欢迎站内联系 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
发表时间:2011-06-23
貌似关注btrace的人挺少,呵呵。
用btrace最大的好处就是监控业务数据,而且允许在jvm运行之后动态attach,完全是一种无嵌入的监控模式。你不需要像jwebap一样,丢个jar包到你的运行容器中。 一般常用: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
发表时间:2011-06-23 最后修改:2011-06-23
agapple 写道
至于为什么会去反编译查看btrace源码,主要是会在部门整个关于btrace的分享。同时btrace的相关技术文档缺乏,javadoc很多时候说的不明不白,作者也没有提供源码开源,所以就有了这次的分享。
7. btrace的相关源码:
呃…BTrace明明是GPLv2开源的。源码用Mercurial管理着。
正常的话会看到:
代码就抓下来了… |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
发表时间:2011-06-24
RednaxelaFX 写道
agapple 写道
至于为什么会去反编译查看btrace源码,主要是会在部门整个关于btrace的分享。同时btrace的相关技术文档缺乏,javadoc很多时候说的不明不白,作者也没有提供源码开源,所以就有了这次的分享。
7. btrace的相关源码:
呃…BTrace明明是GPLv2开源的。源码用Mercurial管理着。
正常的话会看到:
代码就抓下来了… |
Btrace的更多相关文章
-
java性能调优及问题追踪--Btrace的使用
在生产环境中经常遇到格式各样的问题,如OOM或者莫名其妙的进程死掉.一般情况下是通过修改程序,添加打印日志:然后重新发布程序来完成.然而,这不仅麻烦,而且带来很多不可控的因素.有没有一种方式,在不修改 ...
-
btrace使用
btrace使用 目录btracee是btrace的解压目录 btrace/btrace是btrace的项目工程 root@ubuntu:/usr/local/bogon/btrace# tree b ...
-
使用jvisualvm.exe 的Btrace插件介绍/使用教程
一.背景 在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数据信息,我们可以 通过改写代码,增加日志信息的打 ...
-
BTrace入门教程
bin版:https://kenai.com/projects/btrace/downloads/directory/releases 源码:https://github.com/btraceio/b ...
-
让VisualVM+BTrace进入unsafe mode
让VisualVM+BTrace进入unsafe mode http://kenai.com/projects/btrace/pages/UserGuide BTrace很强大,但有很多安全限制,比如 ...
-
使用jvisualvm.exe 的Btrace插件监控应用程序
之前提到使用命令行的方式执行btrace监控,其实jdk提供更好的方式监控应用程序. 我们可以使用jvisualvm.exe加插件的方式监控,这样更加方便. 1.在jvisualvm.exe安装btr ...
-
使用BTRACE定位系统中慢的问题
在访问页面请求的时候,如果系统执行效率低,我们怎样才能定位到这些页面请求呢? java 有一个十分有效的动态跟踪工具-btrace 网址:https://kenai.com/projects/bt ...
-
Java BTrace实战(1)--BTrace的入门和使用
前言: 对线上的java服务, 往往采用日志进行问题处理和分析. 倘若日志缺乏相关的信息时, 那又该如何处理? 远程调试会影响服务的正常工作, 修改代码重新部署的方案其实时性和灵活性难以保证(线上服务 ...
-
Btrace入门到熟练小工完全指南
BTrace是神器,每一个需要每天解决线上问题,但完全不用BTrace的Java工程师,都是可疑的. BTrace的最大好处,是可以通过自己编写的脚本,获取应用的一切调用信息.而不需要不断地修改代码, ...
-
btrace 实践笔记
btrace简介: btrace 是一个使用在JAVA平台上面的,安全的,动态跟踪工具.它一般用于动态跟踪正在运行的jAVA程序. 使用说明在这里.下载地址在这里. 下载的时候 ...
随机推荐
-
xml小记1
xml小记1 关于边框的实现 这是一个比较简单的东西,但是今天莫名的低效率,在这上面花了比较多的时间.之前有咨询过同学如何实现单向的边框,他们采用的方法是调用别人的接口. 我采用的方法如下: < ...
-
spark 加载文件
spark 加载文件 textFile的参数是一个path,这个path可以是: 1. 一个文件路径,这时候只装载指定的文件 2. 一个目录路径,这时候只装载指定目录下面的所有文件(不包括子目录下面的 ...
-
SQL中SUBSTRING函数的用法
功能:返回字符.二进制.文本或图像表达式的一部分 语法:SUBSTRING ( expression, start, length ) SQL 中的 substring 函数是用来抓出一个栏位资料中的 ...
-
html5基础知识
html5+css3 html5定义很多简便东西和宽松语法: 文档头: <!doctype html> 文档编码: <meta cha ...
-
Django-视图层(view)
视图层(view) 视图函数,简称视图,本质上是一个简单的Python函数,它接受Web请求并且返回Web响应.响应的内容可以是HTML网页,重定向,404错误,图片等任何东西,但本质是返回响应对 ...
-
20175325 《JAVA程序设计》实验一 《JAVA开发环境的熟悉》实验报告
20175325 <JAVA程序设计>实验一 <JAVA开发环境的熟悉>实验报告 一.实验内容及步骤 (一).实验一: 实验要求: 0 参考实验要求 1 建立"自己学 ...
-
python中根据字符串导入模块module
python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' date ...
-
Python之道(一)之安装Python
"Python之道"首先介绍一下在windows系统下怎样安装Python开发环境. (1)下载MSI安装文件 进入网址www.python.org,点击Downloads进入下载 ...
-
Oracle的下载安装教程以及所出现的问题
1.下载地址 64位 https://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft ...
-
第一个Django应用程序_part1
一.查看Django是否安装 参考文档:https://docs.djangoproject.com/en/1.11/intro/tutorial01/ 如果Django已经安装,可以看到安装的版本号 ...