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. 获取方法参数以及返回值

    业务代码:

    1. public String sayHello(String name, int age) {
    2. return "hello everyone";
    3. }

    BTrace代码:

    1. import com.sun.btrace.BTraceUtils;
    2. import static com.sun.btrace.BTraceUtils.*;
    3. import com.sun.btrace.annotations.*;
    4. @BTrace
    5. public class Btrace {
    6. @OnMethod(
    7. clazz = "com.jiuyan.message.controller.AdminController",
    8. method = "sayHello",
    9. location = @Location(Kind.RETURN)//函数返回的时候执行,如果不填,则在函数开始的时候执行
    10. )
    11. public static void sayHello(String name, int age, @Return String result) {
    12. println("name: " + name);
    13. println("age: " + age);
    14. println(result);
    15. }
    16. }

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

    1. name: mountain
    2. age: 1
    3. hello everyone

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

    1. if(BTraceUtils.matches(".*345.*", str)) {
    2. println(str);
    3. }
  2. 计算方法运行消耗的时间

    BTrace代码:

    1. import java.util.Date;
    2. import com.sun.btrace.BTraceUtils;
    3. import static com.sun.btrace.BTraceUtils.*;
    4. import com.sun.btrace.annotations.*;
    5. @BTrace
    6. public class Btrace {
    7. @OnMethod(
    8. clazz = "com.jiuyan.message.controller.AdminController",
    9. method = "sayHello",
    10. location = @Location(Kind.RETURN)
    11. )
    12. public static void sayHello(@Duration long duration) {//单位是纳秒,要转为毫秒
    13. println(strcat("duration(ms): ", str(duration / 1000000)));
    14. }
    15. }

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. 第十九次ScrumMeeting会议

    第十九次Scrum Meeting 时间:2017/12/9 地点:三公寓大厅 人员:蔡帜 王子铭 游心 解小锐 王辰昱 李金奇 杨森 陈鑫 赵晓宇 照片: 目前工作进展 名字 今日 明天的工作 蔡帜 ...

  2. HTTP 请求头 & 响应头

    HTTP请求头概述 HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST).如有必要,客户程序还可以选择发送其他的请求头.大多数请求头并不是必需的, 但Co ...

  3. Java中I/O流之轮换流

    Java 中的轮换流: 非常有用,可以把一个字节流转换成字符流. inputStreamReader, outputStreamReader Demo_1: import java.io.*; cla ...

  4. nuget程序包还原失败:未能解析此远程名称

    一个简便的方法就是取消下载缺少的程序包. 步骤如下: 1,工具--NuGet程序包管理器--程序包管理器设置 2,NuGet Package Manager--常规,取消勾选.

  5. 探讨C++实现一个不可被继承的类

    C#和Java都提供了一种机制让一个类不能被继承,如C#中的sealed关键字和Java的final关键字,然而C++程序员就没这么好命了.不过C++也可以模拟出这种效果,原理基于:子类的构造函数会自 ...

  6. 【python】 requirements使用方法

    记得导入导出包的时候要想激活虚拟环境.1.导出requirements方法pip freeze > requirements.txt 2.安装requirements方法pip install ...

  7. BZOJ4835 遗忘之树

    点分树上的某个点和其某个子树在原树中的连接方式一般来说可以是由该点连向子树内任意一点,这样方案数即为所有子树大小之积.但有一种特殊情况是连接某点后导致编号最小的重心更换,只要去掉这种就行了,具体地可以 ...

  8. P1365 WJMZBMR打osu! / Easy

    题目背景 原 维护队列 参见P1903 题目描述 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有 nnn 次点击要做,成功了就是o,失败了 ...

  9. (二)Redis字符串String操作

    String全部命令如下: set key value # 设置一个key的value值 get key # 获取key的value值 mset key1 value1 key2 value2 ... ...

  10. CentOS 文件及目录等

    1.在linux中一切皆是文件,只是类型不同,通过ls -l看到的一个字母表示文件的类型 -:普通文件. d:目录文件. l:链接文件. b:块设备文件. c:字符设备文件. p:管道文件. 2.文件 ...