BTrace介绍和生产环境样例
2017-06-06 21:51
686 查看
BTrace latest realese:
release-1.2.5.1
BTrace guide(1.2-20101020):
http://kenai.com/projects/btrace/pages/UserGuide
样例:在压缩包内有。
BTrace 是一个可靠的,用来动态跟踪Java程序的工具。它通过动态对执行中的Java程序进行字节码生成来工作。
BTrace会对执行中的Java程序的类插入一些跟踪操作 来对被跟踪的程序进行热替换。
BTrace 名词
探測点 (Probe Point)
就是一系列的跟踪语句被运行的“地方”或者“事件”。探測点就是我们想要运行一些跟踪语句的地方或者事件。
跟踪动作或简称动作 (Trace Actions)
就是那些当探測点被触发时所运行的跟踪语句。
动作方法
BTrace的跟踪语句是必须定义在一个类的某个静态方法里的,这个静态方法就叫“动作”方法。
BTrace 程序结构
一个BTrace程序就是一个普通的Java类,这个类至少有一个这个方案:
public static void ***
其次这种方法还须要加上BTrace相关的注解。
这些注解用来指明被跟踪程序的“位置”(也就是前面提到的探測点)。
跟踪动作须要在这个静态方法的方法体里指定。
这些(注意,能够有多个)静态方法就是所谓的“动作”方法。
BTrace的限制
为了保证跟踪动作是“仅仅读”的(也就是这些动作不能够改动被跟踪程序的状态)和有限度的(比方在固定时间里结束)。一个BTrace程序仅仅同意完毕一些指定的动作。以下是BTrace一些不能够完毕的事情:
不能创建新的对象
不能创建新的数组
不能抛出异常
不能捕获异常
不能进行不论什么的实例函数或者静态函数 -- 仅仅有com.sun.btrace.BTraceUtils类中的静态函数或者BTrace程序自己声明的
函数才干够被BTrace调用
对1.2版本号曾经的程序。不能由实例级别的field和函数。仅仅有静态公开的而且无返回值的函数才同意在BTrace类中使用。全部
的field必须是静态的。
不能够在目标程序的类,或者对象的静态或者实例级别的field进行赋值。
可是。BTrace自身的类是能够给它的静态field进行赋值的。
(也就是意味着跟踪的状态时能够更改的)
不能有outer,inner,嵌套的或者本地类。
不能有同步代码块或者同步的函数
不能有循环语句(for,while, do..while)
不能继承其他类(父类仅仅能是java.lang.Object)
不能实现接口
不能包括断言(assert)语句
can NOT use class literals (这个我也没搞明确是啥意思)
现网碰到问题,眼下须要拦截框架请求,并推断req中storeId字段为11008时,输出其它參数,方便进一步查问题。
须要拦截的类结构如图:
须要拦截match方法。match方法这里有好几个重载方法。眼下仅仅须要拦截第一个。
btrace代码:
(补充一点:在btrace代码中。没法去调用非BTraceUtils之外的方法,也就是说,要输出类各字段信息是没法通过toString()方法,由于调用instance.toString()方法是不安全,编译fail,须要自己去解析每一个字段值)
把FrameFilterTrace.java 和下载好的btrace-bin .tar.gz丢到现网上,解压btrace-bin .tar.gz。
把FrameFilterTrace.java复制到bin文件夹。
vi btrace脚本。在头上加上(export BTRACE_HOME=解压路径)。假设JAVA_HOME没有设置,也export一下。
然后jps,找到jvm PID,
运行btrace PID FrameFilterTrace.java > catch.log
完毕!
输出如图:
參考:
https://kenai.com/projects/btrace/pages/UserGuide http://linmingren2003.blog.163.com/blog/static/56751003201121871725139/ http://www.stacktrace.cn/?p=28
release-1.2.5.1
BTrace guide(1.2-20101020):
http://kenai.com/projects/btrace/pages/UserGuide
样例:在压缩包内有。
一/简介
BTrace 是一个可靠的,用来动态跟踪Java程序的工具。它通过动态对执行中的Java程序进行字节码生成来工作。BTrace会对执行中的Java程序的类插入一些跟踪操作 来对被跟踪的程序进行热替换。
BTrace 名词
探測点 (Probe Point)
就是一系列的跟踪语句被运行的“地方”或者“事件”。探測点就是我们想要运行一些跟踪语句的地方或者事件。
跟踪动作或简称动作 (Trace Actions)
就是那些当探測点被触发时所运行的跟踪语句。
动作方法
BTrace的跟踪语句是必须定义在一个类的某个静态方法里的,这个静态方法就叫“动作”方法。
BTrace 程序结构
一个BTrace程序就是一个普通的Java类,这个类至少有一个这个方案:
public static void ***
其次这种方法还须要加上BTrace相关的注解。
这些注解用来指明被跟踪程序的“位置”(也就是前面提到的探測点)。
跟踪动作须要在这个静态方法的方法体里指定。
这些(注意,能够有多个)静态方法就是所谓的“动作”方法。
BTrace的限制
为了保证跟踪动作是“仅仅读”的(也就是这些动作不能够改动被跟踪程序的状态)和有限度的(比方在固定时间里结束)。一个BTrace程序仅仅同意完毕一些指定的动作。以下是BTrace一些不能够完毕的事情:
不能创建新的对象
不能创建新的数组
不能抛出异常
不能捕获异常
不能进行不论什么的实例函数或者静态函数 -- 仅仅有com.sun.btrace.BTraceUtils类中的静态函数或者BTrace程序自己声明的
函数才干够被BTrace调用
对1.2版本号曾经的程序。不能由实例级别的field和函数。仅仅有静态公开的而且无返回值的函数才同意在BTrace类中使用。全部
的field必须是静态的。
不能够在目标程序的类,或者对象的静态或者实例级别的field进行赋值。
可是。BTrace自身的类是能够给它的静态field进行赋值的。
(也就是意味着跟踪的状态时能够更改的)
不能有outer,inner,嵌套的或者本地类。
不能有同步代码块或者同步的函数
不能有循环语句(for,while, do..while)
不能继承其他类(父类仅仅能是java.lang.Object)
不能实现接口
不能包括断言(assert)语句
can NOT use class literals (这个我也没搞明确是啥意思)
二/详细样例
现网碰到问题,眼下须要拦截框架请求,并推断req中storeId字段为11008时,输出其它參数,方便进一步查问题。须要拦截的类结构如图:
须要拦截match方法。match方法这里有好几个重载方法。眼下仅仅须要拦截第一个。
btrace代码:
(补充一点:在btrace代码中。没法去调用非BTraceUtils之外的方法,也就是说,要输出类各字段信息是没法通过toString()方法,由于调用instance.toString()方法是不安全,编译fail,须要自己去解析每一个字段值)
package btrace; import com.sun.btrace.AnyType; import com.sun.btrace.annotations.*; import java.lang.reflect.Field; import static com.sun.btrace.BTraceUtils.*; /** * Created by vernonzheng on 14-8-15. */ @BTrace public class FrameFilterTrace { @OnMethod( clazz="com.skymobi.market.applist.service.imp.CustomizedFrameMatcher", method="match", type = "com.skymobi.market.applist.entity.FrameStorageMetadata (com.skymobi.market.applist.bean.common.TlvCommonHeaderReq)" ) public static void onMatch(AnyType request){ Class frameRequestCl = classOf(request); String storeId = getVal("storeId",frameRequestCl, request); Class tlvCommentHeaderReqCl = getSuperclass(frameRequestCl); Class networkTrackCl = getSuperclass(tlvCommentHeaderReqCl); Class terminalRequestCl = getSuperclass(networkTrackCl); if(storeId!=null){ if(compare(storeId,"10118")){ //asHsman,asHstype,bizSource,sessionId,channelNo,storeId,clientVer,hsman,hstype,mnc,imsi, //networkType,capability println(strcat("vernon----store_id=10118--输出參数 : ", str(request))); println(strcat("storeId:",storeId)); println(strcat("channelNo:",getVal("channelNo",frameRequestCl,request))); println(strcat("asHsman:",getVal("asHsman",frameRequestCl,request))); println(strcat("asHstype:",getVal("asHstype",frameRequestCl,request))); println(strcat("bizSource:",getVal("bizSource",tlvCommentHeaderReqCl,request))); println(strcat("sessionId:",getVal("sessionId",tlvCommentHeaderReqCl,request))); println(strcat("clientVer:",getVal("clientVer",tlvCommentHeaderReqCl,request))); println(strcat("hsman:",getVal("hsman",terminalRequestCl,request))); println(strcat("hstype:",getVal("hstype",terminalRequestCl,request))); println(strcat("mnc:",getVal("mnc",terminalRequestCl,request))); println(strcat("imsi:",getVal("imsi",terminalRequestCl,request))); println(strcat("networkType:",getVal("networkType",terminalRequestCl, request))); println("----------------------------------------------------------"); } } } private static String getVal(String filedName,Class cl,AnyType instance){ Field field = field(classOf(cl), filedName, false); if(field!=null) { return str(get(field, instance)); }else{ return "is null"; } } }
把FrameFilterTrace.java 和下载好的btrace-bin .tar.gz丢到现网上,解压btrace-bin .tar.gz。
把FrameFilterTrace.java复制到bin文件夹。
vi btrace脚本。在头上加上(export BTRACE_HOME=解压路径)。假设JAVA_HOME没有设置,也export一下。
然后jps,找到jvm PID,
运行btrace PID FrameFilterTrace.java > catch.log
完毕!
输出如图:
參考:
https://kenai.com/projects/btrace/pages/UserGuide http://linmingren2003.blog.163.com/blog/static/56751003201121871725139/ http://www.stacktrace.cn/?p=28
相关文章推荐
- BTrace介绍和生产环境例子
- BTrace介绍和生产环境例子
- 如何在生产环境使用Btrace进行调试
- 如何在生产环境使用Btrace进行调试
- 生产环境事故排插方案--介绍篇
- 【Mongodb】 Sharding Replica Sets 分片集群生产环境安装与介绍!
- 生产环境的调试神器Btrace
- 手机软件开发环境种类介绍
- Dev-Cpp/Mingw32 环境介绍(3)
- ADTS/400集成开发环境介绍
- Dev-Cpp/Mingw32 环境介绍(14)
- 如何Dev-Cpp 环境下进行C++开发的介绍
- Dev-Cpp/Mingw32 环境介绍(11)
- Dev-Cpp/Mingw32 开发环境介绍(1)安装,新建项目与编译
- 构建跨平台的自由桌面开发环境(C/C++)(一、软件介绍)
- Dev-Cpp/MinGW32 环境介绍(13)
- NET环境下Email的技术介绍
- Dev-Cpp/Mingw32 环境介绍(6)
- Dev-Cpp/Mingw32 环境介绍
- Dev-Cpp/Mingw32 环境介绍(8)