04 使用 BTrace 进行拦截调试
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 进行拦截调试的更多相关文章
- 【EF6学习笔记】(四)弹性连接及命令拦截调试
本章原文地址:Connection Resiliency and Command Interception 原文有些地方讲的比较细,个人根据实际理解做些缩减,或者加入一些个人理解: 第1部分 弹性连接 ...
- EF6学习笔记(四) 弹性连接及命令拦截调试
EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本章原文地址:Connection Resiliency and Command Interception 原文 ...
- JVM调优(三)——基于Btrace的监控调试
JVM调优(三)--基于Btrace的监控调试 简介 Btrace可以动态地向目标应用程序的字节码注入追踪代码 用到的技术: JavaComplierApi.JVMTI.Agent.Instrumen ...
- Ubuntu16.04 中 Vscode 如何断点调试C语言程序
个人博客链接:Ubuntu16.04 中 Vscode 如何断点调试C语言程序 问题:环境是 Ubuntu16.04,如何使用 Vscode 断点调试C语言程序. 写代码没有调试环境是不能忍受的,所以 ...
- cocoscreator 2.04 配置 visual code 断点调试
1,cocoscreator ,chrome浏览器,visual code 这三个软件的安装 2,官网配置visual code 环境 https://docs.cocos.com/creator/m ...
- Btrace 拦截时机
Kind.ENTRY 入口,默认值 Kind.RETURN: 返回 Kind.THROW: 异常 Kind.Line: 行 一.返回时拦截 package com.example.monitor_t ...
- Btrace 拦截构造函数,同名函数
拦截方法: 1.普通方法 @OnMethod(clazz="", method="") 2.构造函数@OnMethod(claszz="" ...
- BTrace:线上问题排查工具
BTrace简介 GitHub地址:BTrace 下载地址:v1.3.11.3 官方使用教程:Btrace使用教程 使用场景 BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存 ...
- BTrace学习总结
一.简介: 在生产环境中经常遇到格式各样的问题,如OOM或者莫名其妙的进程死掉.一般情况下是通过修改程序,添加打印日志:然后重新发布程序来完成.然而,这不仅麻烦,而且带来很多不可控的因素.有没有一种方 ...
- SpringMVC12拦截器
创建登陆界面 <%@ page language="java" import="java.util.*" pageEncoding="utf-8 ...
随机推荐
- 常用的js方法
1. 声明和初始化数组 我们可以使用默认值(如"".null或 )初始化特定大小的数组0.您可能已经将这些用于一维数组,但如何初始化二维数组/矩阵呢? const array = ...
- 性能测试-IO密集型-直接会话可能会断了,命令执行不了
1.IO密集型模拟命令 该命令会开启1个worker不停的读写临时文件,同时启动6个workers不停的调用sync系统调用提交缓存 stress-ng -i 6 --hdd 1 --timeout ...
- Linux_CMD_FOR_FILE&FOLDER
0,删除文件夹和子文件夹:rm -rf /xxx/xxx 0,拷贝整个文件夹:cp -r /xxx/xxx /ddd/ 0,改文件名:mv oldName newName 0,新建文件:touch f ...
- js获取父节点的方式
js获取父节点的方式: 1.parentNode获取父节点 获取的是当前元素的直接父元素.parentNode是w3c的标准. var p = document.getElementById(&quo ...
- ThinkPHP获取当前url
$httpType = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTT ...
- 【C++】关于智能指针的简单学习
智能指针 示例类: class String { private: string m_value; public: String(string str) :m_value(str) { cout &l ...
- 《计算机是怎么跑起来的》第十章 XML(可扩展标记语言)
资料来源 (1) <计算机是怎么跑起来的> 注1:XML是Extensible Markup Language(可扩展标记语言)的缩写; 1.XML是标记语言 (1) 通常把通过添加标签为 ...
- ESXI密码正确无法登录
场景描述: 今天新安装了一个VMware ESXi 6.5的系统,密码仍然用的习惯采用的密码.但在使用中,无论是使用vSphere Client连接,还是在vCenter Server中添加这台ESX ...
- Xmind 8 pro 破解版详细安装教程
写在前面的废话: 本来网上就有很多破解版的Xmind,也有安装教程,为什么我还要多此一举做这个教程呢? 因为实际安装后,使用起来总会有各种小瑕疵,最烦人的问题就是,xmind文件和软件无法关联,双击x ...
- 生成虚拟mac地址通过dhcp获取ip,耗尽dhco地址池
平台:kali 软件:dhcpstarv 命令 dhcpstarv -i 网卡名称 -e 本机IP 查看dhcp服务器已经分发的地址 cat /tmp/dhcp.leases