Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions decompiler_agent/src/main/java/org/jrd/agent/AgentLogger.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -123,14 +125,33 @@ public void getClasses(BlockingQueue<String> 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);
}
Expand Down Expand Up @@ -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;
Expand Down
22 changes: 11 additions & 11 deletions decompiler_agent/src/main/java/org/jrd/agent/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -58,7 +58,7 @@ public static void premain(String agentArgs, Instrumentation inst) throws Except
InstrumentationProvider p = AccessController.doPrivileged(new PrivilegedAction<InstrumentationProvider>() {
@Override
public InstrumentationProvider run() {
InstrumentationProvider p = new InstrumentationProvider(inst, transformer, lonelinessCopy);
InstrumentationProvider p = new InstrumentationProvider(inst, transformer, lonelinessCopy, agentArgs);
return p;
}
});
Expand Down Expand Up @@ -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);
}
}

Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -291,8 +291,10 @@ private static void addJustClass(String s, List<String> 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)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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() {
Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,13 @@ public static List<ClassInfo> 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());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(".");
Expand Down Expand Up @@ -856,6 +856,20 @@ private boolean matchesAny(List<ClassInfo> 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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,23 @@ public class ClassListRenderer extends JPanel implements ListCellRenderer<ClassI
JLabel name;
JLabel location;
JLabel classLoader;
JLabel module;
JLabel moduleLoader;
boolean doShowInfo;

public ClassListRenderer() {
name = new JLabel();
location = new JLabel();
classLoader = new JLabel();
module = new JLabel();
moduleLoader = new JLabel();

Font infoFont = location.getFont().deriveFont(10.0F);

location.setFont(infoFont);
classLoader.setFont(infoFont);
module.setFont(infoFont);
moduleLoader.setFont(infoFont);

this.setLayout(new GridBagLayout());

Expand All @@ -51,6 +57,14 @@ public ClassListRenderer() {
gbc.gridy = 2;
this.add(classLoader, gbc);

gbc.weighty = 0.5;
gbc.gridy = 3;
this.add(module, gbc);

gbc.weighty = 0.5;
gbc.gridy = 4;
this.add(moduleLoader, gbc);

this.setBorder(new EtchedBorder(EtchedBorder.LOWERED));
}

Expand All @@ -63,15 +77,18 @@ public Component getListCellRendererComponent(
if (doShowInfo) {
location.setText("Location: " + classInfo.getLocation() + " "); // trailing space to prevent font cutoff
location.setVisible(true);

classLoader.setText("Class loader: " + classInfo.getClassLoader() + " ");
classLoader.setVisible(true);

module.setText("Module: " + classInfo.getModule() + " ");
module.setVisible(true);
moduleLoader.setText("Module loader: " + classInfo.getModuleLoader() + " ");
moduleLoader.setVisible(true);
this.setPreferredSize(null);
} else {
location.setVisible(false);
classLoader.setVisible(false);

module.setVisible(false);
moduleLoader.setVisible(false);
this.setPreferredSize(null);
}

Expand Down