Skip to content

Commit ba2a8e5

Browse files
committedDec 3, 2021
8278205: jlink plugins should dump .class file in debug mode
Reviewed-by: jlaskey
1 parent 18c54b4 commit ba2a8e5

File tree

5 files changed

+41
-6
lines changed

5 files changed

+41
-6
lines changed
 

‎src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878
* ## Should use jdk.joptsimple some day.
7979
*/
8080
public class JlinkTask {
81-
static final boolean DEBUG = Boolean.getBoolean("jlink.debug");
81+
public static final boolean DEBUG = Boolean.getBoolean("jlink.debug");
8282

8383
// jlink API ignores by default. Remove when signing is implemented.
8484
static final boolean IGNORE_SIGNING_DEFAULT = true;

‎src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/AbstractPlugin.java

+35
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,16 @@
2626
package jdk.tools.jlink.internal.plugins;
2727

2828
import jdk.tools.jlink.plugin.Plugin;
29+
import jdk.tools.jlink.internal.JlinkTask;
2930

31+
import java.io.File;
32+
import java.io.IOException;
33+
import java.nio.file.Files;
34+
import java.nio.file.Paths;
3035
import java.util.Locale;
3136
import java.util.MissingResourceException;
3237
import java.util.ResourceBundle;
38+
import jdk.internal.org.objectweb.asm.ClassReader;
3339

3440
public abstract class AbstractPlugin implements Plugin {
3541

@@ -61,6 +67,35 @@ protected AbstractPlugin(String name, ResourceBundle bundle) {
6167
this.name = name;
6268
this.pluginsBundle = bundle;
6369
}
70+
71+
private void dumpClassFile(String path, byte[] buf) {
72+
try {
73+
String fullPath = String.format("%d-%s%s%s",
74+
ProcessHandle.current().pid(),
75+
getName(), File.separator,
76+
path.replace('/', File.separatorChar));
77+
System.err.printf("Dumping class file %s\n", fullPath);
78+
new File(fullPath.substring(0, fullPath.lastIndexOf('/'))).mkdirs();
79+
Files.write(Paths.get(fullPath), buf);
80+
} catch (IOException ioExp) {
81+
System.err.println("writing " + path + " failed");
82+
ioExp.printStackTrace();
83+
}
84+
}
85+
86+
protected ClassReader newClassReader(String path, byte[] buf) {
87+
try {
88+
return new ClassReader(buf);
89+
} catch (IllegalArgumentException iae) {
90+
if (JlinkTask.DEBUG) {
91+
System.err.printf("Failed to parse class file: %s\n", path);
92+
iae.printStackTrace();
93+
dumpClassFile(path, buf);
94+
}
95+
throw iae;
96+
}
97+
}
98+
6499
@Override
65100
public String getName() {
66101
return name;

‎src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
158158
if (resource != null &&
159159
resource.type().equals(ResourcePoolEntry.Type.CLASS_OR_RESOURCE)) {
160160
byte[] bytes = resource.contentBytes();
161-
ClassReader cr = new ClassReader(bytes);
161+
ClassReader cr = newClassReader(path, bytes);
162162
if (Arrays.stream(cr.getInterfaces())
163163
.anyMatch(i -> i.contains(METAINFONAME)) &&
164164
stripUnsupportedLocales(bytes, cr)) {

‎src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripJavaDebugAttributesPlugin.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
5959
if (path.endsWith("module-info.class")) {
6060
// XXX. Do we have debug info? Is Asm ready for module-info?
6161
} else {
62-
ClassReader reader = new ClassReader(resource.contentBytes());
62+
ClassReader reader = newClassReader(path, resource.contentBytes());
6363
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
6464
reader.accept(writer, ClassReader.SKIP_DEBUG);
6565
byte[] content = writer.toByteArray();

‎src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/VersionPropsPlugin.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ public void configure(Map<String, String> config) {
9696

9797
private boolean redefined = false;
9898

99-
private byte[] redefine(byte[] classFile) {
99+
private byte[] redefine(String path, byte[] classFile) {
100100

101-
var cr = new ClassReader(classFile);
101+
var cr = newClassReader(path, classFile);
102102
var cw = new ClassWriter(0);
103103

104104
cr.accept(new ClassVisitor(Opcodes.ASM7, cw) {
@@ -189,7 +189,7 @@ public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
189189
in.transformAndCopy(res -> {
190190
if (res.type().equals(ResourcePoolEntry.Type.CLASS_OR_RESOURCE)) {
191191
if (res.path().equals(VERSION_PROPS_CLASS)) {
192-
return res.copyWithContent(redefine(res.contentBytes()));
192+
return res.copyWithContent(redefine(res.path(), res.contentBytes()));
193193
}
194194
}
195195
return res;

0 commit comments

Comments
 (0)
Please sign in to comment.