java btrace_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插件安装, 通过其插件管理器来简单安装.

915b691cc0036a9a3b725118bcf0eaf9.png

评注: 具体在VisualVM中: 工具->插件->可用插件, 选择BTrace WorkBench安装

2). 单独的BTrace命令行工具

BTrace下载网址: https://kenai.com/projects/btrace/downloads/directory/releases

btrace-bin的目录结构如下:

9848a40be9834302b9f89327e91e0b30.png

评注: 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, 点击运行即可.

结果如图所示:

97f2a5c7b56b087f92304f0fdd7ebb00.png

当然我们也可以借助btrace的命令行工具来实现:

1). 确定java进程的pid

可借助jps -l来实现

3faeddd96e27a4eaaceccbbb025eee11.png

评注: 选取pid为7547的进程id为目标进程

2). 执行btrace命令

btrace

e8171cf73693a431433594a0a371d9b5.png

评注:打印出了堆栈信息, 以及add方法的输入参数以及函数返回结果

总结:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值