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)

 

最新文章

  1. hadoop2.2编程:MRUnit测试
  2. 一个完整的TCP连接
  3. 《征服 C 指针》笔记6:练习——挑战那些复杂的声明
  4. UrlRewriter实现.NET的URL重写
  5. java中JTextPane使输出字符到指定的宽度换行,并将垂直滚动条的位置移动到输出的最后位置
  6. 夺命雷公狗jquery---3普通选择器
  7. 2014江西理工大学C语言程序竞赛高级组
  8. 信頼済みサイト对window.open窗体大小影响原因之一
  9. 设置Eclipse支持C++ 11
  10. setLayoutParams设置leftMargin后在模拟器上可以真机上不行
  11. Objective-C(iOS)严格单例模式正确实现
  12. 快速登录IRC网络聊天室
  13. background-size IE8兼容方案
  14. WebGIS开源解决方案之环境搭建(二)
  15. Spring Security学习笔记
  16. angular学习笔记04 理论加实践
  17. python 去除html 超链接href 如何实现?
  18. 网站之.htaccess文件
  19. Layui treeGrid
  20. Oracle 在存储过程或函数中执行字符串sql

热门文章

  1. 全面jmeter逻辑控制器案例详解
  2. [Err] [Dtf] 1044 - Access denied for user &#39;root&#39;@&#39;localhost&#39; to database &#39;information_schema&#39;
  3. 快速排序(QuiteSort)
  4. kafka 常见命令以及增加topic的分区数
  5. WPF-UI框架MahApps.Metro使用教程
  6. SAP S/4HANA Cloud的功能亮点以及大中型企业为何更倾向选择它
  7. lib_0001_file_manager.py
  8. docker简单实战
  9. 项目开发中的ORM框架使用mybatis还是mybatis-plus
  10. 学习-自增id++的问题