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定位问题的更多相关文章

  1. BTrace 问题辅助排查工具使用手册

    BTrace是调试神器,可以通过自己编写的脚本,获取应用的一切调用信息.而不需要重启应用! Btrace 项目源码信息(你行你上~) 项目地址:http://github.com/btraceio/b ...

  2. 如何在生产环境使用Btrace进行调试

    占小狼 转载请注明原创出处,谢谢! 背景 记得前几天有人问我:在生产环境中可能经常遇到各种问题,你们一般是如何进行调试的? 很惭愧,没有经验.因为平时碰不到生产环境的服务器,定位问题需要各种数据,所以 ...

  3. Java软件生产监控工具Btrace的使用

    Btrace BTrace是sun公司推出的一款Java 动态.安全追踪(监控)工具,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数.返回值.全局变量和堆栈信息等, ...

  4. 江南白衣 Java性能优化PPT

    会后江南白衣花费数日整理PPT,到1.4版本共66页,内容翔实且旁征博引,不断校正且力求做到极致的匠艺精神值得尊敬! 技术大牛飒然Hang如是说到: “技术大神中,除了陈皓就是白衣了,四十岁还能钻研. ...

  5. 使用jvisualvm.exe 的Btrace插件介绍/使用教程

    一.背景        在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数据信息,我们可以 通过改写代码,增加日志信息的打 ...

  6. BTrace使用总结

    btracejvisualvmhotswap  一.背景        在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数 ...

  7. BTrace使用小结

    简介 BTrace是一个安全的JVM动态追踪工具,最初为原Sun公司Kenai项目下面的一个子项目. 典型的使用场景是,“我要查个问题,可那个方法没有打印入口参数和返回结果日志”,“我想看某个方法的执 ...

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

    http://www.jianshu.com/p/26f19095d396 背景 生产环境中可能出现各种问题,但是这些问题又不是程序error导致的,可能是逻辑性错误,这时候需要获取程序运行时的数据信 ...

  9. 利用神器BTrace 追踪线上 Spring Boot应用运行时信息

    概述 生产环境中的服务可能会出现各种问题,但总不能让服务下线来专门排查错误,这时候最好有一些手段来获取程序运行时信息,比如 接口方法参数/返回值.外部调用情况 以及 函数执行时间等信息以便定位问题.传 ...

随机推荐

  1. 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 ...

  2. matlab各向异性扩散滤波

    主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的(和双边滤波很像). 通常我们有将图像看作矩阵的,看作图的,看作随机过程的,记得过去还有看作力场的. 这次新鲜,将图 ...

  3. 在ASP.NET中,后台代码向页面写HTML代码

    Literal lt = new Literal();lt.Text = "<a href=\"http://www.czbin.cn\">czbin的博客& ...

  4. 初识requestAnimationFrame

    转载地址:https://blog.csdn.net/vhwfr2u02q/article/details/79492303 核心概念: 1.CPU节能:在页面不刷新时不执行回调(页面在隐藏.最小化等 ...

  5. 初识react中的状态量

    react组件中的两类状态数据:props,state,官网API给出的使用规范,多读几遍,受益匪浅: 结论: 1. 对应任何可变的数据,理应只有一个单一“ 数据源 ” 2. 如果多个组件均需要这些数 ...

  6. VS2010每次编译都重新编译 解决方案

    今天用VS2010的时候遇到这个问题,总搞不定,关掉重启各种尝试都木有用,最后突然发现项目的生成时间总是2009年...好吧,原来刚才笔记本死机了,我把笔记本拆了,拔下电池,擦了擦内存条,导致系统时间 ...

  7. azure 创建redhat镜像帮助

    为 Azure 准备基于 Red Hat 的虚拟机 从 Hyper-V 管理器准备基于 Red Hat 的虚拟机 先决条件 本部分假定你已经从 Red Hat 网站获取 ISO 文件并将 RHEL 映 ...

  8. 88E1111

    千兆网phy芯片 支持GMII,RGMII,MII等接口 具备4个GMII时钟模式 支持自适应功能 超低功耗模式 功率降低模式 MDC/MDIO/TWSI接口 支持10Mb/s,100Mb/s,100 ...

  9. nagios的安装配置

    主要参考博客:http://www.cnblogs.com/mchina/archive/2013/02/20/2883404.html 实验环境:centos6.4     最小化安装系统 **** ...

  10. hadoop ssh 问题WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    0.0.0.0: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0.0.0.0: @    WARNING: REMOTE HO ...