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 ddf9923b3..8cc68d96c 100644 --- a/agent/src/main/java/com/taobao/arthas/agent/AgentBootstrap.java +++ b/agent/src/main/java/com/taobao/arthas/agent/AgentBootstrap.java @@ -5,6 +5,7 @@ import java.io.*; import java.lang.instrument.Instrumentation; import java.lang.reflect.Method; import java.net.URL; +import java.net.URLDecoder; import java.util.jar.JarFile; /** @@ -92,10 +93,11 @@ public class AgentBootstrap { Spy.initForAgentLauncher(classLoader, onBefore, onReturn, onThrows, beforeInvoke, afterInvoke, throwInvoke, reset); } - private static synchronized void main(final String args, final Instrumentation inst) { + private static synchronized void main(String args, final Instrumentation inst) { try { ps.println("Arthas server agent start..."); // 传递的args参数分两个部分:agentJar路径和agentArgs, 分别是Agent的JAR包路径和期望传递到服务端的参数 + args = decodeArg(args); int index = args.indexOf(';'); String agentJar = args.substring(0, index); final String agentArgs = args.substring(index, args.length()); @@ -172,4 +174,12 @@ public class AgentBootstrap { } ps.println("Arthas server already bind."); } + + private static String decodeArg(String arg) { + try { + return URLDecoder.decode(arg, "utf-8"); + } catch (UnsupportedEncodingException e) { + return arg; + } + } } 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 59b99a4e9..fff39bd3a 100644 --- a/boot/src/main/java/com/taobao/arthas/boot/Bootstrap.java +++ b/boot/src/main/java/com/taobao/arthas/boot/Bootstrap.java @@ -6,6 +6,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; +import java.net.URLDecoder; import java.security.CodeSource; import java.util.ArrayList; import java.util.Arrays; @@ -340,6 +341,8 @@ public class Bootstrap { if (codeSource != null) { String bootJarPath = codeSource.getLocation().getFile(); try { + //convert unicode path to normal path + bootJarPath = URLDecoder.decode(bootJarPath, "utf-8"); verifyArthasHome(new File(bootJarPath).getParent()); arthasHomeDir = new File(bootJarPath).getParentFile(); } catch (Exception 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 83a5ef4fd..049e84302 100644 --- a/core/src/main/java/com/taobao/arthas/core/Arthas.java +++ b/core/src/main/java/com/taobao/arthas/core/Arthas.java @@ -11,6 +11,8 @@ import com.taobao.middleware.cli.CommandLine; import com.taobao.middleware.cli.Option; import com.taobao.middleware.cli.TypedOption; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.Arrays; import java.util.Properties; @@ -85,8 +87,12 @@ public class Arthas { } } - virtualMachine.loadAgent(configure.getArthasAgent(), - configure.getArthasCore() + ";" + configure.toString()); + String arthasAgentPath = configure.getArthasAgent(); + //convert jar path to unicode string + configure.setArthasAgent(encodeArg(arthasAgentPath)); + configure.setArthasCore(encodeArg(configure.getArthasCore())); + virtualMachine.loadAgent(arthasAgentPath, + configure.getArthasCore() + ";" + configure.toString()); } finally { if (null != virtualMachine) { virtualMachine.detach(); @@ -94,6 +100,13 @@ public class Arthas { } } + private static String encodeArg(String arg) { + try { + return URLEncoder.encode(arg, "utf-8"); + } catch (UnsupportedEncodingException e) { + return arg; + } + } public static void main(String[] args) { try {