java btrace_Java应用调试利器——BTrace教程

背景

生产环境中可能出现各种问题,但是这些问题又不是程序error导致的,可能是逻辑性错误,这时候需要获取程序运行时的数据信息,如方法参数、返回值来定位问题,通过传统的增加日志记录的方式非常繁琐,而且需要重启server,代价很大。BTrace应运而生,可以动态地跟踪java运行程序,将跟踪字节码注入到运行类中,对运行代码侵入较小,对性能上的影响可以忽略不计。

配置及用法

去官网下载BTrace,配置环境变量以便在任何路径下能执行btrace命令。

命令格式:

btrace [-p ] [-cp ]

port指定BTrace agent的服务端监听端口号,用来监听clients,默认为2020,可选。

classpath用来指定类加载路径,比如你的BTrace代码里用到了netty等第三方jar包。

pid表示进程号,可通过jps命令获取。

btrace-script即为BTrace脚本。

下面是我用来测试的一条btrace命令,大家可以参考一下:

btrace -p 2020 -cp /home/mountain/Softwores/tomcat8/lib/servlet-api.jar (jps | grep Bootstrap | awk '{print $1}') /home/mountain/test/Btrace.java

实战

获取方法参数以及返回值

业务代码:

public String sayHello(String name, int age) {

return "hello everyone";

}

BTrace代码:

import com.sun.btrace.BTraceUtils;

import static com.sun.btrace.BTraceUtils.*;

import com.sun.btrace.annotations.*;

@BTrace

public class Btrace {

@OnMethod(

clazz = "com.jiuyan.message.controller.AdminController",

method = "sayHello",

location = @Location(Kind.RETURN)//函数返回的时候执行,如果不填,则在函数开始的时候执行

)

public static void sayHello(String name, int age, @Return String result) {

println("name: " + name);

println("age: " + age);

println(result);

}

}

调用sayHello('mountain', 1),输出应该是:

name: mountain

age: 1

hello everyone

可以对字符串进行正则匹配以达到监控特定问题的目的:

if(BTraceUtils.matches(".*345.*", str)) {

println(str);

}

计算方法运行消耗的时间

BTrace代码:

import java.util.Date;

import com.sun.btrace.BTraceUtils;

import static com.sun.btrace.BTraceUtils.*;

import com.sun.btrace.annotations.*;

@BTrace

public class Btrace {

@OnMethod(

clazz = "com.jiuyan.message.controller.AdminController",

method = "sayHello",

location = @Location(Kind.RETURN)

)

public static void sayHello(@Duration long duration) {//单位是纳秒,要转为毫秒

println(strcat("duration(ms): ", str(duration / 1000000)));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值