用btrace定位问题
btrace 截取方法出入参
用btrace的手法,网上有很多。简单记录下我自己的使用经历。
btrace脚本:
import static com.sun.btrace.BTraceUtils.exit;
import static com.sun.btrace.BTraceUtils.field;
import static com.sun.btrace.BTraceUtils.get;
import static com.sun.btrace.BTraceUtils.jstack;
import static com.sun.btrace.BTraceUtils.printEnv;
import static com.sun.btrace.BTraceUtils.printFields;
import static com.sun.btrace.BTraceUtils.printProperties;
import static com.sun.btrace.BTraceUtils.printVmArguments;
import static com.sun.btrace.BTraceUtils.println; import com.sun.btrace.BTraceUtils.Strings;
import com.sun.btrace.BTraceUtils.Sys;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Duration;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.Return;
import com.sun.btrace.annotations.Self; import static com.sun.btrace.BTraceUtils.*; @BTrace
public class t { //print System Properties:
static {
println("System Properties:");
printProperties();
println("VM Flags:");
printVmArguments();
println("OS Enviroment:");
printEnv();
exit(0);
} @OnMethod(clazz = "com.xxxxxxx.FlowServiceImpl", method = "queryFlowList",location=@Location(Kind.RETURN))
public static void traceStoreInTransactionExecute(java.util.Map<String, Object> content, java.lang.Integer iDisplayStart,
java.lang.Integer iDisplayLength, @Return java.util.List<com.xxxxxxxx.ScenarioJournalBo> ret) {
println(str(ret));
println(str(content));
println(str(iDisplayStart));
println(str(iDisplayLength));
} }
此处脚本 用于监控方法入参,和出参.
监控性能
用于监控性能,执行某个方法的时间消耗,单位是纳秒 换成毫秒要除以1000000
这个比一般写代码去监控好用些,毕竟只是配置一下
import static com.sun.btrace.BTraceUtils.exit;
import static com.sun.btrace.BTraceUtils.field;
import static com.sun.btrace.BTraceUtils.get;
import static com.sun.btrace.BTraceUtils.jstack;
import static com.sun.btrace.BTraceUtils.printEnv;
import static com.sun.btrace.BTraceUtils.printFields;
import static com.sun.btrace.BTraceUtils.printProperties;
import static com.sun.btrace.BTraceUtils.printVmArguments;
import static com.sun.btrace.BTraceUtils.println; import com.sun.btrace.BTraceUtils.Strings;
import com.sun.btrace.BTraceUtils.Sys;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Duration;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.Return;
import com.sun.btrace.annotations.Self; import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*; @BTrace
public class SP02 { @TLS private static long startTime; //print System Properties:
static {
println("System Properties:");
printProperties();
println("VM Flags:");
printVmArguments();
println("OS Enviroment:");
printEnv();
exit(0);
} // @OnMethod(clazz="com.xxxClass",method="beforeInvoke")
//public static void onCall(){
// startTime=Time.millis();
//println("s");
// } @OnMethod(clazz="com.xxxClass",method="processCall",location=@Location(Kind.RETURN))
public static void onReturn(@Duration long d ){
println(Strings.strcat("-processCall ", Strings.str(d)));
} @OnMethod(clazz="com.xxxClass",method="updateSournal",location=@Location(Kind.RETURN))
public static void onReturn1(@Duration long d ){
println(Strings.strcat("-updateSnal ", Strings.str(d)));
} @OnMethod(clazz="com.xxxClass",method="writeResponsR",location=@Location(Kind.RETURN))
public static void onReturn2(@Duration long d ){
println(Strings.strcat("-writeRR ", Strings.str(d)));
} @OnMethod(clazz="org.springframework.web.servlet.DispatcherServlet",method="doDispatch",location=@Location(Kind.RETURN))
public static void onReturn3(@Duration long d ){
println(Strings.strcat("-doDispatch ", Strings.str(d)));
} @OnMethod(clazz="com.xxx.AnnotationMethodHandlerAdapter",method="handle",location=@Location(Kind.RETURN))
public static void onReturn4(@Duration long d ){
println(Strings.strcat("-handle ", Strings.str(d)));
} }
执行
./btrace 25615 SP02.java
#25615 是你要监控的进程id(用jps可以看到)
注意:
1. 此手法若用于生产,最好在生产上包的时候 上btrace工具,因为不是jdk自带,不要要用的时候 找不到这个工具。
2. 如果btrace脚本中一来业务的类,则需要在执行的命令行中 指定classpath含有业务的jar(或者class目录)
3. 监控的脚本的类名需要与监控脚本文件名相同(与java代码一个规则。)
classpath问题 (以下段落均针对mac环境)
怎样快速的取classpath? 在linux/mac上都是 -classpath xx.jar全路径 冒号分隔 yy.jar全路径。但是如何快速的拿到这个classpath?在mac/linux上有个简单的办法,在你需要用btrace监听的工程中写个带有main方法的类,并不要让main方法结束,可以用
try
{
System.in.read();
}
catch (IOException e)
{
e.printStackTrace();
}
也可以用Thread.sleep等办法。
然后用
ps -ef|grep "java">1.log
然后到1.log中就可以找到了所有依赖的jar构成的classpath信息了,准确快捷。
带有classpath的btrace使用示例是:
./btrace -classptah xxx/xx1.jar:xxx/xx2.jar 目标进程号 监听脚本类.java
JAVA_HOME问题
使用btrace需要设置JAVA_HOME环境变量 否则会报错:
Please set JAVA_HOME before running this script
我在mac设置是:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home
JAVA_VERSION问题
mac上使用btrace需要设置JAVA_VERSION环境变量,否则报错:
Please set JAVA_VERSION to the target java version
我的设置是:
export JAVA_VERSION=CurrentJDK
查找办法是:
看看这个路径System/Library/Frameworks/JavaVM.framework/Versions/${JAVA_VERSION}/Classes/classes.jar
报错:类文件具有错误的版本 52.0,应为 50.0
上面的jdk版本不对 导致了这个问题
重新设置:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
export JAVA_VERSION=1.6.0
至此能正常使用起来了
在研究btrace的过程中 发现了一个淘宝的 工具greys https://yq.aliyun.com/articles/2390
有空把玩一下。
用btrace定位问题的更多相关文章
- BTrace 问题辅助排查工具使用手册
BTrace是调试神器,可以通过自己编写的脚本,获取应用的一切调用信息.而不需要重启应用! Btrace 项目源码信息(你行你上~) 项目地址:http://github.com/btraceio/b ...
- 如何在生产环境使用Btrace进行调试
占小狼 转载请注明原创出处,谢谢! 背景 记得前几天有人问我:在生产环境中可能经常遇到各种问题,你们一般是如何进行调试的? 很惭愧,没有经验.因为平时碰不到生产环境的服务器,定位问题需要各种数据,所以 ...
- Java软件生产监控工具Btrace的使用
Btrace BTrace是sun公司推出的一款Java 动态.安全追踪(监控)工具,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数.返回值.全局变量和堆栈信息等, ...
- 江南白衣 Java性能优化PPT
会后江南白衣花费数日整理PPT,到1.4版本共66页,内容翔实且旁征博引,不断校正且力求做到极致的匠艺精神值得尊敬! 技术大牛飒然Hang如是说到: “技术大神中,除了陈皓就是白衣了,四十岁还能钻研. ...
- 使用jvisualvm.exe 的Btrace插件介绍/使用教程
一.背景 在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数据信息,我们可以 通过改写代码,增加日志信息的打 ...
- BTrace使用总结
btracejvisualvmhotswap 一.背景 在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数 ...
- BTrace使用小结
简介 BTrace是一个安全的JVM动态追踪工具,最初为原Sun公司Kenai项目下面的一个子项目. 典型的使用场景是,“我要查个问题,可那个方法没有打印入口参数和返回结果日志”,“我想看某个方法的执 ...
- Java应用调试利器——BTrace教程
http://www.jianshu.com/p/26f19095d396 背景 生产环境中可能出现各种问题,但是这些问题又不是程序error导致的,可能是逻辑性错误,这时候需要获取程序运行时的数据信 ...
- 利用神器BTrace 追踪线上 Spring Boot应用运行时信息
概述 生产环境中的服务可能会出现各种问题,但总不能让服务下线来专门排查错误,这时候最好有一些手段来获取程序运行时信息,比如 接口方法参数/返回值.外部调用情况 以及 函数执行时间等信息以便定位问题.传 ...
随机推荐
- python_21(Django中间件)
第1章 中间件 1.1 介绍 1.2 种类 1.3 自定义中间件 1.4 process_request 1.4.1 注册中间件 1.5 process_response 1.6 process_vi ...
- matlab各向异性扩散滤波
主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的(和双边滤波很像). 通常我们有将图像看作矩阵的,看作图的,看作随机过程的,记得过去还有看作力场的. 这次新鲜,将图 ...
- 在ASP.NET中,后台代码向页面写HTML代码
Literal lt = new Literal();lt.Text = "<a href=\"http://www.czbin.cn\">czbin的博客& ...
- 初识requestAnimationFrame
转载地址:https://blog.csdn.net/vhwfr2u02q/article/details/79492303 核心概念: 1.CPU节能:在页面不刷新时不执行回调(页面在隐藏.最小化等 ...
- 初识react中的状态量
react组件中的两类状态数据:props,state,官网API给出的使用规范,多读几遍,受益匪浅: 结论: 1. 对应任何可变的数据,理应只有一个单一“ 数据源 ” 2. 如果多个组件均需要这些数 ...
- VS2010每次编译都重新编译 解决方案
今天用VS2010的时候遇到这个问题,总搞不定,关掉重启各种尝试都木有用,最后突然发现项目的生成时间总是2009年...好吧,原来刚才笔记本死机了,我把笔记本拆了,拔下电池,擦了擦内存条,导致系统时间 ...
- azure 创建redhat镜像帮助
为 Azure 准备基于 Red Hat 的虚拟机 从 Hyper-V 管理器准备基于 Red Hat 的虚拟机 先决条件 本部分假定你已经从 Red Hat 网站获取 ISO 文件并将 RHEL 映 ...
- 88E1111
千兆网phy芯片 支持GMII,RGMII,MII等接口 具备4个GMII时钟模式 支持自适应功能 超低功耗模式 功率降低模式 MDC/MDIO/TWSI接口 支持10Mb/s,100Mb/s,100 ...
- nagios的安装配置
主要参考博客:http://www.cnblogs.com/mchina/archive/2013/02/20/2883404.html 实验环境:centos6.4 最小化安装系统 **** ...
- hadoop ssh 问题WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
0.0.0.0: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0.0.0.0: @ WARNING: REMOTE HO ...