http://www.jianshu.com/p/26f19095d396

背景

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

配置及用法

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

  2. 命令格式:

    btrace [-p <port>] [-cp <classpath>] <pid> <btrace-script>

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

实战

  1. 获取方法参数以及返回值

    业务代码:

    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);
    }
  2. 计算方法运行消耗的时间

    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)));
    } }

Java应用调试利器——BTrace教程的更多相关文章

  1. 【测试工具】http协议调试利器fiddler使用教程

    转自:http协议调试利器fiddler使用教程http://bbs.phpchina.com/thread-207418-1-1.html Fiddler真乃神器!它和市面上常见的很多web调试器. ...

  2. java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试

    本内容摘自 java web轻量级开发面试教程 https://baike.baidu.com/item/Java%20Web%E8%BD%BB%E9%87%8F%E7%BA%A7%E5%BC%80% ...

  3. Java web轻量级开发面试教程的前言

    本文来是从 java web轻量级开发面试教程从摘录的. 为什么要从诸多的Java书籍里选择这本?为什么在当前网络信息量如此大的情况下还要买这本书,而不是自己通过查阅网络资料学习?我已经会开发Java ...

  4. JAVA性能调试+JProfiler使用相关

    一.JProfiler下载.安装与激活 1.1 下载 直接官网下载(https://www.ej-technologies.com/download/jprofiler/files) 建议下载9.X系 ...

  5. Fiddler(Web/HTTP调试利器)

    简述 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出"Fiddler的数据(指cookie.htm ...

  6. 20175215 2018-2019-2 第一周Linux虚拟机环境调试及java程序调试学习总结

    一.Linux虚拟机的java环境调试 之前直接在终端中使用export直接配置java的运行环境,导致每次终端被重启的时候都要重新配置java的运行环境,直到看到老师的博客Intellj IDEA ...

  7. VSCode Java 开发环境配置 详细教程

    VSCode Java 开发环境配置 详细教程 配置java 下载 用于现在大多数使用者用的是java 8,小白的我先安装java 8好了,^ w ^. 下载地址:Java 8 | Java SE 打 ...

  8. Reveal1.5破解,iOS_UI调试利器Reveal最新版本破解方法

    Reveal1.0.7破解 1.官网下载最新版Reveal,拖动应用程序中,运行一次2.下载16进制编辑器"0xED" for mac(http://dl.vmall.com/c0 ...

  9. selenium2 Webdriver + Java 自动化测试实战和完全教程

    selenium2 Webdriver + Java 自动化测试实战和完全教程一.快速开始 博客分类: Selenium-webdriverselenium webdriver 学习selenium ...

随机推荐

  1. 20162328蔡文琛week02

    学号 20162328 <程序设计与数据结构>第2周学习总结 教材学习内容总结 这周学习了课本中的第二章内容,比起第一章,本章难度有略微底稿,从刚开始的显示字符转变为简单的加减乘除运算,经 ...

  2. SpringMVC拦截器实现登录认证(转发)

    感谢原作者,转发自:http://blog.csdn.net/u014427391/article/details/51419521 以Demo的形式讲诉拦截器的使用 项目结构如图: 需要的jar:有 ...

  3. java---迭代器(Iterator)

    迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的Iterator功能比较简单, ...

  4. 修改IP的批处理

    昨天遇到一个客户,说是抢火车票来着,用了3个公网IP,要求在抢票前15分钟换次IP(看我这毛病,废话多了,正题) 系统是2003 32位的 因为自己不懂脚本,网上找了个修改了下,就有了下面的脚本: 首 ...

  5. IPython 4.0发布:Jupyter和IPython分离后的首个版本

    IPython 4.0日前正式发布,这是IPython分离成IPython和Jupyter后的第一个重要版本. 更新Jupyter的快捷方式是: pip install --upgrade jupyt ...

  6. ifstat查看网络流量的原理

    ifstat查看网卡流量的原理:读的是哪个/proc/ 接口啊 同diskIO一样,网络的IO也同样有统计计数的,是/proc/net/dev一个典型的输出就是这个样子的: root@station6 ...

  7. [STL] vector基本用法

    vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的内部机制会自行扩 ...

  8. 使用 ECS 实例创建 FTP 站点 linux

    本文只做记载过程和问题,并不详细 官方教程走一遍 https://help.aliyun.com/document_detail/51998.html#h2-linux-ftp-2 值得注意的是步骤二 ...

  9. Bootstrap排版类

    类 描述 实例 .lead 使段落突出显示 尝试一下 .small 设定小文本 (设置为父文本的 85% 大小) 尝试一下 .text-left 设定文本左对齐 尝试一下 .text-center 设 ...

  10. 【BZOJ5297】【CQOI2018】社交网络(矩阵树定理)

    [BZOJ5297][CQOI2018]社交网络(矩阵树定理) 题面 BZOJ 洛谷 Description 当今社会,在社交网络上看朋友的消息已经成为许多人生活的一部分.通常,一个用户在社交网络上发 ...