前言:
  对线上的java服务, 往往采用日志进行问题处理和分析. 倘若日志缺乏相关的信息时, 那又该如何处理? 远程调试会影响服务的正常工作, 修改代码重新部署的方案其实时性和灵活性难以保证(线上服务的流程繁琐, 问题追踪的不确定性), 有没有两全的完美方案(不影响正常服务, 又灵活/无侵入性)呢?
  答案是有, 它就是人见人爱, 花见花开的神器BTrace. 那BTrace究竟是这么样的神器, 为何它只要998(啊呸..., -_-bbb). 好了, 让我们一步一步的掀起它的红盖头来. 本系列讲述BTrace的使用/原理/技巧, 希望对大家有所帮助, 对自己也是种学习经历.
  本文着重讲解Btrace的安装, 原理和初步使用.

BTrace的原理篇:
  BTrace的首字母B来自于bytecode, 某种程度上透露了其原理. 其能在不影响目标程序运行的前提下, 通过HotSpot虚拟机的HotSwap技术动态插入原本不存在的调试代码, 其是基于了JDK 6的Instumentation来实现的. 具体的原理介绍, 可以参考博文: Btrace的基本原理.

BTrace的安装:
  BTrace的安装有两种方式.
  1). VisualVM的插件形式存在
  VisualVM的BTrace插件安装, 通过其插件管理器来简单安装.

  评注: 具体在VisualVM中: 工具->插件->可用插件, 选择BTrace WorkBench安装
  2). 单独的BTrace命令行工具
  BTrace下载网址: https://kenai.com/projects/btrace/downloads/directory/releases
  btrace-bin的目录结构如下:
  
  评注: bin为二进制/脚本目录, docs是api文档, samples包含btrace的各种例子和说明

BTrace的使用:
  让我们来构造一个简单的java程序, 来作为测试程序.

public class Calculator {

  public int add(int a, int b) {
    return a + b;
  }   public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    Calculator roboot = new Calculator();
    while ( scanner.hasNext() ) {
      int a = scanner.nextInt();
      int b = scanner.nextInt();
      int c = roboot.add(a, b);
      System.out.println(
        String.format("%d + %d = %d", a, b, c));
    }
  } }

  评注: Calculator类的函数add用于a+b的计算, Scanner用于交互, 从命令行读入输入参数.
  接着我们编写一段BTrace代码, 用于跟踪Calculator类的add函数.

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*; @BTrace
public class TracingScript {
@OnMethod(
clazz="mmxf.btrace.test.Calculator",
method="add",
location=@Location(Kind.RETURN)
) public static void func(
int a, int b,
@Return int result) {
println("trace: =======================");
jstack();
println(strcat("a:", str(a)));
println(strcat("b:", str(b)));
println(strcat("result:", str(result)));
}
}

  先借助VisualVM的BTrace插件来完成调试:
  可从VisualVM获取java的进程, 然后点击Trace Application, 导入BTrace Script, 点击运行即可.
  结果如图所示:
  
  当然我们也可以借助btrace的命令行工具来实现:
  1). 确定java进程的pid
  可借助jps -l来实现
  
  评注: 选取pid为7547的进程id为目标进程
  2). 执行btrace命令
  btrace <pid> <btrace_script>
  
  评注:打印出了堆栈信息, 以及add方法的输入参数以及函数返回结果

总结:
  本文只是个开头, 对btrace的安装和使用有个初步的认识, 后续的文章会对btrace的概念, 用途和实战例子进行讲述. 敬请期待.

Java BTrace实战(1)--BTrace的入门和使用的更多相关文章

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

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

  2. Java软件生产监控工具Btrace的使用

    Btrace BTrace是sun公司推出的一款Java 动态.安全追踪(监控)工具,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数.返回值.全局变量和堆栈信息等, ...

  3. Java编程实战宝典PDF (中文版带书签)

    Java编程实战宝典PDF 目录 第1篇 Java基础知识入门第1章 Java的开发运行环境( 教学视频:57分钟)1.1 Java运行原理与Java虚拟机1.1.1 Java运行原理简述1.1.2 ...

  4. selenium2 Webdriver + Java 自动化测试实战和完全教程

    selenium2 Webdriver + Java 自动化测试实战和完全教程一.快速开始 博客分类: Selenium-webdriverselenium webdriver 学习selenium ...

  5. maven3实战之maven使用入门(使用archetype生成项目骨架)

    maven3实战之maven使用入门(使用archetype生成项目骨架) ---------- maven提供了archetype以帮助我们快速勾勒出项目骨架.以Hello World为例,我们使用 ...

  6. 大白话说Java泛型(一):入门、原理、使用

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型(一):入门.原理.使用> 远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的.当时 Java 程序员们写集合类的 ...

  7. 为 Java 程序员准备的 Go 入门 PPT

    为 Java 程序员准备的 Go 入门 PPT 这是 Google 的 Go 团队技术主管经理 Sameer Ajmani 分享的 PPT,为 Java 程序员快速入门 Go 而准备的. 视频 这个 ...

  8. 转 Java操作PDF之iText详细入门

    转 Java操作PDF之iText详细入门 2016年08月08日 11:06:00 阅读数:19490 iText是著名的开放项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成 ...

  9. Java基础-SSM之Spring MVC入门篇

    Java基础-SSM之Spring MVC入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spring MVC简介 1>.什么是Spring MVC 答:Sprin ...

随机推荐

  1. JavaScript 字符串和日期内容整理

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. HTTP协议的chunked编码

    一般情况HTTP的Header包含Content-Length域来指明报文体的长度.如: 有时候服务生成HTTP回应是无法确定消息大小的,比如大文件的下载,或者后台需要复杂的逻辑才能全部处理页面的请求 ...

  3. Zabbix页面遇到历史记录的乱码需要修改数据库

    Zabbix页面遇到历史记录的乱码需要修改数据库: 解决办法: 1.将 zabbix 数据库中的表备份: 2.手动删除 zabbix 数据库: 3.重新创建 zabbix 库时手动指定字符集为 utf ...

  4. linux命令每日一练习-pwd,cd

    pwd显示当前路径. pwd -P没能明白什么意思, cd 进入目录 cd ..返回上级目录

  5. 本节向大家介绍一下UML建模误区

    本节向大家介绍一下UML建模误区,这里向大家介绍九个误区,希望通过本节的学习,你对UML建模有清晰的认识,以免在以后使用过程中产生不必要的麻烦.下面让我们一起来看一下这些建模误区吧. UML建模误区 ...

  6. SSH(1)

    假定服务器ip为192.168.1.139,ssh服务的端口号为22,服务器上有个用户为pi,两边都是ubuntu 一,Init *安装 如果是想用ssh从本机登陆别的机器,只需要安装openssh- ...

  7. 介绍NSURLSession网络请求套件

    昨天翻译了一篇<NSURLSession的使用>的文章,地址:http://www.cnblogs.com/JackieHoo/p/4995733.html,原文是来自苹果官方介绍NSUR ...

  8. 12-28 显示团购数据界面的搭建,cell的自定义方面的知识总结

    1.通过plist加载模型数据 2.controller中懒加载数据 3.设置tableView的数据源 4.写数据源的方法 5.观察演示项目,分析通过默认的cell的4种现实方式,无法实现要想要的现 ...

  9. Cisco路由器的6种模式

    Cisco路由器的6种模式 -------------------------------------------------------------------------------------- ...

  10. VS2013失去智能提示如何恢复

    一般智能提示包括,输入智能提示,鼠标移到类,方法,接口,变量上面自动提示相关信息,VS2013常常会失去这种提示功能,遇到这种情况可以这样解决: 1.在开发环境中随便打开一个xxx.aspx页面,也就 ...