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
最新文章
- 浅谈Bluetooth蓝牙开发
- datetime
- git/ssh捋不清的几个问题
- [No000007]搜索引擎以图搜图的原理
- Android学习笔记——menu
- 68. Longest Common Prefix
- Gradle用户指南(1)-Gradle安装
- HDU 1213 How Many Tables(并查集,简单)
- Some regret....
- Hadoop学习总结之四:Map-Reduce的过程解析
- 如何在PowerDesigner将PDM导出生成WORD文档或者html文件
- sphinx的简单实例
- [转]开源应用架构之asterisk
- poj 2777Count Color
- c# 可变性解析(协变和逆变)
- Cookie不能保存中文解决方式
- NancyFX 附录: Nuget程序包
- Java面试题总结(不定期更新)
- markdown中自己偶尔需要的小技巧
- APMServ升级php 与 Wamp升级PHP版本到5.3
热门文章
- 工具-VMWARE技巧-桥接连外网-WIN7
- 在magento的eav模型中如何在更新记录时只在value表的原值上更新
- [Linux]第四部分-Linux用户管理
- iOS 使用脚本自动化复制target
- SSM框架——具体整合教程(Spring+SpringMVC+MyBatis)
- 项目记录22-- tolua基于lua框架事件派发
- hdoj--2122--Ice_cream’s world III(克鲁斯卡尔)
- 剑指offer——04重建二叉树(Python3)
- Redis常用的命令
- init&;initWithFrame&;initWithCoder