当使用了arthas的其它指令时,jad出来的是原始的源码还是被增强过的?
这个事情有点复杂。
java.lang.instrument.ClassFileTransformer来做的。想要对字节码做修改,就要显式触发jvm的Transform机制ClassFileTransformer一个个依次执行,最终得到结果ClassDumpTransformer.transform(ClassLoader, String, Class<?>, ProtectionDomain, byte[])这个子函数可以获取到类的实际字节码,watch/jad 都是在这里做的工作。ClassFileTransformer,然后把这个ClassFileTransformer删除掉com.taobao.arthas.core.advisor.Enhancer.classBytesCache,在下一次Transform时,优先从cache里取。所以总结,这是个复杂的问题,arthas里目前的实现比较混乱。就jad这命令本身来说,它获取不到watch/monitor等命令插入的代码,还会把这些命令插入的代码清理掉。
我们在调试的时候,担心注入的代码可能影响业务代码,所以想要看到注入后的结果。现在jad不支持的话,除了改arthas-core.jar然后手动输出class文件,就别无他法了。
谢谢!
发现原来arthas自带了自动dump下来class文件的功能,只要把globaloptions的isdump调成true就可以了。
发现原来arthas自带了自动dump下来class文件的功能,只要把globaloptions的isdump调成true就可以了。
https://alibaba.github.io/arthas/dump.html ,这个不一定完全准确,参考上面的说明。
需要绝对准确的dump,可以用上面的 dumpclass 工具。
不执行jad,直接执行watch也是一样的。
会不会是下面2个参数的设置问题? 需要特别设置吗?我测试的是servlet
--telnet-port
--http-port
Most helpful comment
这个事情有点复杂。
java.lang.instrument.ClassFileTransformer来做的。想要对字节码做修改,就要显式触发jvm的Transform机制ClassFileTransformer一个个依次执行,最终得到结果ClassDumpTransformer.transform(ClassLoader, String, Class<?>, ProtectionDomain, byte[])这个子函数可以获取到类的实际字节码,watch/jad 都是在这里做的工作。ClassFileTransformer,然后把这个ClassFileTransformer删除掉com.taobao.arthas.core.advisor.Enhancer.classBytesCache,在下一次Transform时,优先从cache里取。所以总结,这是个复杂的问题,arthas里目前的实现比较混乱。就jad这命令本身来说,它获取不到watch/monitor等命令插入的代码,还会把这些命令插入的代码清理掉。