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 ...
随机推荐
- firefox 屏蔽Backspace按键的后退功能
直接上图
- 关于MySQL什么时候使用索引问题以及什么情况下应不建或少建索引
一,什么情况下使用索引1. 表的主关键字 自动建立唯一索引 2. 表的字段唯一约束 ORACLE利用索引来保证数据的完整性 3. 直接条件查询的字段 在SQL中用于条件约束的字段 如zl_yhjbqk ...
- elasticsearch(6) 映射和分析
类似关系型数据库中每个字段都有对应的数据类型,例如nvarchar.int.date等等,elasticsearch也会将文档中的字段映射成对应的数据类型,这一映射可以使ES自动生成的,也是可以由我们 ...
- Python参数笔记
Python参数 1. 普通参数 必须要传入和定义时个数相同的参数 def miao(acfun, bilibili): print(acfun, bilibili) miao(11, 22) > ...
- python基础16_闭包_装饰器
不了解是否其他语言也有类似 python 装饰器这样的东西. 最近才发现ECMAScript6也是有生成器函数的,也有 yield generator 装饰器的基础知识是闭包: # 闭包:嵌套函数, ...
- jquery评分插件jquery.raty.js
1.参考链接 官方地址. 教程一 教程二 2.案例1 引入文件: <!-- 评分插件 --> <script type="text/javascript" src ...
- python编程从入门到实践 alien invasion 项目源码
现在上传一个 python编程从入门到实践 alien invasion 项目源码 以供大家学习参考 跟官方版本可能不太一样,因为是自己写的 也算是给新手一个参考 我用的环境是pycharm 可能需要 ...
- jstl,el表达式
在上一篇中,我们写了将数据传到jsp页面,在jsp页面进行展示数组,但是我们发现,在jsp页面写代码是一件很烦的事,一个循环要拆成两部分,例如for循环,在例如if语句: <%int a=22; ...
- sql server 字符串根据指定分隔符进行分组
SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO --功能:分拆字符串 --参数:@String:要分拆的字符串:@Delimiter:分割符号 --返回值: ...
- 41.找出所有和为S的连续正数序列
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和, 他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数). 没多久,他就得到 ...