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

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)));
       }
    
    }
时间: 2024-10-11 07:01:51

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

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

本文来是从 java web轻量级开发面试教程从摘录的. 为什么要从诸多的Java书籍里选择这本?为什么在当前网络信息量如此大的情况下还要买这本书,而不是自己通过查阅网络资料学习?我已经会开发Java Web程序了,有没有必要买这本书? 笔者有12年的Java经验,目前是某大型公司的架构师,知道软件公司对高级程序员的实际需求:而且笔者在大公司里有过5年的技术面试经验,面试过的人数上百,所以知道毕业生和初级程序员的普遍情况.笔者更有过5年多的Java培训经验,知道如何在短时间内把有毅力.有决心,但

《Java: The Complete Reference》《Java 8 编程参考官方教程(第9版)》读书笔记

春节期间读了下<Java: The Complete Reference>发现这本书写的深入浅出,我想一个问题,书中很多内容我们也知道,但是为什么我们就写不出这样一本书,这么全面,这么系统,这么简单易懂.不得不佩服Herbert Schildt的编程功底,需要提到的是Herbert Schildt写了很多Java和C.C++的书,他是C.C++.Java和C#编程语言的权威,是ANSI/ISO组织C语言标准化委员会的委员. Herbert Schildt最新的基本Java著作其实都差不多,在内

前端调试利器---nproxy

前言:习惯了在windows环境中使用Fiddler的童鞋们,是不是感觉它的网络重定向功能很酷,Fiddler能按照你设置的规制捕获网络请求,再指向本地文件,如拦截你的js文件到本地,就能很快的调试线上环境(如后台环境,测试环境,预上线环境等).但是Fiddler的使用对于初学者来说还是稍有困难的,界面功能很多,导致新手无从下手.(我当初就是这样的),并且Fiddler虽然有Mac版本,但是问题很多,我试了好几次都不行. 正文:今天给大家介绍一款新的神器,nproxy.它能通吃windows,l

数据库面试技巧,通过JDBC展示自己专业性,摘自java web轻量级开发面试教程

这篇文章是我之前写的博文 数据库方面的面试技巧,如何从建表方面展示自己能力 和 面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程是一个系列的,通过面试官的视角和大家分享在数据库方面的面试经验,这些内容都来摘自  java web轻量级开发面试教程. 之前的两篇文章点击量都还行,也感谢管理员放入首页,这鼓舞到了我,也让我更有信心和大家分享我的经验. 我们知道,最终我们是要通过jdbc来连接并访问数据库的,也就是说,最近面试官一定会通过JDBC方面的技能来考核候选人

java 断点调试

最基本的操作是:  1, 首先在一个java文件中设断点,然后运行,当程序走到断点处就会转到debug视图下, 2, F5键与F6键均为单步调试,F5是step into,也就是进入本行代码中执行,F6是step over, 也就是执行本行代码,跳到下一行, 3,F7是跳出函数 step return 4,F8是执行到最后. =========================== F8 resume 跳到下一个断点 F7 step return 返回到调用的地方(好比你按F5进入了调用函数的内部

(java web后端方向)如何让你的简历为你争取到更多的面试机会,内容来自java web轻量级开发面试教程

我们在做培训时,会发现一个不合理的情况,一些程序员能力不错,在公司里也是技术牛人,但发出去的简历往往会石沉大海,没有回复.对于刚毕业的大学生或工作年限在2年之内的程序员,这个情况会更严重. 这种情况下,其实不是你的能力有问题,而是简历筛选人(往往是人事或技术面试官)无法从简历上看出你很牛,或者即使能从简历上感觉到你能力很强,但会感觉到你的能力和公司的需求不匹配.不管是哪种情况,结果都一个,你甚至得不到技术面试的机会. 笔者在这里,将根据面试多个候选人(至今有100以上)的经验,来向大家展示准备简

java web轻量级开发面试教程读书笔记:建索引时我们需要权衡的因素

场景一,数据表规模不大,就几千行,即使不建索引,查询语句的返回时间也不长,这时建索引的意义就不大.当然,若就几千行,索引所占的空间也不多,所以这种情况下,顶多属于"性价比"不高. 场景二,某个商品表里有几百万条商品信息,同时每天会在一个时间点,往其中更新大概十万条左右的商品信息,现在用where语句查询特定商品时(比如where name = 'XXX')速度很慢.为了提升查询效率可以建索引,但当每天更新数据时,又会重建索引,这是要耗费时间的. 这时就需要综合考虑,甚至可以在更新前删除

Java web轻量级开发面试教程读书笔记:数据库方面,如何准备面试

如果在面试或与资深人事交流的过程中,你能有效合理地展示出本章所给出的一些知识点,那么对你的评价就会是"对数据库有深入了解",甚至能加上"有设计数据表的经验",即便你说有过3年商业项目数据库操作的经验,那么别人也能相信. 相反,如果一个工作经验满3年的程序员或许动手编程能力不差,但无法在交流沟通过程中证明这点,或者干脆不知道怎么证明,那么对他的评价往往可能是"数据库层面,有过商业项目的经验,但只会些基本的增删改查(顶多再加上会视图存储过程等技术),无法独立担

Web调试利器fiddler

抓包工具HTTWATCH 已经过时啦,快来看看当代的宠儿Web调试利器fiddler .fiddler不管是对开发还是测试,还是产品:都是不可多得的工具:开发用来抓包定位问题; 测试用来抓包,回放测试记录,构造发包用例后续请看下面具体链接http://www.testroad.org/News/show.aspx?id=368