Skip to content

Commit 3af1241

Browse files
committed
Organize imports, clean up tests
1 parent 2390a76 commit 3af1241

15 files changed

Lines changed: 232 additions & 176 deletions

Code/ChroniclerJ/src/main/java/edu/columbia/cs/psl/chroniclerj/ChroniclerJExportRunner.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ public static void genTestCase(String name) {
4747
try {
4848
hasLoggedError = true;
4949
File logFile = new File((nameOverride == null ? name : nameOverride));
50+
if(!logFile.getParentFile().exists())
51+
logFile.getParentFile().mkdirs();
5052
if(logFile.exists())
5153
logFile.delete();
5254
Manifest manifest = new Manifest();

Code/ChroniclerJ/src/main/java/edu/columbia/cs/psl/chroniclerj/Instrumenter.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
import java.net.URLClassLoader;
1313
import java.nio.channels.FileChannel;
1414
import java.util.Enumeration;
15-
import java.util.HashMap;
16-
import java.util.HashSet;
1715
import java.util.Scanner;
1816
import java.util.jar.JarEntry;
1917
import java.util.jar.JarFile;
@@ -25,13 +23,9 @@
2523
import org.apache.log4j.Logger;
2624
import org.objectweb.asm.ClassReader;
2725
import org.objectweb.asm.ClassWriter;
28-
import org.objectweb.asm.Opcodes;
29-
import org.objectweb.asm.Type;
3026
import org.objectweb.asm.commons.SerialVersionUIDAdder;
31-
import org.objectweb.asm.tree.ClassNode;
3227
import org.objectweb.asm.util.CheckClassAdapter;
3328

34-
import edu.columbia.cs.psl.chroniclerj.struct.AnnotatedMethod;
3529
import edu.columbia.cs.psl.chroniclerj.visitor.CallbackDuplicatingClassVisitor;
3630
import edu.columbia.cs.psl.chroniclerj.visitor.NonDeterministicLoggingClassVisitor;
3731

@@ -85,8 +79,8 @@ private static byte[] instrumentClass(InputStream is) {
8579

8680
ClassWriter cw = new InstrumenterClassWriter(cr, ClassWriter.COMPUTE_MAXS
8781
| ClassWriter.COMPUTE_FRAMES, loader);
88-
NonDeterministicLoggingClassVisitor cv = new NonDeterministicLoggingClassVisitor(cw);
89-
CallbackDuplicatingClassVisitor callbackDuplicator = new CallbackDuplicatingClassVisitor(cv);
82+
NonDeterministicLoggingClassVisitor cv = new NonDeterministicLoggingClassVisitor(cw, false);
83+
CallbackDuplicatingClassVisitor callbackDuplicator = new CallbackDuplicatingClassVisitor(cv, false);
9084

9185
cr.accept(callbackDuplicator, ClassReader.EXPAND_FRAMES);
9286
lastInstrumentedClass = cv.getClassName();

Code/ChroniclerJ/src/main/java/edu/columbia/cs/psl/chroniclerj/PreMain.java

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.io.File;
44
import java.io.FileInputStream;
55
import java.io.FileOutputStream;
6-
import java.io.FileWriter;
76
import java.io.IOException;
87
import java.io.PrintWriter;
98
import java.lang.instrument.ClassFileTransformer;
@@ -13,9 +12,13 @@
1312
import java.util.Scanner;
1413

1514
import org.objectweb.asm.ClassReader;
15+
import org.objectweb.asm.ClassVisitor;
1616
import org.objectweb.asm.ClassWriter;
17+
import org.objectweb.asm.MethodVisitor;
1718
import org.objectweb.asm.Opcodes;
19+
import org.objectweb.asm.commons.JSRInlinerAdapter;
1820
import org.objectweb.asm.commons.SerialVersionUIDAdder;
21+
import org.objectweb.asm.tree.ClassNode;
1922
import org.objectweb.asm.util.CheckClassAdapter;
2023
import org.objectweb.asm.util.TraceClassVisitor;
2124

@@ -26,7 +29,16 @@
2629

2730
public class PreMain {
2831
static boolean replay;
32+
private static final class HackyClassWriter extends ClassWriter {
2933

34+
private HackyClassWriter(ClassReader classReader, int flags) {
35+
super(classReader, flags);
36+
}
37+
38+
protected String getCommonSuperClass(String type1, String type2) {
39+
return "java/lang/Object";
40+
}
41+
}
3042
static class ChroniclerTransformer implements ClassFileTransformer {
3143
@Override
3244
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
@@ -54,15 +66,35 @@ public byte[] transform(ClassLoader loader, String className, Class<?> classBein
5466
return null;
5567
}
5668
} else {
57-
try {
58-
ClassReader cr = new ClassReader(classfileBuffer);
59-
if (isIgnoredClass(cr.getClassName()))
60-
return null;
61-
if (DEBUG)
62-
System.out.println("Inst: " + cr.getClassName());
69+
ClassReader cr = new ClassReader(classfileBuffer);
70+
if (isIgnoredClass(cr.getClassName()))
71+
return null;
72+
if (DEBUG)
73+
System.out.println("Inst: " + cr.getClassName());
74+
75+
boolean skipFrames = false;
76+
ClassNode cn = new ClassNode();
77+
cr.accept(cn, ClassReader.SKIP_CODE);
78+
if (cn.version >= 100 || cn.version <= 50 || className.endsWith("$Access4JacksonSerializer") || className.endsWith("$Access4JacksonDeSerializer"))
79+
skipFrames = true;
80+
81+
if(skipFrames)
82+
{
83+
//This class is old enough to not guarantee frames. Generate new frames for analysis reasons, then make sure to not emit ANY frames.
84+
ClassWriter cw = new HackyClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
85+
cr.accept(new ClassVisitor(Opcodes.ASM5, cw) {
86+
@Override
87+
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
88+
return new JSRInlinerAdapter(super.visitMethod(access, name, desc, signature, exceptions), access, name, desc, signature, exceptions);
89+
}
90+
}, 0);
91+
cr = new ClassReader(cw.toByteArray());
92+
}
93+
94+
try {
6395
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
64-
NonDeterministicLoggingClassVisitor cv = new NonDeterministicLoggingClassVisitor(new SerialVersionUIDAdder(cw));
65-
CallbackDuplicatingClassVisitor callbackDuplicator = new CallbackDuplicatingClassVisitor(cv);
96+
NonDeterministicLoggingClassVisitor cv = new NonDeterministicLoggingClassVisitor(new SerialVersionUIDAdder(cw), skipFrames);
97+
CallbackDuplicatingClassVisitor callbackDuplicator = new CallbackDuplicatingClassVisitor(cv, skipFrames);
6698

6799
cr.accept(callbackDuplicator, ClassReader.EXPAND_FRAMES);
68100
if (DEBUG) {
@@ -89,11 +121,10 @@ public byte[] transform(ClassLoader loader, String className, Class<?> classBein
89121
fos.write(classfileBuffer);
90122
fos.close();
91123
fw = new PrintWriter("lastClass.txt");
92-
ClassReader cr = new ClassReader(classfileBuffer);
93-
124+
94125
tcv = new TraceClassVisitor(fw);
95-
NonDeterministicLoggingClassVisitor cv = new NonDeterministicLoggingClassVisitor(new SerialVersionUIDAdder(tcv));
96-
CallbackDuplicatingClassVisitor callbackDuplicator = new CallbackDuplicatingClassVisitor(cv);
126+
NonDeterministicLoggingClassVisitor cv = new NonDeterministicLoggingClassVisitor(new SerialVersionUIDAdder(tcv), skipFrames);
127+
CallbackDuplicatingClassVisitor callbackDuplicator = new CallbackDuplicatingClassVisitor(cv, skipFrames);
97128

98129
cr.accept(callbackDuplicator, ClassReader.EXPAND_FRAMES);
99130

@@ -154,20 +185,20 @@ else if (d[0].equals("failsafe")) {
154185
String testClass = null;
155186
while (s.hasNextLine()) {
156187
String line = s.nextLine();
157-
if (line.startsWith("tc.")) {
158-
testClass = line.split("=")[1];
188+
if (line.startsWith("forkTestSet=java.lang.Class|")) {
189+
testClass = line.substring("forkTestSet=java.lang.Class|".length());
159190
break;
160191
}
161192
}
162193
s.close();
163194
if (testClass == null)
164195
throw new IOException("Couldn't find test config");
165196
if (replay) {
166-
ChroniclerJExportRunner.nameOverride = "target/"+testClass + ".crash";
197+
ChroniclerJExportRunner.nameOverride = "target/replays/"+testClass + ".crash";
167198
ReplayRunner.setupLogs(new String[]{ChroniclerJExportRunner.nameOverride});
168199
} else {
169200
System.out.println("Overriding test class: " + testClass);
170-
ChroniclerJExportRunner.nameOverride = "target/"+testClass + ".crash";
201+
ChroniclerJExportRunner.nameOverride = "target/replays/"+testClass + ".crash";
171202
}
172203
} catch (IOException ex) {
173204
ex.printStackTrace();

Code/ChroniclerJ/src/main/java/edu/columbia/cs/psl/chroniclerj/replay/NonDeterministicReplayClassVisitor.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,15 @@
99
import org.objectweb.asm.ClassVisitor;
1010
import org.objectweb.asm.MethodVisitor;
1111
import org.objectweb.asm.Opcodes;
12-
import org.objectweb.asm.Type;
1312
import org.objectweb.asm.commons.AnalyzerAdapter;
1413
import org.objectweb.asm.commons.JSRInlinerAdapter;
1514
import org.objectweb.asm.commons.LocalVariablesSorter;
16-
import org.objectweb.asm.tree.ClassNode;
1715
import org.objectweb.asm.tree.FieldNode;
1816
import org.objectweb.asm.tree.MethodInsnNode;
1917
import org.objectweb.asm.util.CheckClassAdapter;
2018

2119
import edu.columbia.cs.psl.chroniclerj.Instrumenter;
2220
import edu.columbia.cs.psl.chroniclerj.MethodCall;
23-
import edu.columbia.cs.psl.chroniclerj.visitor.NonDeterministicLoggingClassVisitor;
2421

2522
public class NonDeterministicReplayClassVisitor extends ClassVisitor implements Opcodes {
2623

Code/ChroniclerJ/src/main/java/edu/columbia/cs/psl/chroniclerj/replay/NonDeterministicReplayMethodVisitor.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,20 @@
33

44
import java.util.ArrayList;
55
import java.util.HashMap;
6-
import java.util.concurrent.locks.Lock;
76

87
import org.apache.log4j.Logger;
98
import org.objectweb.asm.Label;
109
import org.objectweb.asm.MethodVisitor;
1110
import org.objectweb.asm.Opcodes;
1211
import org.objectweb.asm.Type;
13-
import org.objectweb.asm.commons.AdviceAdapter;
1412
import org.objectweb.asm.commons.AnalyzerAdapter;
1513
import org.objectweb.asm.commons.InstructionAdapter;
1614
import org.objectweb.asm.tree.MethodInsnNode;
1715

1816
import edu.columbia.cs.psl.chroniclerj.CallbackRegistry;
1917
import edu.columbia.cs.psl.chroniclerj.ChroniclerJExportRunner;
20-
import edu.columbia.cs.psl.chroniclerj.ExportedLog;
2118
import edu.columbia.cs.psl.chroniclerj.Instrumenter;
22-
import edu.columbia.cs.psl.chroniclerj.Log;
2319
import edu.columbia.cs.psl.chroniclerj.MethodCall;
24-
import edu.columbia.cs.psl.chroniclerj.struct.AnnotatedMethod;
2520
import edu.columbia.cs.psl.chroniclerj.visitor.NonDeterministicLoggingMethodVisitor;
2621

2722
public class NonDeterministicReplayMethodVisitor extends InstructionAdapter implements Opcodes {

0 commit comments

Comments
 (0)