diff --git a/agent/src/main/java/com/taobao/arthas/agent/AgentBootstrap.java b/agent/src/main/java/com/taobao/arthas/agent/AgentBootstrap.java index 55c8285fb..ea0b22e7a 100644 --- a/agent/src/main/java/com/taobao/arthas/agent/AgentBootstrap.java +++ b/agent/src/main/java/com/taobao/arthas/agent/AgentBootstrap.java @@ -1,9 +1,11 @@ package com.taobao.arthas.agent; import java.arthas.Spy; -import java.io.*; +import java.io.File; +import java.io.FileOutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; import java.lang.instrument.Instrumentation; -import java.lang.reflect.Method; import java.net.URL; import java.net.URLDecoder; import java.util.jar.JarFile; @@ -14,20 +16,9 @@ import java.util.jar.JarFile; * @author vlinux on 15/5/19. */ public class AgentBootstrap { - - private static final String ADVICEWEAVER = "com.taobao.arthas.core.advisor.AdviceWeaver"; - private static final String ON_BEFORE = "methodOnBegin"; - private static final String ON_RETURN = "methodOnReturnEnd"; - private static final String ON_THROWS = "methodOnThrowingEnd"; - private static final String BEFORE_INVOKE = "methodOnInvokeBeforeTracing"; - private static final String AFTER_INVOKE = "methodOnInvokeAfterTracing"; - private static final String THROW_INVOKE = "methodOnInvokeThrowTracing"; private static final String RESET = "resetArthasClassLoader"; private static final String ARTHAS_SPY_JAR = "arthas-spy.jar"; - private static final String ARTHAS_CONFIGURE = "com.taobao.arthas.core.config.Configure"; private static final String ARTHAS_BOOTSTRAP = "com.taobao.arthas.core.server.ArthasBootstrap"; - private static final String TO_CONFIGURE = "toConfigure"; - private static final String GET_JAVA_PID = "getJavaPid"; private static final String GET_INSTANCE = "getInstance"; private static final String IS_BIND = "isBind"; private static final String BIND = "bind"; @@ -93,17 +84,8 @@ public class AgentBootstrap { return arthasClassLoader; } - private static void initSpy(ClassLoader classLoader) throws ClassNotFoundException, NoSuchMethodException { - Class adviceWeaverClass = classLoader.loadClass(ADVICEWEAVER); - Method onBefore = adviceWeaverClass.getMethod(ON_BEFORE, int.class, ClassLoader.class, String.class, - String.class, String.class, Object.class, Object[].class); - Method onReturn = adviceWeaverClass.getMethod(ON_RETURN, Object.class); - Method onThrows = adviceWeaverClass.getMethod(ON_THROWS, Throwable.class); - Method beforeInvoke = adviceWeaverClass.getMethod(BEFORE_INVOKE, int.class, String.class, String.class, String.class, int.class); - Method afterInvoke = adviceWeaverClass.getMethod(AFTER_INVOKE, int.class, String.class, String.class, String.class, int.class); - Method throwInvoke = adviceWeaverClass.getMethod(THROW_INVOKE, int.class, String.class, String.class, String.class, int.class); - Method reset = AgentBootstrap.class.getMethod(RESET); - Spy.initForAgentLauncher(classLoader, onBefore, onReturn, onThrows, beforeInvoke, afterInvoke, throwInvoke, reset); + private static void initSpy() throws NoSuchMethodException { + Spy.AGENT_RESET_METHOD = AgentBootstrap.class.getMethod(RESET); } private static synchronized void main(String args, final Instrumentation inst) { @@ -131,7 +113,7 @@ public class AgentBootstrap { * Use a dedicated thread to run the binding logic to prevent possible memory leak. #195 */ final ClassLoader agentLoader = getClassLoader(inst, spyJarFile, agentJarFile); - initSpy(agentLoader); + initSpy(); Thread bindingThread = new Thread() { @Override @@ -163,21 +145,16 @@ public class AgentBootstrap { private static void bind(Instrumentation inst, ClassLoader agentLoader, String args) throws Throwable { /** *
-         * Configure configure = Configure.toConfigure(args);
-         * int javaPid = configure.getJavaPid();
-         * ArthasBootstrap bootstrap = ArthasBootstrap.getInstance(javaPid, inst);
+         * ArthasBootstrap bootstrap = ArthasBootstrap.getInstance(inst);
          * 
*/ - Class classOfConfigure = agentLoader.loadClass(ARTHAS_CONFIGURE); - Object configure = classOfConfigure.getMethod(TO_CONFIGURE, String.class).invoke(null, args); - int javaPid = (Integer) classOfConfigure.getMethod(GET_JAVA_PID).invoke(configure); Class bootstrapClass = agentLoader.loadClass(ARTHAS_BOOTSTRAP); - Object bootstrap = bootstrapClass.getMethod(GET_INSTANCE, int.class, Instrumentation.class).invoke(null, javaPid, inst); + Object bootstrap = bootstrapClass.getMethod(GET_INSTANCE, Instrumentation.class).invoke(null, inst); boolean isBind = (Boolean) bootstrapClass.getMethod(IS_BIND).invoke(bootstrap); if (!isBind) { try { ps.println("Arthas start to bind..."); - bootstrapClass.getMethod(BIND, classOfConfigure).invoke(bootstrap, configure); + bootstrapClass.getMethod(BIND, String.class).invoke(bootstrap, args); ps.println("Arthas server bind success."); return; } catch (Exception e) { diff --git a/boot/src/main/java/com/taobao/arthas/boot/Bootstrap.java b/boot/src/main/java/com/taobao/arthas/boot/Bootstrap.java index 87f6bddea..9db806a51 100644 --- a/boot/src/main/java/com/taobao/arthas/boot/Bootstrap.java +++ b/boot/src/main/java/com/taobao/arthas/boot/Bootstrap.java @@ -60,7 +60,7 @@ public class Bootstrap { private boolean help = false; - private int pid = -1; + private long pid = -1; private String targetIp = DEFAULT_TARGET_IP; private int telnetPort = DEFAULT_TELNET_PORT; private int httpPort = DEFAULT_HTTP_PORT; @@ -138,7 +138,7 @@ public class Bootstrap { @Argument(argName = "pid", index = 0, required = false) @Description("Target pid") - public void setPid(int pid) { + public void setPid(long pid) { this.pid = pid; } @@ -314,8 +314,8 @@ public class Bootstrap { } // check telnet/http port - int telnetPortPid = -1; - int httpPortPid = -1; + long telnetPortPid = -1; + long httpPortPid = -1; if (bootstrap.getTelnetPort() > 0) { telnetPortPid = SocketUtils.findTcpListenProcess(bootstrap.getTelnetPort()); if (telnetPortPid > 0) { @@ -329,7 +329,7 @@ public class Bootstrap { } } - int pid = bootstrap.getPid(); + long pid = bootstrap.getPid(); // select pid if (pid < 0) { try { @@ -651,7 +651,7 @@ public class Bootstrap { return attachOnly; } - public int getPid() { + public long getPid() { return pid; } diff --git a/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java b/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java index 4247e6b79..e33f167d2 100644 --- a/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java +++ b/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java @@ -28,13 +28,13 @@ public class ProcessUtils { private static String FOUND_JAVA_HOME = null; @SuppressWarnings("resource") - public static int select(boolean v, int telnetPortPid) throws InputMismatchException { - Map processMap = listProcessByJps(v); + public static long select(boolean v, long telnetPortPid) throws InputMismatchException { + Map processMap = listProcessByJps(v); // Put the port that is already listening at the first if (telnetPortPid > 0 && processMap.containsKey(telnetPortPid)) { String telnetPortProcess = processMap.get(telnetPortPid); processMap.remove(telnetPortPid); - Map newProcessMap = new LinkedHashMap(); + Map newProcessMap = new LinkedHashMap(); newProcessMap.put(telnetPortPid, telnetPortProcess); newProcessMap.putAll(processMap); processMap = newProcessMap; @@ -70,7 +70,7 @@ public class ProcessUtils { return -1; } - Iterator idIter = processMap.keySet().iterator(); + Iterator idIter = processMap.keySet().iterator(); for (int i = 1; i <= choice; ++i) { if (i == choice) { return idIter.next(); @@ -81,8 +81,8 @@ public class ProcessUtils { return -1; } - private static Map listProcessByJps(boolean v) { - Map result = new LinkedHashMap(); + private static Map listProcessByJps(boolean v) { + Map result = new LinkedHashMap(); String jps = "jps"; File jpsFile = findJps(); @@ -103,14 +103,14 @@ public class ProcessUtils { AnsiLog.debug("jps result: " + lines); - int currentPid = Integer.parseInt(PidUtils.currentPid()); + long currentPid = Long.parseLong(PidUtils.currentPid()); for (String line : lines) { String[] strings = line.trim().split("\\s+"); if (strings.length < 1) { continue; } try { - int pid = Integer.parseInt(strings[0]); + long pid = Long.parseLong(strings[0]); if (pid == currentPid) { continue; } @@ -189,7 +189,7 @@ public class ProcessUtils { return FOUND_JAVA_HOME; } - public static void startArthasCore(int targetPid, List attachArgs) { + public static void startArthasCore(long targetPid, List attachArgs) { // find java/java.exe, then try to find tools.jar String javaHome = findJavaHome(); diff --git a/common/src/main/java/com/taobao/arthas/common/PidUtils.java b/common/src/main/java/com/taobao/arthas/common/PidUtils.java index 194ea9e5f..3dd74555a 100644 --- a/common/src/main/java/com/taobao/arthas/common/PidUtils.java +++ b/common/src/main/java/com/taobao/arthas/common/PidUtils.java @@ -9,6 +9,7 @@ import java.lang.management.ManagementFactory; */ public class PidUtils { private static String PID = "-1"; + private static long pid = -1; static { // https://stackoverflow.com/a/7690178 @@ -18,6 +19,7 @@ public class PidUtils { if (index > 0) { try { PID = Long.toString(Long.parseLong(jvmName.substring(0, index))); + pid = Long.parseLong(PID); } catch (Throwable e) { // ignore } @@ -30,4 +32,8 @@ public class PidUtils { public static String currentPid() { return PID; } + + public static long currentLongPid() { + return pid; + } } diff --git a/common/src/main/java/com/taobao/arthas/common/SocketUtils.java b/common/src/main/java/com/taobao/arthas/common/SocketUtils.java index 2673ee48e..28d2c5846 100644 --- a/common/src/main/java/com/taobao/arthas/common/SocketUtils.java +++ b/common/src/main/java/com/taobao/arthas/common/SocketUtils.java @@ -17,7 +17,7 @@ public class SocketUtils { private SocketUtils() { } - public static int findTcpListenProcess(int port) { + public static long findTcpListenProcess(int port) { try { if (OSUtils.isWindows()) { String[] command = { "netstat", "-ano", "-p", "TCP" }; @@ -28,7 +28,7 @@ public class SocketUtils { String[] strings = line.trim().split("\\s+"); if (strings.length == 5) { if (strings[1].endsWith(":" + port)) { - return Integer.parseInt(strings[4]); + return Long.parseLong(strings[4]); } } } @@ -38,7 +38,7 @@ public class SocketUtils { if (OSUtils.isLinux() || OSUtils.isMac()) { String pid = ExecutingCommand.getFirstAnswer("lsof -t -s TCP:LISTEN -i TCP:" + port); if (!pid.trim().isEmpty()) { - return Integer.parseInt(pid); + return Long.parseLong(pid); } } } catch (Throwable e) { 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 116555b7f..5bf013529 100644 --- a/core/src/main/java/com/taobao/arthas/core/Arthas.java +++ b/core/src/main/java/com/taobao/arthas/core/Arthas.java @@ -29,7 +29,7 @@ public class Arthas { } private Configure parse(String[] args) { - Option pid = new TypedOption().setType(Integer.class).setShortName("pid").setRequired(true); + Option pid = new TypedOption().setType(Long.class).setShortName("pid").setRequired(true); Option core = new TypedOption().setType(String.class).setShortName("core").setRequired(true); Option agent = new TypedOption().setType(String.class).setShortName("agent").setRequired(true); Option target = new TypedOption().setType(String.class).setShortName("target-ip"); @@ -50,7 +50,7 @@ public class Arthas { CommandLine commandLine = cli.parse(Arrays.asList(args)); Configure configure = new Configure(); - configure.setJavaPid((Integer) commandLine.getOptionValue("pid")); + configure.setJavaPid((Long) commandLine.getOptionValue("pid")); configure.setArthasAgent((String) commandLine.getOptionValue("agent")); configure.setArthasCore((String) commandLine.getOptionValue("core")); configure.setSessionTimeout((Integer)commandLine.getOptionValue("session-timeout")); @@ -73,7 +73,7 @@ public class Arthas { VirtualMachineDescriptor virtualMachineDescriptor = null; for (VirtualMachineDescriptor descriptor : VirtualMachine.list()) { String pid = descriptor.id(); - if (pid.equals(Integer.toString(configure.getJavaPid()))) { + if (pid.equals(Long.toString(configure.getJavaPid()))) { virtualMachineDescriptor = descriptor; } } diff --git a/core/src/main/java/com/taobao/arthas/core/advisor/AdviceWeaver.java b/core/src/main/java/com/taobao/arthas/core/advisor/AdviceWeaver.java index fc29f233a..5b1cfed8a 100644 --- a/core/src/main/java/com/taobao/arthas/core/advisor/AdviceWeaver.java +++ b/core/src/main/java/com/taobao/arthas/core/advisor/AdviceWeaver.java @@ -30,7 +30,13 @@ public class AdviceWeaver extends ClassVisitor implements Opcodes { private final static Logger logger = LogUtil.getArthasLogger(); - + public static final String ON_BEFORE = "methodOnBegin"; + public static final String ON_RETURN = "methodOnReturnEnd"; + public static final String ON_THROWS = "methodOnThrowingEnd"; + public static final String BEFORE_INVOKE = "methodOnInvokeBeforeTracing"; + public static final String AFTER_INVOKE = "methodOnInvokeAfterTracing"; + public static final String THROW_INVOKE = "methodOnInvokeThrowTracing"; + public static final String RESET = "resetArthasClassLoader"; // 线程帧栈堆栈大小 private final static int FRAME_STACK_SIZE = 7; diff --git a/core/src/main/java/com/taobao/arthas/core/config/Configure.java b/core/src/main/java/com/taobao/arthas/core/config/Configure.java index e2c401dba..d2f91a9fe 100644 --- a/core/src/main/java/com/taobao/arthas/core/config/Configure.java +++ b/core/src/main/java/com/taobao/arthas/core/config/Configure.java @@ -20,7 +20,7 @@ public class Configure { private String ip; private int telnetPort; private int httpPort; - private int javaPid; + private long javaPid; private String arthasCore; private String arthasAgent; @@ -61,11 +61,11 @@ public class Configure { return httpPort; } - public int getJavaPid() { + public long getJavaPid() { return javaPid; } - public void setJavaPid(int javaPid) { + public void setJavaPid(long javaPid) { this.javaPid = javaPid; } diff --git a/core/src/main/java/com/taobao/arthas/core/env/PropertyPlaceholderHelper.java b/core/src/main/java/com/taobao/arthas/core/env/PropertyPlaceholderHelper.java index b76eadc17..0269eb28a 100644 --- a/core/src/main/java/com/taobao/arthas/core/env/PropertyPlaceholderHelper.java +++ b/core/src/main/java/com/taobao/arthas/core/env/PropertyPlaceholderHelper.java @@ -228,7 +228,6 @@ public class PropertyPlaceholderHelper { * Strategy interface used to resolve replacement values for placeholders * contained in Strings. */ - @FunctionalInterface public interface PlaceholderResolver { /** diff --git a/core/src/main/java/com/taobao/arthas/core/server/ArthasBootstrap.java b/core/src/main/java/com/taobao/arthas/core/server/ArthasBootstrap.java index 405b23ac5..cfcc12833 100644 --- a/core/src/main/java/com/taobao/arthas/core/server/ArthasBootstrap.java +++ b/core/src/main/java/com/taobao/arthas/core/server/ArthasBootstrap.java @@ -2,6 +2,8 @@ package com.taobao.arthas.core.server; import com.taobao.arthas.core.config.Configure; import com.alibaba.arthas.tunnel.client.TunnelClient; +import com.taobao.arthas.common.PidUtils; +import com.taobao.arthas.core.advisor.AdviceWeaver; import com.taobao.arthas.core.command.BuiltinCommandPack; import com.taobao.arthas.core.shell.ShellServer; import com.taobao.arthas.core.shell.ShellServerOptions; @@ -18,6 +20,7 @@ import com.taobao.middleware.logger.Logger; import io.netty.channel.ChannelFuture; +import java.arthas.Spy; import java.io.File; import java.io.IOException; import java.lang.instrument.Instrumentation; @@ -43,7 +46,6 @@ public class ArthasBootstrap { private static ArthasBootstrap arthasBootstrap; private AtomicBoolean isBindRef = new AtomicBoolean(false); - private int pid; private Instrumentation instrumentation; private Thread shutdown; private ShellServer shellServer; @@ -52,8 +54,7 @@ public class ArthasBootstrap { private File arthasOutputDir; - private ArthasBootstrap(int pid, Instrumentation instrumentation) { - this.pid = pid; + private ArthasBootstrap(Instrumentation instrumentation) { this.instrumentation = instrumentation; String outputPath = System.getProperty("arthas.output.dir", "arthas-output"); @@ -80,6 +81,24 @@ public class ArthasBootstrap { Runtime.getRuntime().addShutdownHook(shutdown); } + private static void initSpy() throws ClassNotFoundException, NoSuchMethodException { + Class adviceWeaverClass = AdviceWeaver.class; + Method onBefore = adviceWeaverClass.getMethod(AdviceWeaver.ON_BEFORE, int.class, ClassLoader.class, String.class, + String.class, String.class, Object.class, Object[].class); + Method onReturn = adviceWeaverClass.getMethod(AdviceWeaver.ON_RETURN, Object.class); + Method onThrows = adviceWeaverClass.getMethod(AdviceWeaver.ON_THROWS, Throwable.class); + Method beforeInvoke = adviceWeaverClass.getMethod(AdviceWeaver.BEFORE_INVOKE, int.class, String.class, String.class, String.class, int.class); + Method afterInvoke = adviceWeaverClass.getMethod(AdviceWeaver.AFTER_INVOKE, int.class, String.class, String.class, String.class, int.class); + Method throwInvoke = adviceWeaverClass.getMethod(AdviceWeaver.THROW_INVOKE, int.class, String.class, String.class, String.class, int.class); + Spy.init(AdviceWeaver.class.getClassLoader(), onBefore, onReturn, onThrows, beforeInvoke, afterInvoke, throwInvoke); + } + + public void bind(String args) throws Throwable { + initSpy(); + Configure configure = Configure.toConfigure(args); + bind(configure); + } + /** * Bootstrap arthas server * @@ -120,7 +139,7 @@ public class ArthasBootstrap { try { ShellServerOptions options = new ShellServerOptions() .setInstrumentation(instrumentation) - .setPid(pid) + .setPid(PidUtils.currentLongPid()) .setSessionTimeout(configure.getSessionTimeout() * 1000); if (agentId != null) { @@ -208,9 +227,9 @@ public class ArthasBootstrap { * @param instrumentation JVM增强 * @return ArthasServer单例 */ - public synchronized static ArthasBootstrap getInstance(int javaPid, Instrumentation instrumentation) { + public synchronized static ArthasBootstrap getInstance(Instrumentation instrumentation) { if (arthasBootstrap == null) { - arthasBootstrap = new ArthasBootstrap(javaPid, instrumentation); + arthasBootstrap = new ArthasBootstrap(instrumentation); } return arthasBootstrap; } diff --git a/core/src/main/java/com/taobao/arthas/core/shell/ShellServerOptions.java b/core/src/main/java/com/taobao/arthas/core/shell/ShellServerOptions.java index 5ebc5d2c7..1b425c120 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/ShellServerOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/ShellServerOptions.java @@ -34,7 +34,7 @@ public class ShellServerOptions { private long sessionTimeout; private long reaperInterval; private long connectionTimeout; - private int pid; + private long pid; private Instrumentation instrumentation; public ShellServerOptions() { @@ -98,7 +98,7 @@ public class ShellServerOptions { return this; } - public ShellServerOptions setPid(int pid) { + public ShellServerOptions setPid(long pid) { this.pid = pid; return this; } @@ -108,7 +108,7 @@ public class ShellServerOptions { return this; } - public int getPid() { + public long getPid() { return pid; } diff --git a/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellImpl.java b/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellImpl.java index 883dd9584..01120c4ea 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellImpl.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellImpl.java @@ -19,7 +19,6 @@ import com.taobao.arthas.core.shell.system.JobController; import com.taobao.arthas.core.shell.system.impl.InternalCommandManager; import com.taobao.arthas.core.shell.system.impl.JobControllerImpl; import com.taobao.arthas.core.shell.term.Term; -import com.taobao.arthas.core.util.Constants; import com.taobao.arthas.core.util.LogUtil; import com.taobao.middleware.logger.Logger; @@ -49,7 +48,7 @@ public class ShellImpl implements Shell { private String prompt; public ShellImpl(ShellServer server, Term term, InternalCommandManager commandManager, - Instrumentation instrumentation, int pid, JobControllerImpl jobController) { + Instrumentation instrumentation, long pid, JobControllerImpl jobController) { session.put(Session.COMMAND_MANAGER, commandManager); session.put(Session.INSTRUMENTATION, instrumentation); session.put(Session.PID, pid); diff --git a/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellServerImpl.java b/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellServerImpl.java index e9730b42f..444e42e58 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellServerImpl.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellServerImpl.java @@ -50,7 +50,7 @@ public class ShellServerImpl extends ShellServer { private String welcomeMessage; private ArthasBootstrap bootstrap; private Instrumentation instrumentation; - private int pid; + private long pid; private boolean closed = true; private final Map sessions; private final Future sessionsClosed = Future.future(); diff --git a/core/src/main/java/com/taobao/arthas/core/shell/session/Session.java b/core/src/main/java/com/taobao/arthas/core/shell/session/Session.java index 375799f34..5242a684e 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/session/Session.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/session/Session.java @@ -92,7 +92,7 @@ public interface Session { * * @return java pid */ - int getPid(); + long getPid(); /** * Get all registered command resolvers diff --git a/core/src/main/java/com/taobao/arthas/core/shell/session/impl/SessionImpl.java b/core/src/main/java/com/taobao/arthas/core/shell/session/impl/SessionImpl.java index 21756840a..a0a10497c 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/session/impl/SessionImpl.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/session/impl/SessionImpl.java @@ -75,8 +75,8 @@ public class SessionImpl implements Session { } @Override - public int getPid() { - return (Integer) data.get(PID); + public long getPid() { + return (Long) data.get(PID); } @Override diff --git a/core/src/main/java/com/taobao/arthas/core/util/ApplicationUtils.java b/core/src/main/java/com/taobao/arthas/core/util/ApplicationUtils.java deleted file mode 100644 index 8f17aba41..000000000 --- a/core/src/main/java/com/taobao/arthas/core/util/ApplicationUtils.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.taobao.arthas.core.util; - -import java.lang.management.ManagementFactory; - -/** - * - * @author hengyunabc 2018-09-30 - * - */ -public class ApplicationUtils { - - private static String PID = "-1"; - - static { - // https://stackoverflow.com/a/7690178 - String jvmName = ManagementFactory.getRuntimeMXBean().getName(); - int index = jvmName.indexOf('@'); - - if (index > 0) { - try { - PID = Long.toString(Long.parseLong(jvmName.substring(0, index))); - } catch (Throwable e) { - // ignore - } - } - } - - public static String getPid() { - return PID; - } - -} diff --git a/core/src/main/java/com/taobao/arthas/core/util/Constants.java b/core/src/main/java/com/taobao/arthas/core/util/Constants.java index c56265a97..bd80e310b 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/Constants.java +++ b/core/src/main/java/com/taobao/arthas/core/util/Constants.java @@ -2,6 +2,7 @@ package com.taobao.arthas.core.util; import java.io.File; +import com.taobao.arthas.common.PidUtils; import com.taobao.arthas.core.view.Ansi; import static com.taobao.arthas.core.util.LogUtil.LOGS_DIR; @@ -50,7 +51,7 @@ public class Constants { /** * 当前进程PID */ - public static final String PID = ApplicationUtils.getPid(); + public static final String PID = PidUtils.currentPid(); /** * 缓存目录 diff --git a/spy/src/main/java/java/arthas/Spy.java b/spy/src/main/java/java/arthas/Spy.java index 2af7389d4..f4f7692d2 100644 --- a/spy/src/main/java/java/arthas/Spy.java +++ b/spy/src/main/java/java/arthas/Spy.java @@ -48,28 +48,6 @@ public class Spy { THROW_INVOKING_METHOD = throwInvokingMethod; } - /** - * 用于启动线程初始化 - */ - public static void initForAgentLauncher( - ClassLoader classLoader, - Method onBeforeMethod, - Method onReturnMethod, - Method onThrowsMethod, - Method beforeInvokingMethod, - Method afterInvokingMethod, - Method throwInvokingMethod, - Method agentResetMethod) { - CLASSLOADER = classLoader; - ON_BEFORE_METHOD = onBeforeMethod; - ON_RETURN_METHOD = onReturnMethod; - ON_THROWS_METHOD = onThrowsMethod; - BEFORE_INVOKING_METHOD = beforeInvokingMethod; - AFTER_INVOKING_METHOD = afterInvokingMethod; - THROW_INVOKING_METHOD = throwInvokingMethod; - AGENT_RESET_METHOD = agentResetMethod; - } - /** * Clean up the reference to com.taobao.arthas.agent.AgentLauncher$1 * to avoid classloader leak.