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

前言:
  对线上的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",
        [email protected](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的概念, 用途和实战例子进行讲述. 敬请期待.

时间: 2024-08-06 16:10:21

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

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

http://www.jianshu.com/p/26f19095d396 背景 生产环境中可能出现各种问题,但是这些问题又不是程序error导致的,可能是逻辑性错误,这时候需要获取程序运行时的数据信息,如方法参数.返回值来定位问题,通过传统的增加日志记录的方式非常繁琐,而且需要重启server,代价很大.BTrace应运而生,可以动态地跟踪java运行程序,将跟踪字节码注入到运行类中,对运行代码侵入较小,对性能上的影响可以忽略不计. 配置及用法 去官网下载BTrace,配置环境变量以便在任何路

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

Java编程实战宝典PDF 目录 第1篇 Java基础知识入门第1章 Java的开发运行环境( 教学视频:57分钟)1.1 Java运行原理与Java虚拟机1.1.1 Java运行原理简述1.1.2 Java虚拟机1.2 Java的开发环境1.2.1 JDK的安装1.2.2 如何设置系统环境变量1.2.3 JDK安装后的测试与验证1.2.4 编译命令的使用1.2.5 解释执行命令的使用1.2.6 UltraEdit的使用1.3 Java应用程序示例1.4 Java Applet程序示例1.5 本

[Java 05 OO] (基础篇) 《Java开发实战经典》

p5OO 第五章 面向对象 (基础篇) Notes (1), Constructor / this / String   String str1 = "hello"; 解释 : 是把一个在堆内存空间的使用权给了 str1 对象.   String str2 = "hello"; str1 == str2 是 true   String 字符串的内容不可改变 (2), Java 常用的内存区域    1), 栈内存空间    2), 堆内存空间    3), 全局数据

【java项目实战】dom4j解析xml文件,连接Oracle数据库

简介 dom4j是由dom4j.org出品的一个开源XML解析包.这句话太官方,我们还是看一下官方给出的解释.如下图: dom4j是一个易于使用的.开源的,用于解析XML,XPath和XSLT等语言的库.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP等编程标准. 特点 dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用的特点,同时它也是一个开放源代码的软件.如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例

【java项目实战】Servlet详解以及Servlet编写登陆页面(二)

Servlet是Sun公司提供的一门用于开发动态web网页的技术.Sun公司在API中提供了一个servlet接口,我们如果想使用java程序开发一个动态的web网页,只需要实现servelet接口,并把类部署到web服务器上就可以运行了. 到底什么是Servlet呢? 通俗一点,只要是实现了servlet接口的java程序,均称Servlet.Servlet是由sun公司命名的,Servlet = Server + Applet(Applet表示小应用程序),Servlet是在服务器端运行的小

Java爬虫实战(二):抓取一个视频网站上2015年所有电影的下载链接

前言:这是Java爬虫实战的第二篇文章,在第一篇文章仅仅只是抓取目标网站的链接的基础上,进一步提高难度,抓取目标页面上我们所需要的内容并保存在数据库中.这里的测试案例选用了一个我常用的电影下载网站(http://www.80s.la/).本来是想抓取网站上的所有电影的下载链接,后来感觉需要的时间太长,因此改成了抓取2015年电影的下载链接. 注:文末有我抓取到的整个列表的下载链接(包括:电影名称和迅雷下载链接) 一 原理简介 其实原理都跟第一篇文章差不多,不同的是鉴于这个网站的分类列表实在太多,

java并发实战--java线程的带来的问题

最近小编被一家互联网企业给敲响了警钟,感觉在java面试当中java并发问题是每一家企业都关心的问题.所以准备恶补这方面的漏洞.决定在工作之余,好好学习<java并发实战>这本书,欢迎各位大神前来吐槽和分享. 线程带来的风险问题 1.安全性问题 当用户在执行如下程序是会产生安全性问题: public class UnSafeSquence{ private int value; public int getNext(){ return value++; } } 如果执行单个线程是不会有问题的,

Java NIO实战之聊天室

在工作之余花了两个星期看完了<Java NIO>,总体来说这本书把NIO写的很详细,没有过多的废话,讲的都是重点,只是翻译的中文版看的确实吃力,英文水平太低也没办法,总算也坚持看完了.<Java NIO>这本书的重点在于第四章讲解的"选择器",要理解透还是要反复琢磨推敲:愚钝的我花了大概3天的时间才将NIO的选择器机制理解透并能较熟练的运用,于是便写了这个聊天室程序. 下面直接上代码,jdk1.5以上经过测试,可以支持多人同时在线聊天: 将以下代码复制到项目中便

&lt;java开发实战经典&gt;

<JAVA开发实战经典>&&<JAVA WEB开发实战经典> JAVA开发实战经典总结: 第一章:介绍 第二章:基本语法(数据类型.常量.变量.数据类型的强制转换)