diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java index 5506fbc6e..caf883260 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java @@ -26,8 +26,12 @@ import com.taobao.text.ui.LabelElement; import com.taobao.text.ui.TableElement; import com.taobao.text.util.RenderUtil; +import static java.lang.System.arraycopy; + import java.io.File; +import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; +import java.lang.instrument.UnmodifiableClassException; import java.util.*; import java.util.regex.Pattern; @@ -118,6 +122,27 @@ public class JadCommand extends AnnotatedCommand { } } + + public static void retransformClasses(Instrumentation inst, ClassFileTransformer transformer, Set> classes) { + try { + inst.addTransformer(transformer, true); + + for(Class clazz : classes) { + try{ + inst.retransformClasses(clazz); + }catch(Throwable e) { + String errorMsg = "retransformClasses class error, name: " + clazz.getName(); + if(ClassUtils.isLambdaClass(clazz) && e instanceof VerifyError) { + errorMsg += ", Please ignore lambda class VerifyError: https://github.com/alibaba/arthas/issues/675"; + } + logger.error("jad", errorMsg, e); + } + } + } finally { + inst.removeTransformer(transformer); + } + } + private void processExactMatch(CommandProcess process, RowAffect affect, Instrumentation inst, Set> matchedClasses, Set> withInnerClasses) { Class c = matchedClasses.iterator().next(); Set> allClasses = new HashSet>(withInnerClasses); @@ -125,7 +150,8 @@ public class JadCommand extends AnnotatedCommand { try { ClassDumpTransformer transformer = new ClassDumpTransformer(allClasses); - Enhancer.enhance(inst, transformer, allClasses); + retransformClasses(inst, transformer, allClasses); + Map, File> classFiles = transformer.getDumpResult(); File classFile = classFiles.get(c); diff --git a/core/src/main/java/com/taobao/arthas/core/util/ClassUtils.java b/core/src/main/java/com/taobao/arthas/core/util/ClassUtils.java index 817bb8002..61e8d433e 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/ClassUtils.java +++ b/core/src/main/java/com/taobao/arthas/core/util/ClassUtils.java @@ -23,6 +23,10 @@ public class ClassUtils { return cs.getLocation().getFile(); } + public static boolean isLambdaClass(Class clazz) { + return clazz.getName().contains("$$Lambda$"); + } + public static Element renderClassInfo(Class clazz) { return renderClassInfo(clazz, false, null); }