当前位置: 首页 > news >正文

BTrace实战

BTrace在解决现场问题的时候非常有用。

1、概述

1.1下载

https://github.com/btraceio/btrace,最新版本是1.3.9

目前1.3.x系列最低支持JDK1.7,要想使用JDK1.6的话,可以下载http://download.csdn.net/detail/ccscu/9899450

1.2开始使用

使用命令:./btrace pid HelloWorld.java

1.3安全限制

默认不支持for循环等,可以使用-u来突破限制

1.4定义classpath

-cp

1.5输出结果到文件

推荐使用重定向而不是-o

1.6预编译脚本

./btractc HelloWorld.java

2、拦截方法定义

1、构造函数的名称是<init>

@OnMethod(clazz="java.util.Timer", method="<init>")

2、内部类的名称是在类名和内部类之间加上$

@OnMethod(clazz="org.apache.struts2.dispatcher.Dispatcher$Locator", method="getLocation")

3、拦截多个同名的函数,可以定义不同的参数列表区分

 

3、拦截时机

3.1Kind.ENTRY和Kind.RETURN

location=@Location(Kind.RETURN)

默认值就是Kind.ENTRY,如果使用AnyType来定义,必须使用Kind.ENTRY,否则会进入一种特殊的静默模式;

如果想获得返回值或者运行时间,必须使用Kind.RETURN。

3.2Kind.THROW

@OnMethod(clazz = "org.apache.coyote.tomcat5.CoyoteResponse", method = "getWriter", location = @Location(Kind.THROW))

 

4、获取this、参数和返回值

4.1定义注入

@OnMethod(clazz = "java.util.HashMap", method = "put", location = @Location(Kind.RETURN))
 public static void onPutMap(@Self Object obj, String key, String value, @Return AnyType result)

参数列表要么不定义,要定义就需要完整,否则BTrace无法处理同名函数;

也可以使用AnyType或者AnyType[]来表示,这个时候必须使用Kind.ENTR,否则会进入一种特殊的静默模式,只要有一个函数打印错了,整个BTrace就什么也打印不出来。

4.2获取对象的属性值

如果是JDK的类

field("java.lang.Thread", "name");

非JDK的类

private static Field response = field(classForName("com.neusoft.unieap.techcomp.ria.action.BaseEntry", contextClassLoader()), "response") ;

Object res = get(response, obj);

这里除了get方法之外,还有getBoolean、getInt等各种基础类型的方法。

 

5、其他常用API

5.1获取当前线程名称

BTraceUtils.Threads.name(BTraceUtils.currentThread())

5.2获取队形的Hash code

BTraceUtils.identityHashCode(params[1])

5.3获取对象的类名称

BTraceUtils.Reflective.name(BTraceUtils.classOf(obj))

其中BTraceUtils.classOf(obj)返回类,BTraceUtils.Reflective.name返回类名称

 

在写这篇文章的时候借鉴了以下文章:

1、http://calvin1978.blogcn.com/articles/btrace1.html

江南白衣的文笔一流,他的BTrace的文章架构非常好:我完全模仿了他的结构

2、http://www.bo56.com/btrace示例和资料整理/

学习了如何拿到成员变量的值

 3、https://www.gitbook.com/book/json-liu/btrace/details

BTrace的中文使用手册,入门必备

 

欢迎查看我之前的博客 http://blog.csdn.net/ccscu

转载于:https://www.cnblogs.com/cc1840/p/7173851.html

相关文章:

  • windows下安装配置hadoop
  • JavaScript(jQuery)实现打印英文格式日期
  • eclipse运行hadoop wordcount example
  • linux6.5环境下安装python
  • protobuf-2.5.0的下载与安装
  • ibatis入门
  • 将DataTable转换为ListT对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”。...
  • php无限分类
  • java servlet实例
  • POJ 3154 Graveyard【多解,数论,贪心】
  • C++ 浅谈 strlen 与 sizeof的区别
  • 产品设计的原则之一:精简你的产品
  • 产品设计之二:优化你的产品细节
  • oracle创建/删除表空间、创建/删除用户并赋予权限
  • hive sql分区表
  • 【翻译】babel对TC39装饰器草案的实现
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【剑指offer】让抽象问题具体化
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • ERLANG 网工修炼笔记 ---- UDP
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • java概述
  • Java小白进阶笔记(3)-初级面向对象
  • Logstash 参考指南(目录)
  • Next.js之基础概念(二)
  • Service Worker
  • SwizzleMethod 黑魔法
  • vuex 笔记整理
  • Webpack 4 学习01(基础配置)
  • 代理模式
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 反思总结然后整装待发
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 我们雇佣了一只大猴子...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • ()、[]、{}、(())、[[]]命令替换
  • (a /b)*c的值
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (力扣)循环队列的实现与详解(C语言)
  • (四)Android布局类型(线性布局LinearLayout)
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET Remoting学习笔记(三)信道
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • /proc/vmstat 详解
  • ??myeclipse+tomcat
  • @Autowired自动装配