From dd997c267a0cdd8b9ee2a4b9613e0ef06b23c062 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Thu, 7 Jan 2021 22:46:36 +0800 Subject: [PATCH] retransform command print transformCount. #1651 --- .../core/command/klass100/RetransformCommand.java | 12 ++++++++---- .../arthas/core/command/view/RetransformView.java | 6 +++--- site/src/site/sphinx/en/retransform.md | 5 +++-- site/src/site/sphinx/retransform.md | 6 ++++-- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/RetransformCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/RetransformCommand.java index e2756ea04..fc4272587 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/RetransformCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/RetransformCommand.java @@ -280,8 +280,6 @@ public class RetransformCommand extends AnnotatedCommand { classList.add(clazz); retransformModel.addRetransformClass(clazz.getName()); - addRetransformEntry(retransformEntry); - logger.info("Try retransform class name: {}, ClassLoader: {}", clazz.getName(), clazz.getClassLoader()); } } @@ -291,6 +289,7 @@ public class RetransformCommand extends AnnotatedCommand { process.end(-1, "These classes are not found in the JVM and may not be loaded: " + bytesMap.keySet()); return; } + addRetransformEntry(retransformEntryList); inst.retransformClasses(classList.toArray(new Class[0])); @@ -352,6 +351,10 @@ public class RetransformCommand extends AnnotatedCommand { this.classLoaderClass = classLoaderClass; } + public void incTransformCount() { + transformCount++; + } + public int getId() { return id; } @@ -401,10 +404,10 @@ public class RetransformCommand extends AnnotatedCommand { } } - public static synchronized void addRetransformEntry(RetransformEntry retransformEntry) { + public static synchronized void addRetransformEntry(List retransformEntryList) { List tmp = new ArrayList(); tmp.addAll(retransformEntries); - tmp.add(retransformEntry); + tmp.addAll(retransformEntryList); Collections.sort(tmp, new Comparator() { @Override public int compare(RetransformEntry entry1, RetransformEntry entry2) { @@ -468,6 +471,7 @@ public class RetransformCommand extends AnnotatedCommand { if (updateFlag) { logger.info("RetransformCommand match class: {}, id: {}, classLoaderClass: {}, hashCode: {}", className, id, retransformEntry.getClassLoaderClass(), retransformEntry.getHashCode()); + retransformEntry.incTransformCount(); return retransformEntry.getBytes(); } diff --git a/core/src/main/java/com/taobao/arthas/core/command/view/RetransformView.java b/core/src/main/java/com/taobao/arthas/core/command/view/RetransformView.java index 9da84a8e0..5f64f1679 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/view/RetransformView.java +++ b/core/src/main/java/com/taobao/arthas/core/command/view/RetransformView.java @@ -35,12 +35,12 @@ public class RetransformView extends ResultView { // retransform -l if (result.getRetransformEntries() != null) { // header - TableElement table = new TableElement(1, 1, 1, 1).rightCellPadding(1); - table.add(new RowElement().style(Decoration.bold.bold()).add("Id", "ClassName", "LoaderHash", + TableElement table = new TableElement(1, 1, 1, 1, 1).rightCellPadding(1); + table.add(new RowElement().style(Decoration.bold.bold()).add("Id", "ClassName", "TransformCount", "LoaderHash", "LoaderClassName")); for (RetransformEntry entry : result.getRetransformEntries()) { - table.row("" + entry.getId(), "" + entry.getClassName(), "" + entry.getHashCode(), + table.row("" + entry.getId(), "" + entry.getClassName(), "" + entry.getTransformCount(), "" + entry.getHashCode(), "" + entry.getClassLoaderClass()); } diff --git a/site/src/site/sphinx/en/retransform.md b/site/src/site/sphinx/en/retransform.md index 80b289ac7..89ccf73d9 100644 --- a/site/src/site/sphinx/en/retransform.md +++ b/site/src/site/sphinx/en/retransform.md @@ -33,10 +33,11 @@ Load the specified .class file, then parse out the class name, and then retransf ```bash $ retransform -l -Id ClassName LoaderHash LoaderClassName -1 demo.MathGame null null +Id ClassName TransformCount LoaderHash LoaderClassName +1 demo.MathGame 1 null null ``` +* TransformCount counts the times of attempts to return the .class file corresponding to the entry in the ClassFileTransformer#transform method, but it does not mean that the transform must be successful. ### Delete the specified retransform entry Need to specify id: diff --git a/site/src/site/sphinx/retransform.md b/site/src/site/sphinx/retransform.md index 6bc3d8b58..4964d29f5 100644 --- a/site/src/site/sphinx/retransform.md +++ b/site/src/site/sphinx/retransform.md @@ -34,10 +34,12 @@ demo.MathGame ```bash $ retransform -l -Id ClassName LoaderHash LoaderClassName -1 demo.MathGame null null +Id ClassName TransformCount LoaderHash LoaderClassName +1 demo.MathGame 1 null null ``` +* TransformCount 统计在 ClassFileTransformer#transform 函数里尝试返回 entry对应的 .class文件的次数,但并不表明transform一定成功。 + ### 删除指定 retransform entry 需要指定 id: