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

BTrace实战的更多相关文章

  1. Java BTrace实战(1)--BTrace的入门和使用

    前言: 对线上的java服务, 往往采用日志进行问题处理和分析. 倘若日志缺乏相关的信息时, 那又该如何处理? 远程调试会影响服务的正常工作, 修改代码重新部署的方案其实时性和灵活性难以保证(线上服务 ...

  2. 使用jvisualvm.exe 的Btrace插件介绍/使用教程

    一.背景        在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数据信息,我们可以 通过改写代码,增加日志信息的打 ...

  3. BTrace使用总结

    btracejvisualvmhotswap  一.背景        在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数 ...

  4. Btrace使用教程

    下载 下载链接:https://github.com/btraceio/btrace/releases/tag/v1.3.9 安装及环境配置 1.下载一个压缩包 2.解压 3.配置环境变量 sudo ...

  5. Java应用调试利器——BTrace教程

    http://www.jianshu.com/p/26f19095d396 背景 生产环境中可能出现各种问题,但是这些问题又不是程序error导致的,可能是逻辑性错误,这时候需要获取程序运行时的数据信 ...

  6. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  7. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  8. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  9. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

随机推荐

  1. 苹果为啥不愿意替美国FBI解锁,这是一种创新态度?

    国外媒体报道,苹果计划对iPhone进行安全更新,最新版的iOS会在手机锁定一个小时后禁用手机充电和数据端口,这意味着,消费者丢失手机或者非正常离开iPhone之后,可以通过锁定手机,来避免手机数据被 ...

  2. Facebook要做约会服务,国内社交眼红吗?

    看看现在的各种相亲趣事就能深深感悟到,中国还是以家庭为重的国家.在传统文化的浸染下,国人始终是将家庭摆在第一位.而对于欧美等发达国家来说,他们固然也以家庭为重,但更注重的是男女之间的关系定位--恋爱也 ...

  3. Listary快速查找文件

    快速查找文件 https://www.listary.com/

  4. java中的深拷贝

    对象拷贝有时让我们忽视其重要性,又或者因为想当然而导致若干程序问题. 浅拷贝 浅拷贝即普通拷贝,即对要拷贝的对象进行复制.例如对于Entity类: class Entity{ int a; Strin ...

  5. Nginx笔记总结十八:nginx统计响应的http状态码信息(ngx-http-status-code-counter)

    编译:./configure --prefix=/usr/local/nginx --add-module=../ngx_http_status_code_counter-master make &a ...

  6. Cenos配置Android集成化环境, 最终Centos libc库版本过低放弃

    To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon ...

  7. 企业级rancher搭建Kubernetes(采用rancher管理平台搭建k8s)

    一.简介 Rancher简介 来源官方:https://www.cnrancher.com/ Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源软件去从 ...

  8. Mercurial 小结

    基本操作 # 拉取 并 更新 pull pull && hg update # 撤销上一个命令(不能重复运行) hg rollback # 恢复到指定的 changeset hg st ...

  9. let和const区别

    let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. const命令 const声明一个只读的常量.一旦声明,常量的值就不能改变.

  10. Oracle中的列转行实现字段拼接用例

    文章目录 Oracle中的列转行实现字段拼接 场景 在SQL使用过程中经常有这种需求:将某列字段拼接成in('XX','XX','XX','XX','XX','XX' ...)做为查询条件. 实现 s ...