Btrace 拦截时机
Kind.ENTRY 入口,默认值
Kind.RETURN: 返回
Kind.THROW: 异常
Kind.Line: 行
一、返回时拦截
package com.example.monitor_tuning.chapter4; import com.sun.btrace.AnyType;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.*; @BTrace
public class PrintReturn { @OnMethod(
clazz = "com.example.monitor_tuning.chapter4.Ch4Controller",
method="arg1",
location = @Location(Kind.RETURN)
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, @Return AnyType result)
{
BTraceUtils.println(pcn + "," + pmn + "," + result);
BTraceUtils.println();
}
}
2、运行和返回结果
1)、运行

2)、调用接口:
http://127.0.0.1:8080/monitor_tuning/ch4/arg1?name=nick
3)返回结果见上图
二、异常时拦截
1、创建异常代码

2、创建异常脚本
package com.example.monitor_tuning.chapter4; import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.*; /**
* 拦截异常
*/
@BTrace
public class PrintOnThrow { @TLS
static Throwable currentException; @OnMethod(
clazz = "java.lang.Throwable",
method="<init>"
)
//拦截 new Throwable
public static void onthrow(@Self Throwable self)
{
currentException = self;
} @OnMethod(
clazz = "java.lang.Throwable",
method="<init>"
)
//拦截 new Throwable(String msg)
public static void onthrow1(@Self Throwable self, String s)
{
currentException = self;
} @OnMethod(
clazz = "java.lang.Throwable",
method="<init>"
)
//拦截 new Throwable(Throwable self, String s, Throwable cause)
public static void onthrow1(@Self Throwable self, String s, Throwable cause)
{
currentException = self;
} @OnMethod(
clazz = "java.lang.Throwable",
method="<init>"
)
//拦截 new Throwable( Throwable self, Throwable cause)
public static void onthrow2(@Self Throwable self, Throwable cause)
{
currentException = self;
} @OnMethod(
clazz = "java.lang.Throwable",
method="<init>",
location = @Location(Kind.RETURN)
)
public static void onthrowreturn()
{
if(currentException != null){
BTraceUtils.Threads.jstack(currentException); //打印异常堆栈
BTraceUtils.println("==============");
currentException = null;
}
} }
3、运行btrace脚本

调用接口
http://127.0.0.1:8080/monitor_tuning/ch4/exception
显示结果

三、打印行号
1、打印36行是否执行

2、创建btrace脚本
package com.example.monitor_tuning.chapter4; import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.*; /**
* 打印行号,查看指定行号是否执行到
*/
@BTrace
public class PrintLine { @OnMethod(
clazz = "com.example.monitor_tuning.chapter4.Ch4Controller",
location = @Location(value = Kind.LINE, line = 36)
) public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, int line)
{
BTraceUtils.println(pcn + "," + pmn + ", " + line);
BTraceUtils.println();
}
}
3、执行

调用接口
http://localhost:8080/monitor_tuning/ch4/exception
显示结果

4、打印所有执行的行号
1)接口对应的行号

2、修改btrace脚本 line为-1

显示结果

说明 36, 37, 39, 42行被执行了。38行没有被执行到。
Btrace 拦截时机的更多相关文章
- Btrace 拦截构造函数,同名函数
拦截方法: 1.普通方法 @OnMethod(clazz="", method="") 2.构造函数@OnMethod(claszz="" ...
- Btrace入门到熟练小工完全指南
BTrace是神器,每一个需要每天解决线上问题,但完全不用BTrace的Java工程师,都是可疑的. BTrace的最大好处,是可以通过自己编写的脚本,获取应用的一切调用信息.而不需要不断地修改代码, ...
- BTrace : Java 线上问题排查神器
BTrace 是什么 BTrace 是检查和解决线上的问题的杀器,BTrace 可以通过编写脚本的方式,获取程序执行过程中的一切信息,并且,注意了,不用重启服务,是的,不用重启服务.写好脚本,直接用命 ...
- BTrace 问题辅助排查工具使用手册
BTrace是调试神器,可以通过自己编写的脚本,获取应用的一切调用信息.而不需要重启应用! Btrace 项目源码信息(你行你上~) 项目地址:http://github.com/btraceio/b ...
- BTrace学习总结
一.简介: 在生产环境中经常遇到格式各样的问题,如OOM或者莫名其妙的进程死掉.一般情况下是通过修改程序,添加打印日志:然后重新发布程序来完成.然而,这不仅麻烦,而且带来很多不可控的因素.有没有一种方 ...
- Btrace使用入门
1.什么是BTrace BTrace是sun公司推出的一款Java 动态.安全追踪(监控)工具,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数.返回值.全局变量和堆 ...
- 认识一下java神器Btrace
转载: http://calvin1978.blogcn.com/articles/btrace1.html BTrace是神器,每一个需要每天解决线上问题,但完全不用BTrace的Java工程师,都 ...
- JVM调优(三)——基于Btrace的监控调试
JVM调优(三)--基于Btrace的监控调试 简介 Btrace可以动态地向目标应用程序的字节码注入追踪代码 用到的技术: JavaComplierApi.JVMTI.Agent.Instrumen ...
- 基于BTrace监控调试Java代码
BTrace是Java的一个动态代码追踪工具,通过编写btrace脚本,它可以动态的向目标应用程序的字节码注入追踪代码,通过修改字节码的方式,达到监控调试和定位问题的目的,是解决线上问题的利器. BT ...
随机推荐
- Python 字典dict相关知识
字典是无序的,多次print输出的结果不一样. 字典的key可以是数字.字符串.元组.布尔值(True为1,False为0,不可以和其他key值重复):列表和字典不能作为key. 字典的value可以 ...
- Python_day1 Learning record
Python Day1 Learning record(python第一天学习记录) 一.ptyhon安装 windows .下载安装包 https://www.python.org/download ...
- Qt终结者之QML动画
前言 使用QML差不多2年了,在使用过程中深深的感受到QML的强大与便捷,让我深陷其中,不能自拔.其中QML相比传统的界面最大的优势就是便捷的动画效果与炫酷的粒子效果,让QML做出来的界面能媲美WPF ...
- java对excel操作
package test; import jxl.*; import jxl.Cell; import java.io.*; /** * 读取excel */ public class TestExc ...
- Cookie Manager
https://github.com/Rob--W/cookie-manager 修改饼干获取VIP标识
- python基础一之while循环随机猜数字
# Author:"Mamba" import random setNum = random.randint(1,10) #print(setNum) count = 0 whil ...
- ssm配置文件叙述
spring+springmvc+mybatis框架中用到了三个XML配置文件:web.xml,spring-mvc.xml,spring-mybatis.xml.第一个不用说,每个web项目都会有的 ...
- ES6学习重难点总结(持续更新)
Symbol 1.Symbol.iterator Symbol.iterator指向对象的默认遍历器方法: String.prototype[Symbol.iterator] //ƒ [Symbol. ...
- 关于indexof和substring经常记不住的点
indexof 找到的字符位置是 字符串从0位开始算起的. lastIndexOf也一样,http://localhost:8080/aaa,的lastIndexOf("/")是2 ...
- Visual C++ 6.0中关于for的简单问题
在这个循环当中,要先执行①,再执行②,再执行④,再执行③,如果还满足②的话就再执行②,再依次执行.当③不满足②时,就执行printf语句. 并且在这个循环当中,①只执行一次.