From f409082b224cb50e7b3c9acf2055c07d84d1cf37 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Fri, 10 Apr 2020 16:59:16 +0800 Subject: [PATCH] support default method. #1105 --- .../com/taobao/arthas/common/JavaVersionUtils.java | 4 ++++ .../java/com/taobao/arthas/core/GlobalOptions.java | 14 ++++++++++++++ .../com/taobao/arthas/core/advisor/Enhancer.java | 3 +-- .../core/command/klass100/RedefineCommand.java | 1 - .../core/command/monitor200/EnhancerCommand.java | 1 + site/src/site/sphinx/en/options.md | 1 + site/src/site/sphinx/options.md | 1 + 7 files changed, 22 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/com/taobao/arthas/common/JavaVersionUtils.java b/common/src/main/java/com/taobao/arthas/common/JavaVersionUtils.java index b7ce4d92a..6f25861de 100644 --- a/common/src/main/java/com/taobao/arthas/common/JavaVersionUtils.java +++ b/common/src/main/java/com/taobao/arthas/common/JavaVersionUtils.java @@ -47,6 +47,10 @@ public class JavaVersionUtils { return JAVA_VERSION < 9.0f; } + public static boolean isGreaterThanJava7() { + return JAVA_VERSION > 1.7f; + } + public static boolean isGreaterThanJava8() { return JAVA_VERSION > 1.8f; } diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index 647867a45..6f1286fad 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core; +import com.taobao.arthas.common.JavaVersionUtils; + /** * 全局开关 * Created by vlinux on 15/6/4. @@ -67,6 +69,18 @@ public class GlobalOptions { ) public static volatile boolean isDisableSubClass = false; + /** + * 是否在interface类里搜索函数 + * https://github.com/alibaba/arthas/issues/1105 + */ + @Option( + level = 1, + name = "support-default-method", + summary = "Option to control include default method in interface when class matching", + description = "This option disable to include default method in interface when matching class." + ) + public static volatile boolean isSupportDefaultMethod = true && JavaVersionUtils.isGreaterThanJava7(); + /** * 是否在asm中输出 */ diff --git a/core/src/main/java/com/taobao/arthas/core/advisor/Enhancer.java b/core/src/main/java/com/taobao/arthas/core/advisor/Enhancer.java index 02057e743..85fb26ebc 100644 --- a/core/src/main/java/com/taobao/arthas/core/advisor/Enhancer.java +++ b/core/src/main/java/com/taobao/arthas/core/advisor/Enhancer.java @@ -253,9 +253,8 @@ public class Enhancer implements ClassFileTransformer { * 是否过滤目前暂不支持的类 */ private static boolean isUnsupportedClass(Class clazz) { - return clazz.isArray() - || clazz.isInterface() + || (clazz.isInterface() && !GlobalOptions.isSupportDefaultMethod) || clazz.isEnum() || clazz.equals(Class.class) || clazz.equals(Integer.class) || clazz.equals(Method.class); } diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/RedefineCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/RedefineCommand.java index 769bcf557..10cca2e67 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/RedefineCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/RedefineCommand.java @@ -15,7 +15,6 @@ import org.objectweb.asm.ClassReader; import com.alibaba.arthas.deps.org.slf4j.Logger; import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.command.Constants; -import com.taobao.arthas.core.command.logger.LoggerCommand; import com.taobao.arthas.core.shell.cli.Completion; import com.taobao.arthas.core.shell.cli.CompletionUtils; import com.taobao.arthas.core.shell.command.AnnotatedCommand; diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java index a55f4a09e..8c421df3a 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java @@ -115,6 +115,7 @@ public abstract class EnhancerCommand extends AnnotatedCommand { if (effect.cCnt() == 0 || effect.mCnt() == 0) { // no class effected // might be method code too large + process.write("Matched class-cnt: " + effect.cCnt() + ", method-cnt: " + effect.mCnt() + "\n"); process.write("No class or method is affected, try:\n" + "1. sm CLASS_NAME METHOD_NAME to make sure the method you are tracing actually exists (it might be in your parent class).\n" + "2. reset CLASS_NAME and try again, your method body might be too large.\n" diff --git a/site/src/site/sphinx/en/options.md b/site/src/site/sphinx/en/options.md index dc62b145e..dcce94b66 100644 --- a/site/src/site/sphinx/en/options.md +++ b/site/src/site/sphinx/en/options.md @@ -10,6 +10,7 @@ options | batch-re-transform | true | whether to re-transform matched classes in batch| | json-format | false | whether to output in JSON format| | disable-sub-class | false | whether to enable matching child classes. The default value is `true`. If exact match is desire, turn off this flag| +| support-default-method | true | whether to enable matching default method in interface. The default value is `true`. Refer to [#1105](https://github.com/alibaba/arthas/issues/1105) | | debug-for-asm | false | whether to enable ASM debugging log| | save-result | false | whether to save execution result. All execution results will be saved to `~/logs/arthas-cache/result.log` when it's turned on| | job-timeout | 1d | default timeout for background jobs. Background job will be terminated once it's timed out (i.e. 1d, 2h, 3m, 25s)| print-parent-fields | true | This option enables print files in parent class, default value true.| diff --git a/site/src/site/sphinx/options.md b/site/src/site/sphinx/options.md index 2603c2516..ad36e7a58 100644 --- a/site/src/site/sphinx/options.md +++ b/site/src/site/sphinx/options.md @@ -10,6 +10,7 @@ options | batch-re-transform | true | 是否支持批量对匹配到的类执行retransform操作 | | json-format | false | 是否支持json化的输出 | | disable-sub-class | false | 是否禁用子类匹配,默认在匹配目标类的时候会默认匹配到其子类,如果想精确匹配,可以关闭此开关 | +| support-default-method | true | 是否支持匹配到default method,默认会查找interface,匹配里面的default method。参考 [#1105](https://github.com/alibaba/arthas/issues/1105) | | debug-for-asm | false | 打印ASM相关的调试信息 | | save-result | false | 是否打开执行结果存日志功能,打开之后所有命令的运行结果都将保存到`~/logs/arthas-cache/result.log`中 | | job-timeout | 1d | 异步后台任务的默认超时时间,超过这个时间,任务自动停止;比如设置 1d, 2h, 3m, 25s,分别代表天、小时、分、秒 |