diff --git a/decompiler_agent/src/main/java/org/jrd/agent/AgentLogger.java b/decompiler_agent/src/main/java/org/jrd/agent/AgentLogger.java index 93bfe0c9..0e1f1c69 100644 --- a/decompiler_agent/src/main/java/org/jrd/agent/AgentLogger.java +++ b/decompiler_agent/src/main/java/org/jrd/agent/AgentLogger.java @@ -39,4 +39,12 @@ public static String classLoaderId(ClassLoader cl) { return cl.toString(); } } + + public static String moduleId(Module cl) { + if (cl == null) { + return "unknown"; + } else { + return cl.getName(); + } + } } diff --git a/decompiler_agent/src/main/java/org/jrd/agent/ConnectionDelegator.java b/decompiler_agent/src/main/java/org/jrd/agent/ConnectionDelegator.java index 2da37610..c7dc5f80 100644 --- a/decompiler_agent/src/main/java/org/jrd/agent/ConnectionDelegator.java +++ b/decompiler_agent/src/main/java/org/jrd/agent/ConnectionDelegator.java @@ -46,7 +46,7 @@ public static synchronized void initialize(String hostname, Integer port, Instru initServerSocket.bind(new InetSocketAddress(hostname, port)); } catch (IOException e) { try { - Main.deregister(loneliness); + Main.deregister(loneliness, port + ""); } finally { AgentLogger.getLogger().log(new RuntimeException("Exception occurred when opening the socket: ", e)); throw e; diff --git a/decompiler_agent/src/main/java/org/jrd/agent/InstrumentationProvider.java b/decompiler_agent/src/main/java/org/jrd/agent/InstrumentationProvider.java index 0f0e7a99..66602348 100644 --- a/decompiler_agent/src/main/java/org/jrd/agent/InstrumentationProvider.java +++ b/decompiler_agent/src/main/java/org/jrd/agent/InstrumentationProvider.java @@ -25,12 +25,14 @@ public class InstrumentationProvider { private final Transformer transformer; private final Instrumentation instrumentation; private final String loneliness; + private final String origArgs; private static final String INFO_DELIMITER = "|"; - InstrumentationProvider(Instrumentation inst, Transformer transformer, String loneliness) { + InstrumentationProvider(Instrumentation inst, Transformer transformer, String loneliness, String origArgs) { this.transformer = transformer; this.instrumentation = inst; this.loneliness = loneliness; + this.origArgs = origArgs; } public void setClassBody(String cname, byte[] nwBody, String classloader) throws UnmodifiableClassException { @@ -123,14 +125,33 @@ public void getClasses(BlockingQueue queue, Boolean abort, boolean doGet if (found) { if (doGetInfo) { String location; + String module; + String moduleloader; try { location = loadedClass.getProtectionDomain().getCodeSource().getLocation().getPath(); - } catch (Exception ex) { + } catch (Throwable ex) { location = "unknown"; } + try { + module = AgentLogger.moduleId(loadedClass.getModule()); + } catch (Throwable ex) { + module = "unknown"; + } + try { + if (loadedClass.getModule() != null) { + moduleloader = AgentLogger.classLoaderId(loadedClass.getModule().getClassLoader()); + } else { + moduleloader = "unknown"; + } + } catch (Throwable ex) { + moduleloader = "unknown"; + } String classLoader; classLoader = AgentLogger.classLoaderId(loadedClass.getClassLoader()); - queue.put(className + INFO_DELIMITER + location + INFO_DELIMITER + classLoader); + queue.put( + className + INFO_DELIMITER + location + INFO_DELIMITER + classLoader + INFO_DELIMITER + module + + INFO_DELIMITER + moduleloader + ); } else { queue.put(className); } @@ -177,7 +198,7 @@ public int cleanOverrides(String pattern) { } public void detach() { - Main.deregister(loneliness); + Main.deregister(loneliness, origArgs); cleanOverrides(".*"); //optional? instrumentation.removeTransformer(transformer); int loader = Integer.parseInt(System.getProperty(Main.JRD_AGENT_LOADED, "0")) - 1; diff --git a/decompiler_agent/src/main/java/org/jrd/agent/Main.java b/decompiler_agent/src/main/java/org/jrd/agent/Main.java index b89e9c96..6770ba15 100644 --- a/decompiler_agent/src/main/java/org/jrd/agent/Main.java +++ b/decompiler_agent/src/main/java/org/jrd/agent/Main.java @@ -41,7 +41,7 @@ private Main() { * @param agentArgs arguments with parameters for listener * @param inst instance of instrumentation of given VM */ - public static void premain(String agentArgs, Instrumentation inst) throws Exception { + public static void premain(final String agentArgs, Instrumentation inst) throws Exception { String hostname = null; Integer port = null; final String loneliness; @@ -58,7 +58,7 @@ public static void premain(String agentArgs, Instrumentation inst) throws Except InstrumentationProvider p = AccessController.doPrivileged(new PrivilegedAction() { @Override public InstrumentationProvider run() { - InstrumentationProvider p = new InstrumentationProvider(inst, transformer, lonelinessCopy); + InstrumentationProvider p = new InstrumentationProvider(inst, transformer, lonelinessCopy, agentArgs); return p; } }); @@ -95,17 +95,17 @@ public static void agentmain(String args, Instrumentation inst) throws Exception premain(args, inst); } - public static void deregister(String loneliness) { + public static void deregister(String loneliness, String port) { if (loneliness.equals(LONELINESS_VAL_S)) { confirmedAttaches--; - System.err.println("Removed JRD agent: " + loneliness); + System.err.println("Removed JRD agent: " + loneliness + "/" + port); } else if (loneliness.equals(LONELINESS_VAL_A)) { - System.err.println("Removed JRD agent: " + loneliness); + System.err.println("Removed JRD agent: " + loneliness + "/" + port); } else if (loneliness.equals(LONELINESS_VAL_F)) { confirmedAttaches--; - System.err.println("Removed JRD agent: " + loneliness); + System.err.println("Removed JRD agent: " + loneliness + "/" + port); } else if (loneliness.equals(LONELINESS_VAL_AF)) { - System.err.println("Removed JRD agent: " + loneliness); + System.err.println("Removed JRD agent: " + loneliness + "/" + port); } } @@ -123,18 +123,18 @@ private static String checkLonelienss(String agentArgs) { if (confirmedAttaches != 0) { throw new RuntimeException("Main : attempting to load JRD agent more than once in mode: " + loneliness); } - System.err.println("Added JRD agent: " + loneliness); + System.err.println("Added JRD agent: " + loneliness + "/" + agentArgs); confirmedAttaches++; } else if (loneliness.equals(LONELINESS_VAL_A)) { if (confirmedAttaches != 0) { throw new RuntimeException("Main : attempting to load JRD agent more than once in mode: " + loneliness); } - System.err.println("Added JRD agent: " + loneliness); + System.err.println("Added JRD agent: " + loneliness + "/" + agentArgs); } else if (loneliness.equals(LONELINESS_VAL_F)) { confirmedAttaches++; - System.err.println("Added JRD agent: " + loneliness); + System.err.println("Added JRD agent: " + loneliness + "/" + agentArgs); } else if (loneliness.equals(LONELINESS_VAL_AF)) { - System.err.println("Added JRD agent: " + loneliness); + System.err.println("Added JRD agent: " + loneliness + "/" + agentArgs); } return loneliness; } diff --git a/runtime-decompiler/src/main/java/org/jrd/backend/communication/FsAgent.java b/runtime-decompiler/src/main/java/org/jrd/backend/communication/FsAgent.java index e7f7af7e..080d5ccc 100644 --- a/runtime-decompiler/src/main/java/org/jrd/backend/communication/FsAgent.java +++ b/runtime-decompiler/src/main/java/org/jrd/backend/communication/FsAgent.java @@ -291,8 +291,10 @@ private static void addJustClass(String s, List classes, String root, bo if (s.endsWith(".class")) { if (details) { classes.add( - new ClassInfo(toClass(s.substring(root.length() + 1)), detailsPath, "class order in realvm may differ") - .toAgentLikeAnswer() + new ClassInfo( + toClass(s.substring(root.length() + 1)), detailsPath, "class order in realvm may differ", "unknown", + "unknown" + ).toAgentLikeAnswer() ); } else { classes.add(toClass(s.substring(root.length() + 1))); diff --git a/runtime-decompiler/src/main/java/org/jrd/backend/core/ClassInfo.java b/runtime-decompiler/src/main/java/org/jrd/backend/core/ClassInfo.java index d2c0d670..0e8dd2bc 100644 --- a/runtime-decompiler/src/main/java/org/jrd/backend/core/ClassInfo.java +++ b/runtime-decompiler/src/main/java/org/jrd/backend/core/ClassInfo.java @@ -7,15 +7,18 @@ public class ClassInfo { private String name; private String location; private String classLoader; + private String module; + private String moduleLoader; private static final String INFO_DELIMITER_STRING = "|"; private static final Pattern INFO_DELIMITER_PATTERN = Pattern.compile("\\" + INFO_DELIMITER_STRING); - public ClassInfo(String name, String location, String classLoader) { + public ClassInfo(String name, String location, String classLoader, String module, String moduleLoader) { this.name = name; this.location = location; this.classLoader = classLoader; - + this.module = module; + this.moduleLoader = moduleLoader; } public ClassInfo(String classString) { @@ -33,6 +36,16 @@ public ClassInfo(String classString) { } else { // backwards compatibility this.classLoader = "unknown"; } + if (splitClassString.length >= 4 && !splitClassString[3].trim().isEmpty()) { + this.module = splitClassString[3]; + } else { // backwards compatibility + this.module = "unknown"; + } + if (splitClassString.length >= 5 && !splitClassString[4].trim().isEmpty()) { + this.moduleLoader = splitClassString[4]; + } else { // backwards compatibility + this.moduleLoader = "unknown"; + } } public String toAgentLikeAnswer() { @@ -59,6 +72,14 @@ public String getClassLoader() { return classLoader; } + public String getModule() { + return module; + } + + public String getModuleLoader() { + return moduleLoader; + } + public String getSearchableString(boolean isLocationVisible) { return isLocationVisible ? (name + " " + location + " " + classLoader) : name; } diff --git a/runtime-decompiler/src/main/java/org/jrd/backend/data/cli/Lib.java b/runtime-decompiler/src/main/java/org/jrd/backend/data/cli/Lib.java index 24f7e5de..f0841682 100644 --- a/runtime-decompiler/src/main/java/org/jrd/backend/data/cli/Lib.java +++ b/runtime-decompiler/src/main/java/org/jrd/backend/data/cli/Lib.java @@ -168,13 +168,13 @@ public static List obtainFilteredClasses( .collect(Collectors.toList()); } else { allClasses = Arrays.stream(searchClasses(vmInfo, vmManager, ecodedSearch, filter.get(0).pattern(), classloader)) - .map(a -> new ClassInfo(a, null, null)).collect(Collectors.toList()); + .map(a -> new ClassInfo(a, null, null, null, null)).collect(Collectors.toList()); } } else { if (details) { allClasses = Arrays.stream(obtainClassesDetails(vmInfo, vmManager, classloader)).collect(Collectors.toList()); } else { - allClasses = Arrays.stream(obtainClasses(vmInfo, vmManager, classloader)).map(a -> new ClassInfo(a, null, null)) + allClasses = Arrays.stream(obtainClasses(vmInfo, vmManager, classloader)).map(a -> new ClassInfo(a, null, null, null, null)) .collect(Collectors.toList()); } } diff --git a/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/BytecodeDecompilerView.java b/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/BytecodeDecompilerView.java index d0eb9cac..2dd3b014 100644 --- a/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/BytecodeDecompilerView.java +++ b/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/BytecodeDecompilerView.java @@ -148,7 +148,7 @@ public class BytecodeDecompilerView { private DependenciesReader dependenciesReader; private ClassInfo[] loadedClasses; - private ClassInfo lastDecompiledClass = new ClassInfo("", "unknown", "unknown"); + private ClassInfo lastDecompiledClass = new ClassInfo("", "unknown", "unknown", "unknown", "unknown"); private String lastFqn = "java.lang.Override"; private String lastAddedFqn = "fully.qualified.name"; private File lastAddedFile = new File("."); @@ -856,6 +856,20 @@ private boolean matchesAny(List filtered, Pattern p, ClassInfo clazz) return true; } } + if (clazz.getModule() != null) { + Matcher m = p.matcher(clazz.getModule()); + if (m.matches()) { + filtered.add(clazz); + return true; + } + } + if (clazz.getModuleLoader() != null) { + Matcher m = p.matcher(clazz.getModuleLoader()); + if (m.matches()) { + filtered.add(clazz); + return true; + } + } return false; } diff --git a/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/ClassOverwriter.java b/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/ClassOverwriter.java index 711c167a..a1e6939b 100644 --- a/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/ClassOverwriter.java +++ b/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/ClassOverwriter.java @@ -18,7 +18,7 @@ void overwriteClass(DecompilerWrapper selectedDecompiler, ClassInfo name, String if (name == null) { throw new RuntimeException("null name, in overwriteClass"); } else if (name.getName() == null || name.getName().trim().isEmpty()) { - name = new ClassInfo("???", name.getLocation(), name.getClassLoader()); + name = new ClassInfo("???", name.getLocation(), name.getClassLoader(), "???", "???"); } final OverwriteClassDialog overwriteClassDialog = new OverwriteClassDialog( diff --git a/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/DecompilationController.java b/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/DecompilationController.java index e5208026..2b5e9053 100644 --- a/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/DecompilationController.java +++ b/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/decompilerview/DecompilationController.java @@ -332,7 +332,7 @@ private void cleanup(boolean halt) { mainFrameView.switchPanel(false); mainFrameView.getBytecodeDecompilerView().reloadClassList(new ClassInfo[0]); mainFrameView.getBytecodeDecompilerView() - .reloadTextField(new ClassInfo("", "", ""), "", new byte[16], "", new byte[16], null, null); + .reloadTextField(new ClassInfo("", "", "", "", ""), "", new byte[16], "", new byte[16], null, null); if (halt) { haltAgent(); } diff --git a/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/renderer/ClassListRenderer.java b/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/renderer/ClassListRenderer.java index e9a111a0..095807fc 100644 --- a/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/renderer/ClassListRenderer.java +++ b/runtime-decompiler/src/main/java/org/jrd/frontend/frame/main/renderer/ClassListRenderer.java @@ -18,17 +18,23 @@ public class ClassListRenderer extends JPanel implements ListCellRenderer