前言:
  对线上的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. IoTimerInLineHook

    #ifndef CXX_IOTIMERINLINEHOOK_H # include "IoTimerInlineHook.h" #endif ULONG32 SSDT_NtOpen ...

  2. hdu 4618 Palindrome Sub-Array

    http://acm.hdu.edu.cn/showproblem.php?pid=4618 直接DP+记忆化 虽然时间复杂度看起来是300^4 但实际执行起来要远远小于这个值 所有可以水过 代码: ...

  3. zoj2132-The Most Frequent Number

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2132 The Most Frequent Number Time Limi ...

  4. js打印数组查看

    alert() 是不能查看数组,对象的console.log(数组变量); 然后你用火狐的friebug 在控制台查看

  5. svn自动更新

    果对svn不熟悉,当svn上面有更新时,想看到实时效果,就得去web目录手动更新,比较麻烦 其它svn有一个自动更新的功能 利用 hook   在svn 仓库目录下面有一个hook目录 在post-c ...

  6. 使用AWT组件实现验证码功能

    import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D ...

  7. CPU是怎么制造的

    大概的过程就是,先选一堆好沙子(纯净的沙子),初步加工一般在沿海,然而都是初加工,因为技术不行,所以一般用比较污染环境的方法加工大99.9%纯度的硅,然后低价卖给国外企业,用高精尖技术加工到99.99 ...

  8. C/C++中函数参数传递详解(一)

    *在定义时使用代表指针类型,其他情况代表取内容.&在定义时使用代表引用(别名),在其他情况代表取地址 在编写个人函数的时候,你将会受到C++中的一条基本的原则的限制:在默认的情况下,变量只能以 ...

  9. APP store 官方统计工具的常见的Q&A

    Apple最近在iTunesConnect里最新发布了官方统计工具,提供了现有友盟统计平台和自有统计平台无法统计的数据,具有自己的独有特点,尤其是下面几个最让人头疼的流量分析转化,可以在App Ana ...

  10. 一张图告诉你为什么 Gmail 是最好的邮箱,以及大量私货

    今天早上,我的同事详细介绍了 Gmail 相比其他邮箱的优势,比如强大的垃圾邮件过滤.简单的使用界面.强大的功能设置等等.但是对我来说,这些并不是我使用 Gmail 的最重要原因. 我第一个正式的邮箱 ...