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时,输出其它參数,方便进一步查问题。

须要拦截的类结构如图:

version=1&modificationDate=1408173471000&api=v2" alt="" style="margin:0px; padding:0px; border:0px; max-width:100%">

须要拦截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

完毕!

输出如图:

version=1&modificationDate=1408173471000&api=v2" alt="" style="margin:0px; padding:0px; border:0px; max-width:100%">

參考:

https://kenai.com/projects/btrace/pages/UserGuide

http://linmingren2003.blog.163.com/blog/static/56751003201121871725139/

http://www.stacktrace.cn/?p=28

BTrace介绍和生产环境样例的更多相关文章

  1. 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门演示样例

    一. 工作区域具体解释 1. Scence视图 (场景设计面板) scence视图简单介绍 : 展示创建的游戏对象, 能够对全部的游戏对象进行 移动, 操作 和 放置; -- 演示样例 : 创建一个球 ...

  2. Ajax框架,DWR介绍,应用,样例

    使用Ajax框架 1. 简化JavaScript的开发难度 2. 解决浏览器的兼容性问题 3. 简化开发流程 经常使用Ajax框架 Prototype 一个纯粹的JavaScript函数库,对Ajax ...

  3. Swift - 委托(delegate)的介绍,及使用样例

    1,委托的说明 委托(delegate)是Cocoa的一个术语,表示将一个对象的部分功能转交给另一个对象. 比如对象A希望对象B知道将要发生或已经发生某件事情,对象A可以把对象B的引用存为一个实例变量 ...

  4. HBase总结(十一)hbase Java API 介绍及使用演示样例

    几个相关类与HBase数据模型之间的相应关系 java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) H ...

  5. java mongodb连接配置实践——生产环境最优

    之前百度,google了很多,发现并没有介绍mongodb生产环境如何配置的文章, 当时想参考下都不行, 所以写篇文章,大家可以一块讨论下. 1. MongoClientOptions中的连接池配置: ...

  6. Vue生产环境部署

    前面的话 开发时,Vue 会提供很多警告来帮助解决常见的错误与陷阱.生产时,这些警告语句却没有用,反而会增加载荷量.再次,有些警告检查有小的运行时开销,生产环境模式下是可以避免的.本文将详细介绍Vue ...

  7. 构造Scala开发环境并创建ApiDemos演示样例项目

    从2011年開始写Android ApiDemos 以来.Android的版本号也更新了非常多,眼下的版本号已经是4.04. ApiDemos中的样例也添加了不少,有必要更新Android ApiDe ...

  8. Cocos2d-x 3.2 Lua演示样例CurrentLanguageTest(当前语言环境)

    Cocos2d-x 3.2 Lua演示样例CurrentLanguageTest(当前语言环境) 转载请注明:IT_xiao小巫 本篇博客介绍Cocos2d-x 3.2给我们提供的一个样例.获取当前程 ...

  9. Django 介绍、安装配置、基本使用、Django 用户注冊样例

    Django介绍         Django 是由 Python 开发的一个免费的开源站点框架.能够用于高速搭建高性能.优雅的站点.              DjangoMTV 的思想项目架构图 ...

随机推荐

  1. I - Agri-Net

    I - Agri-Net poj 1258 注意:多组数据输入. #include<cstdio> #include<cstring> #include<iostream ...

  2. jQuery动画animate()的使用

    自己定义动画效果: 使用方法:animate(js对象,运行时间.回调函数): js对象:{ }描写叙述动画运行之后元素的样式 运行时间:毫秒数 回调函数:动画运行结束后要运行的函数 html代码: ...

  3. Qt on Android:资源文件系统qrc与assets

    使用 Qt 为 Android 开发应用时,有时我们的应用会携带一些资源文件,如 png . jpg 等,也可能有一些配置文件,如 xml 等.这些文件放在哪里呢? 有两种方式: qrc assets ...

  4. Oracle 单表选择率

    听了猫大师的课,对Oracle CBO又加深了一步理解: 单表选择率: selectivity=1/ndv*a4nulls ocard来自dba_tables.num_rows ndv 来自dba_t ...

  5. OzymanDNS 使用——perl 5.22没有成功。。。

    最初官方的代码没有找到,但是发现github里貌似有: git clone https://github.com/splitbrain/dnstunnel.git 源码是perl写的,需要安装一些pe ...

  6. NEU 1664 传送(最短路基础 堆优化Dijkstra)

    题目描述 小A最近喜欢上一款游戏:游戏把地图分了一些区域,这些区域可能会重叠,也可能不会. 游戏中有一项传送技能,改传送技能只能将在同一区域的两个地方使用.小A可以利用区域中重叠部分来实现从某一区域到 ...

  7. Java线程池原理与架构分析

    /** * 一.线程池:提供了一个线程队列,队列中保存着所有等待状态的线程.避免了创建与销毁额外开销,提高了响应速度 * 二.线程池的体系结构 * java.util.concurrent.Execu ...

  8. leetcode 系列文章目录

    leetcode 系列文章目录 0. 两数之和1. 两数相加 2. 无重复字符的最长子串 3. 寻找两个有序数组的中位数 4. 最长回文子串 5. Z 字形变换 6. 整数反转 7. 字符串转换整数 ...

  9. 在ubuntu下安装redis

    最简单在线安装的方式: #安装Redis服务器端 ~ sudo apt-get install redis-server 安装完成后,Redis服务器会自动启动,我们检查Redis服务器程序 # 检查 ...

  10. RTSP/RTP 媒体传输和控制协议

    1 前言 本文档主要描述了 NewStream Vision 系统中前端视频服务器(DVR, 网络摄像机), 中心转发服务器以及客户端之间的多媒体通信以及控制协议. 本协议主要基于标准的 IETE 的 ...