BTrace介绍和生产环境样例
BTrace latest realese:
BTrace guide(1.2-20101020):
http://kenai.com/projects/btrace/pages/UserGuide
样例:在压缩包内有。
一/简介
BTrace会对执行中的Java程序的类插入一些跟踪操作 来对被跟踪的程序进行热替换。
这些注解用来指明被跟踪程序的“位置”(也就是前面提到的探測点)。
跟踪动作须要在这个静态方法的方法体里指定。
这些(注意,能够有多个)静态方法就是所谓的“动作”方法。
- 不能创建新的对象
- 不能创建新的数组
- 不能抛出异常
- 不能捕获异常
- 不能进行不论什么的实例函数或者静态函数 -- 仅仅有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介绍和生产环境样例的更多相关文章
- 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门演示样例
一. 工作区域具体解释 1. Scence视图 (场景设计面板) scence视图简单介绍 : 展示创建的游戏对象, 能够对全部的游戏对象进行 移动, 操作 和 放置; -- 演示样例 : 创建一个球 ...
- Ajax框架,DWR介绍,应用,样例
使用Ajax框架 1. 简化JavaScript的开发难度 2. 解决浏览器的兼容性问题 3. 简化开发流程 经常使用Ajax框架 Prototype 一个纯粹的JavaScript函数库,对Ajax ...
- Swift - 委托(delegate)的介绍,及使用样例
1,委托的说明 委托(delegate)是Cocoa的一个术语,表示将一个对象的部分功能转交给另一个对象. 比如对象A希望对象B知道将要发生或已经发生某件事情,对象A可以把对象B的引用存为一个实例变量 ...
- HBase总结(十一)hbase Java API 介绍及使用演示样例
几个相关类与HBase数据模型之间的相应关系 java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) H ...
- java mongodb连接配置实践——生产环境最优
之前百度,google了很多,发现并没有介绍mongodb生产环境如何配置的文章, 当时想参考下都不行, 所以写篇文章,大家可以一块讨论下. 1. MongoClientOptions中的连接池配置: ...
- Vue生产环境部署
前面的话 开发时,Vue 会提供很多警告来帮助解决常见的错误与陷阱.生产时,这些警告语句却没有用,反而会增加载荷量.再次,有些警告检查有小的运行时开销,生产环境模式下是可以避免的.本文将详细介绍Vue ...
- 构造Scala开发环境并创建ApiDemos演示样例项目
从2011年開始写Android ApiDemos 以来.Android的版本号也更新了非常多,眼下的版本号已经是4.04. ApiDemos中的样例也添加了不少,有必要更新Android ApiDe ...
- Cocos2d-x 3.2 Lua演示样例CurrentLanguageTest(当前语言环境)
Cocos2d-x 3.2 Lua演示样例CurrentLanguageTest(当前语言环境) 转载请注明:IT_xiao小巫 本篇博客介绍Cocos2d-x 3.2给我们提供的一个样例.获取当前程 ...
- Django 介绍、安装配置、基本使用、Django 用户注冊样例
Django介绍 Django 是由 Python 开发的一个免费的开源站点框架.能够用于高速搭建高性能.优雅的站点. DjangoMTV 的思想项目架构图 ...
随机推荐
- codevs——T1576 最长严格上升子序列
http://codevs.cn/problem/1576/ 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descr ...
- mysql基础综述(四)
1.数据库的简单介绍 1.1 数据库,就是一个文件系统,使用标准sql对数据库进行操作 1.2 常见的数据库 oracle 是oracle公司的数据库,是一个收费的大型的数据库 DB2,是IBM公司 ...
- Cocos2D-x设计模式发掘之中的一个:单例模式
http://www.tuicool.com/articles/NBRn2murl=pVtZACoQFKXC3u3uGwMLnTy4YDWihcVg0ata5gy506pmPpQEc0PO9hm6wG ...
- DPI深度报文检测架构及关键技术实现
DPI深度报文检测架构及关键技术实现 当前DPI(Deep Packet Inspect深度报文识别)技术是安全领域的关键技术点之一,围绕DPI技术衍生出的安全产品类型也非常的多样.在分析DPI的进一 ...
- 51nod-1363: 最小公倍数之和
[传送门:51nod-1363] 简要题意: 给出一个数n,求出1到n的数与n的最小公倍数的和 多组数据 题解: 理所当然推柿子 原题相当于求$\sum_{i=1}^{n}\frac{i*n}{gcd ...
- redis主从复制,读写分离
主从复制,读写分离 Master/Slave 是什么 master写入 slave读取 能干嘛 读写分离,更加安全,性能提升 怎么玩 一主二仆.薪火相传.反客为主 周明老师,能够把长篇大论总结的很精辟 ...
- DNS反射放大攻击分析——DNS反射放大攻击主要是利用DNS回复包比请求包大的特点,放大流量,伪造请求包的源IP地址为受害者IP,将应答包的流量引入受害的服务器
DNS反射放大攻击分析 摘自:http://www.shaojike.com/2016/08/19/DNS%E6%94%BE%E5%A4%A7%E6%94%BB%E5%87%BB%E7%AE%80%E ...
- EM无法登录,提示ORA-28001: the password has expired (DBD ERROR: OCISessionBegin)
--查看数据库目前的口令期限 sys@TESTDB11>select * from dba_profiles where profile = 'DEFAULT' and resource_nam ...
- Java-MyBatis:MyBatis 中 in 的用法
ylbtech-Java-MyBatis-杂项:MyBatis 中 in 的用法 1.返回顶部 1. foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元 ...
- SQL语句之Group By
1. Group By 语句简介: Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若 ...