From cc6fbc5fed126e054b168803a8ad4f3cff50b503 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Fri, 14 Sep 2018 15:34:55 +0800 Subject: [PATCH] check vm java version before attach. fixed #6 --- .../java/com/taobao/arthas/core/Arthas.java | 18 ++++- .../com/taobao/arthas/core/util/AnsiLog.java | 77 +++++++++++++++++++ 2 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/com/taobao/arthas/core/util/AnsiLog.java diff --git a/core/src/main/java/com/taobao/arthas/core/Arthas.java b/core/src/main/java/com/taobao/arthas/core/Arthas.java index ea6adbd6e..141636614 100644 --- a/core/src/main/java/com/taobao/arthas/core/Arthas.java +++ b/core/src/main/java/com/taobao/arthas/core/Arthas.java @@ -3,6 +3,7 @@ package com.taobao.arthas.core; import com.sun.tools.attach.VirtualMachine; import com.sun.tools.attach.VirtualMachineDescriptor; import com.taobao.arthas.core.config.Configure; +import com.taobao.arthas.core.util.AnsiLog; import com.taobao.middleware.cli.CLI; import com.taobao.middleware.cli.CLIs; import com.taobao.middleware.cli.CommandLine; @@ -10,6 +11,7 @@ import com.taobao.middleware.cli.Option; import com.taobao.middleware.cli.TypedOption; import java.util.Arrays; +import java.util.Properties; /** * Arthas启动器 @@ -59,7 +61,6 @@ public class Arthas { virtualMachineDescriptor = descriptor; } } - VirtualMachine virtualMachine = null; try { if (null == virtualMachineDescriptor) { // 使用 attach(String pid) 这种方式 @@ -67,6 +68,19 @@ public class Arthas { } else { virtualMachine = VirtualMachine.attach(virtualMachineDescriptor); } + + Properties targetSystemProperties = virtualMachine.getSystemProperties(); + String targetJavaVersion = targetSystemProperties.getProperty("java.specification.version"); + String currentJavaVersion = System.getProperty("java.specification.version"); + if (targetJavaVersion != null && currentJavaVersion != null) { + if (!targetJavaVersion.equals(currentJavaVersion)) { + AnsiLog.warn("Current VM java version: {} do not match target VM java version: {}, attach may fail.", + currentJavaVersion, targetJavaVersion); + AnsiLog.warn("Target VM JAVA_HOME is {}, try to set the same JAVA_HOME.", + targetSystemProperties.getProperty("java.home")); + } + } + virtualMachine.loadAgent(configure.getArthasAgent(), configure.getArthasCore() + ";" + configure.toString()); } finally { @@ -81,7 +95,7 @@ public class Arthas { try { new Arthas(args); } catch (Throwable t) { - System.err.println("Start arthas failed, exception stack trace: "); + AnsiLog.error("Start arthas failed, exception stack trace: "); t.printStackTrace(); System.exit(-1); } diff --git a/core/src/main/java/com/taobao/arthas/core/util/AnsiLog.java b/core/src/main/java/com/taobao/arthas/core/util/AnsiLog.java new file mode 100644 index 000000000..af4205454 --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/util/AnsiLog.java @@ -0,0 +1,77 @@ +package com.taobao.arthas.core.util; +import java.util.regex.Matcher; + +/** + * + * @author hengyunabc 2017-05-03 + * + */ +public abstract class AnsiLog { + + static boolean enable = System.console() != null; + + /** + * + * @param msg + */ + public static void red(String msg) { + if (enable) { + System.out.println("" + msg + ""); + } else { + System.err.println(msg); + } + } + + public static void green(String msg) { + if (enable) { + System.out.println("" + msg + ""); + } else { + System.out.println(msg); + } + } + + public static void yellow(String msg) { + if (enable) { + System.out.println("" + msg + ""); + } else { + System.out.println(msg); + } + } + + public static void info(String msg) { + green(msg); + } + + public static void info(String format, Object... arguments) { + green(format(format, arguments)); + } + + public static void warn(String msg) { + yellow(msg); + } + + public static void warn(String format, Object... arguments) { + yellow(format(format, arguments)); + } + + public static void error(String msg) { + red(msg); + } + + public static void error(String format, Object... arguments) { + red(format(format, arguments)); + } + + private static String format(String from, Object... arguments) { + if (from != null) { + String computed = from; + if (arguments != null && arguments.length != 0) { + for (Object argument : arguments) { + computed = computed.replaceFirst("\\{\\}", Matcher.quoteReplacement(argument.toString())); + } + } + return computed; + } + return null; + } +}