BTrace

BTrace 可以动态地向目标应用程序的字节码注入追踪代码,使用的技术有 JavaCompilerApi, JVMTI, Agent, Instrumentation+ASM

使用方法:JVisualVM中添加 BTrace 插件

方法二:btrace <pid> <trace_script>

monitor_tuning中新增包org.alanhou.monitor_tuning.chapter4

安装BTrace 要记得配置环境变量,以 Windows 为例

BTRACE_HOME=E:\tool\btrace-2.0.1-bin
PTAH 加上 %BTRACE_HOME%\bin

安装BTrace 要记得配置环境变量,以 Mac 为例

# vi ~/.bash_profile
BTRACE_HOME=/Applications/btrace
PATH=$PATH:$BTRACE_HOME/bin
export PATH
# source ~/.bash_profile

pom.xml 中添加 btrace-agent, btrace-boot, btrace-client的依赖

访问:http://localhost:12345/ch4/arg1?name=Java

# 示例输出
192:chapter4 alan$ btrace 2247 PrintArgSimple.java
[Java, ]
org.alanhou.monitor_tuning.chapter4.Ch4Controller,arg1

常见问题:Please set JAVA_HOME before running this script

# vi ~/.bash_profile
export JAVA_HOME=$(/usr/libexec/java_home)
# source ~/.bash_profile

拦截方法

普通方法:@OnMethod( clazz=“”, method=“”),如上例(PrintArgSimple.java)

构造函数:@OnMethod( clazz=“”, method=“<init> “)(PrintContructor.java)

192:chapter4 alan$ btrace 3682 PrintConstructor.java
org.alanhou.monitor_tuning.chapter2.User,<init>
[1, Java, ]

拦截同名函数:用参数区分(PrintSame.java)

如下例中虽然方法名相同,但分别有一个和两个参数

@RequestMapping("/same1")
public String same(@RequestParam("name")String name) {
// 访问地址: http://localhost:12345/ch4/same1?name=Java
return "Hello, "+name;
} @RequestMapping("/same2")
public String same(@RequestParam("name")String name, @RequestParam("id")int id) {
// 访问地址: http://localhost:12345/ch4/same2?name=Java&id=1
return "Hello, "+name+", "+id;
}

拦截时机

Kind.ENTRY: 入口,默认值(上述例子均为这种情况)

Kind.RETURN: 返回(PrintReturn.java)

192:chapter4 alan$ btrace 3981 PrintReturn.java
org.alanhou.monitor_tuning.chapter4.Ch4Controller,arg1,Hello, Java

Kind.THROW: 异常(PrintOnThrow.java)

192:chapter4 alan$ btrace 4041 PrintOnThrow.java
java.lang.ClassNotFoundException: org.apache.catalina.webresources.WarResourceSet
...
java.lang.ArithmeticException: / by zero
org.alanhou.monitor_tuning.chapter4.Ch4Controller.exception(Ch4Controller.java:40)
...

Kind.Line: 行(PrintLine.java)

# 打印指定行号是否执行
192:chapter4 alan$ btrace 4149 PrintLine.java
org.alanhou.monitor_tuning.chapter4.Ch4Controller,exception,39
 

拦截 this、入参、返回值

this:@self

入参:可以用 AnyType,也可以用真实类型,同名的用真实的

返回:@Return

获取对象的值

简单类型:直接获取

复杂类型:反射,类名+属性名(PrintArgComplex.java)

192:chapter4 alan$ btrace -cp "/Users/alan/Desktop/demo/java-code/monitor_tuning/target/classes" 4337 PrintArgComplex.java
{id=1, name=Java, }
Java
org.alanhou.monitor_tuning.chapter4.Ch4Controller,arg2

拦截函数中还可以使用正则表达式,如method=”/.*/”匹配指定类下的所有方法(PrintRegex.java)

打印环境变量(PrintJinfo.java)

 

04 使用 BTrace 进行拦截调试的更多相关文章

  1. 【EF6学习笔记】(四)弹性连接及命令拦截调试

    本章原文地址:Connection Resiliency and Command Interception 原文有些地方讲的比较细,个人根据实际理解做些缩减,或者加入一些个人理解: 第1部分 弹性连接 ...

  2. EF6学习笔记(四) 弹性连接及命令拦截调试

    EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本章原文地址:Connection Resiliency and Command Interception 原文 ...

  3. JVM调优(三)——基于Btrace的监控调试

    JVM调优(三)--基于Btrace的监控调试 简介 Btrace可以动态地向目标应用程序的字节码注入追踪代码 用到的技术: JavaComplierApi.JVMTI.Agent.Instrumen ...

  4. Ubuntu16.04 中 Vscode 如何断点调试C语言程序

    个人博客链接:Ubuntu16.04 中 Vscode 如何断点调试C语言程序 问题:环境是 Ubuntu16.04,如何使用 Vscode 断点调试C语言程序. 写代码没有调试环境是不能忍受的,所以 ...

  5. cocoscreator 2.04 配置 visual code 断点调试

    1,cocoscreator ,chrome浏览器,visual code 这三个软件的安装 2,官网配置visual code 环境 https://docs.cocos.com/creator/m ...

  6. Btrace 拦截时机

    Kind.ENTRY 入口,默认值 Kind.RETURN:  返回 Kind.THROW: 异常 Kind.Line: 行 一.返回时拦截 package com.example.monitor_t ...

  7. Btrace 拦截构造函数,同名函数

    拦截方法: 1.普通方法  @OnMethod(clazz="", method="") 2.构造函数@OnMethod(claszz="" ...

  8. BTrace:线上问题排查工具

    BTrace简介 GitHub地址:BTrace 下载地址:v1.3.11.3 官方使用教程:Btrace使用教程 使用场景 BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存 ...

  9. BTrace学习总结

    一.简介: 在生产环境中经常遇到格式各样的问题,如OOM或者莫名其妙的进程死掉.一般情况下是通过修改程序,添加打印日志:然后重新发布程序来完成.然而,这不仅麻烦,而且带来很多不可控的因素.有没有一种方 ...

  10. SpringMVC12拦截器

    创建登陆界面 <%@ page language="java" import="java.util.*" pageEncoding="utf-8 ...

随机推荐

  1. Linux安装jdk之openjdk

    使用yum源 1.查看yum库中都有哪些jdk版本 yum search java|grep jdk 2.选择指定的版本安装,注意最后的 * 以及yum源安装的是openjdk,注意openjdk的区 ...

  2. PHP_冒泡排序代码解析

    <?php /** * 基本思想:将数组中的每一个下标元素遍历出来 *依次将这些下标的值对后面一个下标的值对比 *如果大于后面一位下标的值,将两者调换位置 */ $arr = array (55 ...

  3. lua module以及模块内的local function使用

    在模块定义local function,使用local function时,需要在使用前就定义,不能通过self:localfunction 或者self.locakfunction 因为是模块内的局 ...

  4. http如何全站301重定向到https

    对于301重定向这一概念玩SEO的同志们都不陌生了,近些年来https协议越来越火,谷歌已经明确了使用https相对http来说会有更好的排名,再加上百度大大已经明确了对https的扶持政策,老威现在 ...

  5. What does int main(int argc, char *argv[]) mean?

    忽然发现自己不理解许多代码中这行的含义是什么...(汗颜) 下面贴一段stackoverflow上面的回答: argv and argc are how command line arguments ...

  6. tkinter的after函数的使用方法

    1,模块tkinter里面没有aften函数,aften是部分类的类方法. import tkinter l = dir(tkinter) for s in l: if 'after' in eval ...

  7. Pytorch实战学习(九):进阶RNN

    <PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili Advance RNN 1.RNN分类问题 判断数据集中的每个名字所属的国家,共有18个国家类别 2.网络结构 ①基础R ...

  8. 26_自定义Loader

    自定义Loader loader就是对模块的源代码进行处理(转换),如css-loader.style-loader等 在上一篇的源代码中我们已经知道了loader是在runLoaders才会去使用l ...

  9. Android使用volley发送带参数的post请求

    用参数方式可以解决E/Volley: [777] BasicNetwork.performRequest: Unexpected response code 500 for XXXXX 1.Strin ...

  10. 牛客算法进阶——树形dp

    1. 小G有一个大树(求树的重心) 删除该点后最大连通块的节点数最小 设f[x]表示以x为根的子树大小,那么删除x之后的各子树大小为f[to]和n-f[x] 求max(max(f[to]),n-f[x ...