Java应用调试利器——BTrace教程
http://www.jianshu.com/p/26f19095d396
背景
生产环境中可能出现各种问题,但是这些问题又不是程序error导致的,可能是逻辑性错误,这时候需要获取程序运行时的数据信息,如方法参数、返回值来定位问题,通过传统的增加日志记录的方式非常繁琐,而且需要重启server,代价很大。BTrace应运而生,可以动态地跟踪java运行程序,将跟踪字节码注入到运行类中,对运行代码侵入较小,对性能上的影响可以忽略不计。
配置及用法
去官网下载BTrace,配置环境变量以便在任何路径下能执行btrace命令。
命令格式:
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
实战
获取方法参数以及返回值
业务代码:
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)));
} }
Java应用调试利器——BTrace教程的更多相关文章
- 【测试工具】http协议调试利器fiddler使用教程
转自:http协议调试利器fiddler使用教程http://bbs.phpchina.com/thread-207418-1-1.html Fiddler真乃神器!它和市面上常见的很多web调试器. ...
- 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% ...
- Java web轻量级开发面试教程的前言
本文来是从 java web轻量级开发面试教程从摘录的. 为什么要从诸多的Java书籍里选择这本?为什么在当前网络信息量如此大的情况下还要买这本书,而不是自己通过查阅网络资料学习?我已经会开发Java ...
- JAVA性能调试+JProfiler使用相关
一.JProfiler下载.安装与激活 1.1 下载 直接官网下载(https://www.ej-technologies.com/download/jprofiler/files) 建议下载9.X系 ...
- Fiddler(Web/HTTP调试利器)
简述 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出"Fiddler的数据(指cookie.htm ...
- 20175215 2018-2019-2 第一周Linux虚拟机环境调试及java程序调试学习总结
一.Linux虚拟机的java环境调试 之前直接在终端中使用export直接配置java的运行环境,导致每次终端被重启的时候都要重新配置java的运行环境,直到看到老师的博客Intellj IDEA ...
- VSCode Java 开发环境配置 详细教程
VSCode Java 开发环境配置 详细教程 配置java 下载 用于现在大多数使用者用的是java 8,小白的我先安装java 8好了,^ w ^. 下载地址:Java 8 | Java SE 打 ...
- Reveal1.5破解,iOS_UI调试利器Reveal最新版本破解方法
Reveal1.0.7破解 1.官网下载最新版Reveal,拖动应用程序中,运行一次2.下载16进制编辑器"0xED" for mac(http://dl.vmall.com/c0 ...
- selenium2 Webdriver + Java 自动化测试实战和完全教程
selenium2 Webdriver + Java 自动化测试实战和完全教程一.快速开始 博客分类: Selenium-webdriverselenium webdriver 学习selenium ...
随机推荐
- 链表相加(Add Two Numbers)
描述: 给定两个非空的链表,表示两个非负整数.数字以相反的顺序存储,每个节点包含一个数字.添加两个数字并将其作为链表返回. 您可以假设两个数字不包含任何前导零,除了数字0本身. 输入:(2 - > ...
- iOS- UIScrollView、UIPageControl分页浏览图片
1.先介绍下UIScrollView的常见属性 @property(nonatomic) CGPoint contentOffset; // 记录UIScrollView滚动的位置 @property ...
- ssl证书验证的问题
对于https请求,是需要ssl证书验证的请求的,所以如果在请求时如果不带ssl证书,那么可以忽略证书的验证 有三种方法去实现: 1.Requests请求: 在文档中可以看到:http://docs. ...
- 在linux下如何显示隐藏文件
#显示所有文件(包含隐藏文件)ls -a #只显示隐藏文件l.或者ls -d .* #在XWindow的KDE桌面中在"查看(View)"菜单里选"显示隐藏文件(Show ...
- cacti设置redis监控端口
1.在Console->Data Templates中选择Redis的模版 在custom Data中勾选中Port2并保存 2.在Console->Data Input Methods中 ...
- [剑指Offer] 51.构建乘积数组
题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不 ...
- 在mvc返回JSON时出错:序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用 的解决办法
在MVC中返回JSON时出错,序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用. public ActionResul ...
- (四)Redis哈希表Hash操作
Hash全部命令如下: hset key field value # 将哈希表key中的字段field的值设为value hget key field # 返回哈希表key中的字段field的值val ...
- [luogu2783] 有机化学之神偶尔会做作弊
题目链接 洛谷. Solution 边双缩点然后\(lca\)跑\(dis\)就好了. 注意这里是边双,不知道为啥所有题解都说的是点双. 边双是定义在点上的,即每个点只属于一个边双:点双是定义在边上的 ...
- 解析Fetch实现请求数据
一 序言 在 传统Ajax 时代,进行 API 等网络请求都是通过XMLHttpRequest或者封装后的框架进行网络请求,然而配置和调用方式非常混乱,对于刚入门的新手并不友好.今天我们介绍的Fetc ...