下载

下载链接:https://github.com/btraceio/btrace/releases/tag/v1.3.9

安装及环境配置

1.下载一个压缩包

2.解压

3.配置环境变量 sudo vi /etc/profile 添加   export BTRACE\_HOME=/home/josonliu/btrace     export PATH=$PATH:$BTRACE\_HOME/bin PS:BTRACE\_HOME必须是你解压的路径

4.使配置生效  source /etc/profile  这样就可以在任何地方使用 btrace 命令了

BTrace简介及使用须知

BTrace是一个可以对 JAVA 进行安全、动态追踪的工具。为了保证在追踪动作的只读性,追踪动作不能改变程序的状态。一般来说 BTrace 具体有以下限制(禁令):

1.不准创建新对象!

2.不准创建新数组!

3.不准抛出异常!

4.不准捕捉导常!

5.不准使用断言或静态方法 只准使用 com.sun.btrace.BTraceUtils 中定义的类和方法及脚本里定义的 static 方法。

6.不准对追踪的类或对象进行赋值操作

7.不准使用外部、内部、嵌入或本地类

8.不准实现接口

9.不准使用循环

其实就是一句话 只使用 println\(\) 方法进行打印信息就好 哈哈

使用方法

1.找到要监控的 JVM进程 PID 

    a.通过 top -c 命令找到

    b.通过 ps -ef \| grep 对应进程标识

2.切换到进程拥有账户 一般为 www-data

    a.sudo -s 切换到 root 账户

    b.btracec 监控脚本  对监控脚本进行预编译 这一点很重要,可以在运行前发现错误。特别是应用到线上环境,必须强制先预编译一下,看是否报错。

    c.sudo -u www-data btrace $PID $监控脚本

3.如需修改监控只需要停止运行后 修改脚本 然后运行脚本即可。

4.BTrace脚本在进程重启后会失效。

使用场景

1.查看某一个方法中入参

2.查看某一个方法的响应时间

3.查看某一个方法中所有外部调用的响应时间,方便定位方法响应慢的具体位置及原因

4.查看谁调用了 System.gc(),及其对应的调用栈

实战DEMO

1.监控指定方法的耗时

import com.sun.btrace.annotations.\*;

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

@BTrace

public class CheckOnlineStatus{

    //监控某一个方法的执行时间

    @OnMethod\(clazz = "com.joson.btrace.service.impl.BtraceServiceImpl",method = "getCount",location=@Location\(Kind.RETURN\)\)

    public static void printMethodRunTime\(@ProbeClassName String probeClassName,@Duration long duration\){

        println\(probeClassName + ",duration:" + duration / 1000000 + " ms"\);

    }

}

这里是监控 BtraceServiceImpl 方法中 getCount 的调用情况。duration是以纳秒为单位的,所以换算成 MS 比较好看一点 ,其他例子也是如此考虑。

2.监控指定函数中所有外部调用的耗时情况.PS:这里最好只监控一个函数 太多的话 性能没法看

import com.sun.btrace.annotations.\*;

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

@BTrace

public class CheckOnlineStatus{

    //监控某一个方法的执行时间

    @OnMethod\(clazz = "com.joson.btrace.service.impl.BtraceServiceImpl",method = "getCount",

    location=@Location\(value=Kind.CALL,clazz="/.\*/",method="/.\*/",where = Where.AFTER\)\)

    public static void printMethodRunTime\(@Self Object self,@TargetInstance Object instance,@TargetMethodOrField String methon,@Duration long duration\){

        if\( duration > 5000000 \){//如果耗时大于 5 毫秒则打印出来 这个条件建议加 否则打印的调用函数太多 具体数值可以自己调控

            println\(methon + ",cost:" + duration / 1000000 + " ms"\);

        }

    }

}

这里是监控 BtraceServiceImpl 类中 getCount 方法内的外部方法调用情况并打印出响应时间大于 5 MS 的外部调用方法名 。

通过注入 @TargetInstance 和 @TargetMethodOrField 参数,告诉脚本实际匹配到的外部函数调用的类及方法名\(或属性名\)

3.按接口、父类监控方法的执行

import com.sun.btrace.annotations.\*;

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

@BTrace

public class InterfaceMonitor{

    //监控某一个方法的执行时间

    @OnMethod\(clazz = "+com.joson.btrace.service.BtraceService",method = "getCount",location=@Location\(Kind.RETURN\)\)

    public static void printMethodRunTime\(@ProbeClassName String probeClassName,@Duration long duration\){

        println\(probeClassName + ",cost time:" + duration / 1000000 + " ms"\);

    }

}

这里是监控 BtraceService 接口的所有实现类中 对 getCount 方法的调用情况。

4.正则表达式定位监控

通过正则表达式可以实现批量定位,正则表达式需要写在两个 "/" 中间。PS:建议正则表达式的范围要尽可能的小,不然会非常慢。

import com.sun.btrace.annotations.\*;

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

@BTrace

public class ServiceMonitor{

    //监控某一个方法的执行时间

    @OnMethod\(clazz = "/com.joson.btrace.service.\*/",method = "/.\*/",location=@Location\(Kind.RETURN\)\)

    public static void printMethodRunTime\(@ProbeClassName String probeClassName,@ProbeMethodName String probeMethod,@Duration long duration\){

        println\( probeClassName + "." + probeMethod + " cost time: " + duration / 1000000 + " ms."\);

    }

}

这里是监控 com.joson.btrace.service 包下的所有类与方法,并打印其调用时间 以 MS 为单位。

通过在函数里注入 @ProbeClassName,@ProbeMethodName 参数,告诉脚本实际匹配到的类和方法名。

5.监控代码是否到达了某类的某一行

import com.sun.btrace.annotations.\*;

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

@OnMethod\(clazz = "java.net.ServerSocket", location = @Location\(value = Kind.LINE, line = 363\)\)

public static void onBind4\(\) {

   println\("socket bind reach line:363"\);

}

这里是监控代码是否到达了 Stock类的 363 行。

6.打印某个类中 某一方法的入参

import com.sun.btrace.AnyType;

import com.sun.btrace.annotations.\*;

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

@BTrace

public class ServiceMonitor{

    //监控某一个方法的执行时间

    @OnMethod\(clazz = "com.joson.btrace.service.BtraceService",method = "getCount",location=@Location\(Kind.RETURN\)\)

    public static void printMethodRunTime\(@Self Object self,String type,Integer limit,@Return AnyType result \){

        println\( "type: " + type + " ,limit: " + limit  \);

        println\("result : " + result \);

    }

}

这里是监控 BtraceService 类中 getCount 方法的所有入参及返回值

对于入参,不需要打印的也可以不定义 但是定义一定要按顺序。比如参数列表不能放在返回值的后面。

对于返回值类型 如果是非基本类型 则直接用 AnyType 类型即可。

7.查看谁调用了 GC

import com.sun.btrace.annotations.\*;

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

@OnMethod\(clazz = "java.lang.System", method = "gc"\)

public static void onSystemGC\(\) {

    println\("entered System.gc\(\)"\);

    jstack\(\);// print the stack info.

}

8.其他用法参考链接:https://github.com/btraceio/btrace/tree/master/samples

from: https://json-liu.gitbooks.io/btrace/content/

Btrace使用教程的更多相关文章

  1. Btrace官方教程-中文版

    教程英文版来源:https://github.com/btraceio/btrace/blob/master/docs/usersguide.html BTrace用户指南 BTrace是一种安全,动 ...

  2. BTrace入门教程

    bin版:https://kenai.com/projects/btrace/downloads/directory/releases 源码:https://github.com/btraceio/b ...

  3. BTrace:线上问题排查工具

    BTrace简介 GitHub地址:BTrace 下载地址:v1.3.11.3 官方使用教程:Btrace使用教程 使用场景 BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存 ...

  4. 利用jvisualvm使用btrace进行线上调试案例

    用途:btrace主要用于线上调试.通过btrace,可在不改动代码的前提下,方便的发现以下问题: 1.定位性能慢的接口服务: 2.实时打印堆栈信息,定位死锁位置: 3.定位占用大量内存空间的代码块: ...

  5. 使用jvisualvm.exe 的Btrace插件介绍/使用教程

    一.背景        在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数据信息,我们可以 通过改写代码,增加日志信息的打 ...

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

    http://www.jianshu.com/p/26f19095d396 背景 生产环境中可能出现各种问题,但是这些问题又不是程序error导致的,可能是逻辑性错误,这时候需要获取程序运行时的数据信 ...

  7. btrace 笔记

    转载请注明原链接地址 http://www.cnblogs.com/dongxiao-yang/p/6134393.html btrace 是一个可以不用重启线上java业务查问题的神器,记一下自己折 ...

  8. BTrace使用小结

    简介 BTrace是一个安全的JVM动态追踪工具,最初为原Sun公司Kenai项目下面的一个子项目. 典型的使用场景是,“我要查个问题,可那个方法没有打印入口参数和返回结果日志”,“我想看某个方法的执 ...

  9. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

随机推荐

  1. Github之协同开发

    一.协同开发 1.引子:假如三个人共同开发同一份代码,每个人都各自安排了任务,当每个人都完成了一半的时候,提交不提交呢? 要提交,提交到dev吗,都上传了一半,这样回家拿出来的代码根本跑不起来.所以, ...

  2. vue之导入Bootstrap以及jQuery的两种方式

    Vue引入bootstrap主要有两种方法 方法一:在main.js中引入,此方法导入的bootstrap中对于html,body的一些预设置的css样式可能无效. 一.引入jQuery 在当前项目的 ...

  3. python+selenium+Jenkins构建自动化测试

    环境准备 本次使用JDK:1.8.tomcat:8.5.Jenkins:2.127 安装jdk 官方下载地址 安装教程参考 安装tomcat 和jenkins tomcat官方下载地址 jenkins ...

  4. python 全栈开发,Day22(封装,property,classmethod,staticmethod)

    一.封装 封装 : 广义上的 :把一堆东西装在一个容器里 狭义上的 :会对一种现象起一个专门属于它的名字 函数和属性装到了一个非全局的命名空间 —— 封装 隐藏对象的属性和实现细节,仅对外提供公共访问 ...

  5. JDBC事务,银行转账,货物进出库等等。

    1:转账业务 转账必须执行2个sql语句(update更新)都成功的情况下,提交事务,如果有一个失败,则2个都回滚事务2:事务应该具有4个属性:原子性.一致性.隔离性.持久性.这四个属性通常称为ACI ...

  6. window.jQuery || document...

    window是浏览器端的全部数据变量的引用.比如 window.window === window window.jQuery 就是浏览器中的全局变量里的jQuery那为什么不写 jQuery 而是写 ...

  7. Python 豆瓣源

    国内的pythoner强烈建议使用豆瓣的pypi源 https://pypi.douban.com/simple/ sudo pip install -i https://pypi.douban.co ...

  8. 编译linux内核以及添加系统调用的全过程

    参考链接: https://www.zybuluo.com/hakureisino/note/514321# 北京邮电大学操作系统实验: https://wenku.baidu.com/view/6d ...

  9. (转)一位资深程序员大牛给予Java初学者的学习路线建议

    原文:http://geek.csdn.net/news/detail/238256 Java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的 ...

  10. poj 2253 Frogger (最小最大路段)【dijkstra】

    <题目链接> 题目大意: 给出青蛙A,B和若干石头的坐标,现青蛙A想到青蛙B那,A可通过任意石头到达B,问从A到B多条路径中最小的最长边. 解题分析: 这是最短路的一类典型题目,与普通的最 ...