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. Partition(线段树的离线处理)

    有一点类似区间K值的求法. 这里有两颗树,一个是自己建的线段树,一个是题目中给定的树.以线段树和树进行区分. 首先离散化一下,以离散化后的结果建线段树,线段树的节点开了2维,一维保存当前以当前节点为权 ...

  2. arcengine 将地图文件保存为图片(包括各种图片格式)

    1,最近做了个地图文件输出图片的功能,思想主要就是利用MapControl的ActiveView中的out方法: 2代码如下:欢迎交流指正 SaveFileDialog m_save = new Sa ...

  3. drupal6提示 Compilation failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 9 on line 615

    解决办法:将sites\all\modules\ctools\includes\cleanstring.inc文件中的61行改成62行这样子即可,如下图

  4. 自定义可伸缩的imageView

    直接上代码 /** * 自定义可伸缩的ImageView */ public class ZoomImageView extends ImageView { /** 画笔类 **/ private P ...

  5. mysql> set sql_mode='no_auto_value_on_zero';

    mysql> set sql_mode='no_auto_value_on_zero';

  6. Azure资源管理工具Azure PowerShell介绍

    什么是 Azure PowerShell? Azure PowerShell 是一组模块,提供用于通过 Windows PowerShell 管理 Azure 的 cmdlet.你可以使用 cmdle ...

  7. 洛谷 P1449 后缀表达式

    题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应 ...

  8. 洛谷 First Step (ファーストステップ) 3月月赛T1

    题目背景 知らないことばかりなにもかもが(どうしたらいいの?) 一切的一切 尽是充满了未知数(该如何是好) それでも期待で足が軽いよ(ジャンプだ!) 但我仍因满怀期待而步伐轻盈(起跳吧!) 温度差なん ...

  9. 插值(scipy.interpolate)

    https://docs.scipy.org/doc/scipy/reference/interpolate.html#module-scipy.interpolate https://stackov ...

  10. js获得本季度的开始日期 结束日期

    var now = new Date(); //当前日期var nowMonth = now.getMonth()+1; //当前月var nowYear = now.getFullYear(); / ...