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插件安装, 通过其插件管理器来简单安装.
Java BTrace实战(1)--BTrace的入门和使用第1张
  评注: 具体在VisualVM中: 工具->插件->可用插件, 选择BTrace WorkBench安装
  2). 单独的BTrace命令行工具
  BTrace下载网址: https://kenai.com/projects/btrace/downloads/directory/releases
  btrace-bin的目录结构如下:
  Java BTrace实战(1)--BTrace的入门和使用第2张
  评注: 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, 点击运行即可.
  结果如图所示:
  Java BTrace实战(1)--BTrace的入门和使用第3张
  当然我们也可以借助btrace的命令行工具来实现:
  1). 确定java进程的pid
  可借助jps -l来实现
  Java BTrace实战(1)--BTrace的入门和使用第4张
  评注: 选取pid为7547的进程id为目标进程
  2). 执行btrace命令
  btrace <pid> <btrace_script>
  Java BTrace实战(1)--BTrace的入门和使用第5张
  评注:打印出了堆栈信息, 以及add方法的输入参数以及函数返回结果

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

免责声明:文章转载自《Java BTrace实战(1)--BTrace的入门和使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux--如何拷贝目录Vue.js 源码分析(五) 基础篇 方法 methods属性详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

【FFMPEG】关于硬解码和软解码

一、一些命令1、显示所有可用的硬件加速器[root@tranCodeing~]#ffmpeg-hwaccelsffmpegversion4.1Copyright(c)2000-2018theFFmpegdevelopersbuiltwithgcc4.8.5(GCC)20150623(RedHat4.8.5-39)configuration:--prefix=...

玩客云安装Armbian

首先,轻扫uboot。阿里云的网卡非常痛苦。如果您没有滑动特定的uboot,则无法驱动它。有三个命令可以滑动uboot,可以按顺序执行:usbstart;fatloadusb01200000u引导。binstorerom_write12000000060000 saveenv三个命令执行后,关闭并重新启动Play Keyun一次,然后再次进入中断模式。再次插...

iview中modal如何修改标题颜色

modal默认设置transfer属性为true,然后整个弹窗就在body的下一层,所以样式修改失败,直接设置为false就可以修改样式了修改标题颜色,当然设置transfer为false后也可以修改modal中的其他样式:.ivu-modal-header-inner{color:#ba9759;}...

iOS开发(Swift):创建UINavigationView的三种方法

,表示window值我们会赋值。然后创建一个根视图控制器rootViewController,一个导航控制器navigationController。)-˃Bool{//Overridepointforcustomizationafterapplicationlaunch.window=UIWindowwindow.makeKeyAndVisible()ro...

CommonJS规范

NodeJS是本规范的实现。环境、运行、JSGILocaland远程包和包管理关于每个子规范的具体定制进度,请参考官方网站描述:Apache CouchDB和node.js。然而,这些项目中的大多数只实现了CommonJS的一些规范。具体项目及实施请参见官方网站描述:http:...

关于服务器并发量的简单计算

最简单的计算方式就是根据服务器带宽与页面的大小1.假设机房带宽为10Mbs,页面的大小为20KB同时并发量的理论值:10*1024/=64个请求/秒理论上1秒钟同时可以有64个请求访问页面。本考试系统,登陆的页面容量比较大,所有的js,css以及图片未优化前在400KB左右,我们就以400KB为基准,所有后面要用的文件是在首页一次性加载下来的。这一天的测评情...