-
https://github.com/alibaba/arthas
jad命令介绍
-
https://alibaba.github.io/arthas/jad.html
jad即java decompiler,把JVM已加载类的字节码反编译成Java代码。比如反编译类:
获取到类的字节码
反编译有两部分工作:
-
获取到字节码
-
反编译为Java代码
那么怎么从运行的JVM里获取到字节码/p>
最常见的思路是,在下面查找,比如 ,但是这样子查找到的字节码不一定对。比如可能有多个冲突的jar,或者有Java Agent修改了字节码。
ClassFileTransformer机制
从JDK 1.5起,有一套的机制,Java Agent通过注册,那么在类加载或者时就可以回调修改字节码。
显然,在Arthas里,要增强的类是已经被加载的,所以它们的字节码都是在时被修改的。
通过显式调用可以触发回调。
Arthas里增强字节码的///等命令都是通过来实现的。
的接口如下:
看到这里,读者应该猜到是怎么获取到字节码的了:
-
注册一个
-
通过触发回调
-
在回调的函数里获取到字节码
-
删掉注册的
使用cfr来反编译
获取到字节码之后,怎样转换为Java代码呢/p>
以前大家使用比较多的反编译软件可能是,但是它不支持JDK8的lambda语法和一些新版本JDK的特性。
-
https://github.com/leibnitz27/cfr
在Arthas 命令里,通过调用来完成反编译。
jad命令的缺陷
99%的情况下,命令dump下来的字节码是准确的,除了一些极端情况。
-
因为JVM里注册的可能有多个,那么在JVM里运行的字节码里,可能是被多个处理过的。
-
触发了之后,这些注册的会被依次回,上一个处理的字节码传递到下一个。
所以不能保证这些第二次执行会返回同样的结果。 -
有可能一些会被删掉,触发之后,之前的一些修改就会丢失掉。
所以目前在Arthas里,如果开两个窗口,一个窗口执行/等命令,另一个窗口对这个类执行,那么可以观察到/停止了输出,实际上是因为字节码在触发了之后,/所做的修改丢失了。
精确获取JVM内运行的java字节码的办法
如果想精确获取到JVM内运行的Java字节码,可以使用这个工具,它是通过来实现的,保证dump下来的字节码是JVM内所运行的。
-
https://github.com/hengyunabc/dumpclass
总结
总结命令的工作原理:
-
通过注册,再触发来获取字节码
-
通过来反编译
-
的方式来获取字节码有一定缺陷
-
通过工具可以精确获取字节码
命令可以在线上快速检查运行时的代码,并且结合/命令可以热更新代码:
-
阿里巴巴Arthas实践–jad/mc/redefine线上热更新一条龙
链接
-
Arthas开源:https://github.com/alibaba/arthas
-
dumpclass: https://github.com/hengyunabc/dumpclass
-
https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/ClassFileTransformer.html
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!