码迷,mamicode.com
首页 > 其他好文 > 详细

BTrace

时间:2019-12-19 10:10:39      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:一个   而在   流程   自定义输出   dal   sans   mac   nta   font   

BTrace是比arthas更早的一款java动态追踪开源软件,github地址为:https://github.com/btraceio/btrace,官网的介绍是BTrace is a safe, dynamic tracing tool for the Java platform.,它是安全的动态追踪java应用的工具,即可以动态地向目标应用的字节码注入追踪代码。何为动态?我们都知道,即在java应用启动的时候会把class文件加载到JVM运行,此时class代码功能是确定、静态的(无法变更),要想修改,只能是修改代码,重新编译、部署、启动。
而在处理线上应用时,我们经常需要查看代码运行情况,参数值、返回值查看,或者添加自己需要调试的日志等,在开发阶段,添加日志,重新启动没有问题,但在生产环境就不适用了(生产环境一般不轻易关停服务,而且即使可以重启,可能发生问题的现场就破坏了,无法重现问题),那么是否有方法在java应用运行期间,不重启程序的情况,动态加入自己想要监测(追踪)的内容?Btrace就是这样一个动态追踪神器,可以在不用重启的情况下监控应用运行情况,可以获取程序运行时的数据信息,如方法参数、返回值、全局变量和堆栈信息等。

BTrace是基于java的动态追踪技术来实现的。java程序的开发流程是写java代码,把它编译为class文件,然后在JVM中加载class运行。若此时想要在不停止应用的情况下对class进行修改来添加追踪内容,如在某个方法(method)中添加输出信息,主要是两件事情:

  • (1)修改已经加载到JVM中的class,添加自定义输出
  • (2)替换运行在JVM`中的class

第一步,修改,由于JVM运行的都是class文件,是不是可以直接修改字节码class文件就行了(当然,字节码文件的可读性远远没有Java代码高),但是已经有相应的框架可以做这件事,就是ASM,利用这框架,可以直接编辑字节码的框架,它也提供接口可以让我们方便地操作字节码文件,进行注入修改类的方法,动态创造一个新的类等等。Spring就是使用这种技术来实现动态代理的。

第二步,替换,如果对它进行替换,则需要用到java提供的java.lang.instrument.Instrumentation,它有两个接口redefineClassesretransformClassesredefineClasses是自己提供字节码文件替换掉已存在的class文件,retransformClasses是在已存在的字节码文件上修改后再替换。不过需要注意的是instrument的使用有限制的(不能添加、修改、删除已经有字段和方法,不能改变方法签名,改变继承属性等)。


BTrace

标签:一个   而在   流程   自定义输出   dal   sans   mac   nta   font   

原文地址:https://www.cnblogs.com/doit8791/p/12065743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!