diff --git a/TracerOnJavassist/src/tracer/ITraceGenerator.java b/TracerOnJavassist/src/tracer/ITraceGenerator.java index 6257f2f..fb25890 100644 --- a/TracerOnJavassist/src/tracer/ITraceGenerator.java +++ b/TracerOnJavassist/src/tracer/ITraceGenerator.java @@ -4,6 +4,7 @@ import javassist.CtBehavior; import javassist.CtClass; +import javassist.CtMethod; /** * �g���[�X�o�͂��s�����s��������̃t�H�[�}�b�g�ˑ����� @@ -39,4 +40,8 @@ public abstract String generateReplaceStatementsForNewArray( String arrayClass, String arrayObject, String dimension, String threadId, String timeStamp); + + public abstract String generateInsertStatementsForBlockEntry( + CtMethod m, String blockId, String incomings, + String threadId, String timeStamp); } diff --git a/TracerOnJavassist/src/tracer/JSONTraceGenerator.java b/TracerOnJavassist/src/tracer/JSONTraceGenerator.java index da164d9..d6deebd 100644 --- a/TracerOnJavassist/src/tracer/JSONTraceGenerator.java +++ b/TracerOnJavassist/src/tracer/JSONTraceGenerator.java @@ -7,6 +7,7 @@ import javassist.CtBehavior; import javassist.CtClass; import javassist.CtConstructor; +import javassist.CtMethod; /** * JSON�g���[�X�o�͗p�̎��s�������� @@ -29,8 +30,8 @@ keys.add("value"); values.add(generateJSONObjectGenerator(valueClass, valueObject)); keys.add("threadId"); values.add(threadId); keys.add("time"); values.add(timeStamp); - return "{$proceed($$); " + - "tracer.MyPrintStream.println(" + generateJSONMapGenerator(keys, values) + " + \",\");}"; + return "$proceed($$); " + + "tracer.MyPrintStream.println(" + generateJSONMapGenerator(keys, values) + " + \",\");"; } @Override @@ -48,8 +49,8 @@ keys.add("value"); values.add(generateJSONObjectGenerator(valueClass, valueObject)); keys.add("threadId"); values.add(threadId); keys.add("time"); values.add(timeStamp); - return "{$_ = $proceed(); " + - "tracer.MyPrintStream.println(" + generateJSONMapGenerator(keys, values) + " + \",\");}"; + return "$_ = $proceed(); " + + "tracer.MyPrintStream.println(" + generateJSONMapGenerator(keys, values) + " + \",\");"; } @@ -64,8 +65,8 @@ keys.add("dimension"); values.add(dimension); keys.add("threadId"); values.add(threadId); keys.add("time"); values.add(timeStamp); - return "{$_ = $proceed($$); " + - "tracer.MyPrintStream.println(" + generateJSONMapGenerator(keys, values) + " + \",\");}"; + return "$_ = $proceed($$); " + + "tracer.MyPrintStream.println(" + generateJSONMapGenerator(keys, values) + " + \",\");"; } @Override @@ -118,6 +119,23 @@ keys.add("time"); values.add(timeStamp); return "tracer.MyPrintStream.println(" + generateJSONMapGenerator(keys, values) + " + \",\");"; } + + @Override + public String generateInsertStatementsForBlockEntry( + CtMethod m, String blockId, String incomings, + String threadId, String timeStamp) { + ArrayList keys = new ArrayList<>(); + ArrayList values = new ArrayList<>(); + keys.add("type"); values.add(DQ_GEN + " + \"blockEntry\" + " + DQ_GEN); + keys.add("methodSignature"); values.add(DQ_GEN + " + \"" + m.getLongName().replace('$', '.') + "\" + " + DQ_GEN); // AspectJ�ł̓��\�b�h�V�O�j�`�����ł͖����N���X�̓h�b�g�ŋ�؂��� + keys.add("blockId"); values.add(blockId); +// keys.add("blockPos"); values.add(blockPos); +// keys.add("blockLen"); values.add(blockLen); + keys.add("incomings"); values.add(incomings); + keys.add("threadId"); values.add(threadId); + keys.add("time"); values.add(timeStamp); + return "tracer.MyPrintStream.println(" + generateJSONMapGenerator(keys, values) + " + \",\");"; + } private String generateJSONObjectGenerator(String className, String objectId) { ArrayList keys = new ArrayList<>(); diff --git a/TracerOnJavassist/src/tracer/OutputStatementsGenerator.java b/TracerOnJavassist/src/tracer/OutputStatementsGenerator.java index ddf8a53..f4e2011 100644 --- a/TracerOnJavassist/src/tracer/OutputStatementsGenerator.java +++ b/TracerOnJavassist/src/tracer/OutputStatementsGenerator.java @@ -8,6 +8,7 @@ import javassist.CtMethod; import javassist.Modifier; import javassist.NotFoundException; +import javassist.bytecode.analysis.ControlFlow.Block; import javassist.expr.FieldAccess; import javassist.expr.NewArray; @@ -71,15 +72,15 @@ } public String generateReplaceStatementsForCall(CtClass cls, CtBehavior m) throws NotFoundException { - return "{" + generateInsertBeforeStatements(cls, m, true) + " $_ = $proceed($$); " + generateInsertAfterStatements(cls, m, true) + "}"; + return generateInsertBeforeStatements(cls, m, true) + " $_ = $proceed($$); " + generateInsertAfterStatements(cls, m, true); } public String generateInsertBeforeStatementsForMethodBody(CtClass cls, CtBehavior m) throws NotFoundException { - return "{" + generateInsertBeforeStatements(cls, m, false) + "}"; + return generateInsertBeforeStatements(cls, m, false); } public String generateInsertAfterStatementsForMethodBody(CtClass cls, CtBehavior m) throws NotFoundException { - return "{" + generateInsertAfterStatements(cls, m, false) + "}"; + return generateInsertAfterStatements(cls, m, false); } /** @@ -225,4 +226,14 @@ String timeStamp = "System.nanoTime()"; return generator.generateInsertAfterStatements(cls, m, thisClass, thisObject, returnedClass, returnedObject, threadId, timeStamp, isCallerSideInstrumentation); } + + public String generateInsertStatementsForBlockEntry(CtMethod m, int id, Block block) { + String blockId = "\"" + id + "\""; +// String blockPos = "\"" + block.position() + "\""; +// String blockLen = "\"" + block.length() + "\""; + String incomings = "\"" + block.incomings() + "\""; + String threadId = "Thread.currentThread().getId()"; + String timeStamp = "System.nanoTime()"; + return generator.generateInsertStatementsForBlockEntry(m, blockId, incomings, threadId, timeStamp); + } } diff --git a/TracerOnJavassist/src/tracer/PlainTextTraceGenerator.java b/TracerOnJavassist/src/tracer/PlainTextTraceGenerator.java index 6713f9b..abf4b05 100644 --- a/TracerOnJavassist/src/tracer/PlainTextTraceGenerator.java +++ b/TracerOnJavassist/src/tracer/PlainTextTraceGenerator.java @@ -5,6 +5,7 @@ import javassist.CtBehavior; import javassist.CtClass; import javassist.CtConstructor; +import javassist.CtMethod; /** * �]���̃g���[�X�o�͗p�̎��s�������� @@ -19,19 +20,19 @@ public String generateReplaceStatementsForFieldSet( String fieldName, String containerClass, String containerObject, String valueClass, String valueObject, String threadId, String timeStamp) { - return "{$proceed($$); " + + return "$proceed($$); " + "tracer.MyPrintStream.println(\"set:\" + " + containerClass + " + \":\" + " + containerObject + " + \":\" + " + - valueClass + " + \":\" + " + valueObject + " + " + LINE_AND_THREAD + threadId + ");}"; + valueClass + " + \":\" + " + valueObject + " + " + LINE_AND_THREAD + threadId + ");"; } @Override public String generateReplaceStatementsForFieldGet( String fieldName, String thisClass, String thisObject, String containerClass, String containerObject, String valueClass, String valueObject, String threadId, String timeStamp) { - return "{$_ = $proceed(); " + + return "$_ = $proceed(); " + "tracer.MyPrintStream.println(\"get:\" + " + thisClass + " + \":\" + " + thisObject + " + \":\" + " + containerClass + " + \":\" + " + containerObject + " + \":\" + " + - valueClass + " + \":\" + " + valueObject + " + " + LINE_AND_THREAD + threadId + ");}"; + valueClass + " + \":\" + " + valueObject + " + " + LINE_AND_THREAD + threadId + ");"; } @Override @@ -98,4 +99,11 @@ return returnOutput; } + + @Override + public String generateInsertStatementsForBlockEntry( + CtMethod m, String blockId, String incomings, + String threadId, String timeStamp) { + return ""; + } } diff --git a/TracerOnJavassist/src/tracer/Tracer.java b/TracerOnJavassist/src/tracer/Tracer.java index 9ca53f1..bdb7a26 100644 --- a/TracerOnJavassist/src/tracer/Tracer.java +++ b/TracerOnJavassist/src/tracer/Tracer.java @@ -15,6 +15,8 @@ import javassist.CtMethod; import javassist.NotFoundException; import javassist.bytecode.BadBytecode; +import javassist.bytecode.analysis.ControlFlow; +import javassist.bytecode.analysis.ControlFlow.Block; import javassist.expr.ExprEditor; import javassist.expr.FieldAccess; import javassist.expr.MethodCall; @@ -31,6 +33,7 @@ public static int lineNo = 1; private static final String STANDARD_CLASSES = "java.util.ListIterator|java.util.Iterator|java.util.List|java.util.Vector|java.util.ArrayList|java.util.Stack|java.util.Map|java.util.HashMap|java.util.Set|java.util.HashSet|java.util.Hashtable|java.util.LinkedList|java.lang.Thread"; private static final String CONCRETE_STANDARD_CLASSES = "java.util.Vector|java.util.ArrayList|java.util.Stack |java.util.HashMap|java.util.HashSet|java.util.Hashtable|java.util.LinkedList|java.lang.Thread"; + private static final String EXCEPT_FOR_METHODS = "java.lang.Thread.currentThread()|java.lang.Thread.getId()"; private static OutputStatementsGenerator outputStatementsGenerator = null; private static CodeConverter conv = new CodeConverter(); @@ -94,8 +97,17 @@ } private static void methodInstrumentation(final CtClass cc, final CtBehavior m) throws BadBytecode, NotFoundException, CannotCompileException { -// ControlFlow cf = new ControlFlow(m); -// String methodSignature = m.getSignature(); + // ���\�b�h�{�̓��̊e�u���b�N�̍ŏ��ɏo�͕���}������(�o�͕��̑}���Ńu���b�N�������Ă��܂��̂ŁA��ɑ}�����Ă���) + Block[] blocks = null; + if (m instanceof CtMethod) { + ControlFlow cf = new ControlFlow((CtMethod)m); + blocks = cf.basicBlocks(); + for (int i = blocks.length - 1; i >= 0; i--) { + int blockPos = m.getMethodInfo().getLineNumber(blocks[i].position()); + System.out.println(m.getLongName() + ":" + blockPos); + m.insertAt(blockPos, outputStatementsGenerator.generateInsertStatementsForBlockEntry((CtMethod)m, i, blocks[i])); + } + } // ���\�b�h�{�̓��̃t�B�[���h�A�N�Z�X�ƃ��\�b�h�Ăяo����u�������� m.instrument(new ExprEditor() { @@ -113,7 +125,7 @@ public void edit(MethodCall c) throws CannotCompileException { try { CtMethod m = c.getMethod(); - if (m.getDeclaringClass().getName().matches(STANDARD_CLASSES)) { + if (m.getDeclaringClass().getName().matches(STANDARD_CLASSES) && m.getLongName().matches(EXCEPT_FOR_METHODS)) { c.replace(outputStatementsGenerator.generateReplaceStatementsForCall(m.getDeclaringClass(), m)); } } catch (NotFoundException e) { @@ -157,49 +169,9 @@ m.insertBefore(outputStatementsGenerator.generateInsertBeforeStatementsForMethodBody(cc, m)); } } - // Block[] blocks = cf.basicBlocks(); - // int block0 = m.getMethodInfo().getLineNumber(blocks[0].position()); - // int block1 = - // m.getMethodInfo().getLineNumber(blocks[1].position()); - // int block2 = - // m.getMethodInfo().getLineNumber(blocks[2].position()); - // int block3 = - // m.getMethodInfo().getLineNumber(blocks[3].position()); - // int block4 = - // m.getMethodInfo().getLineNumber(blocks[4].position()); - //�@m.insertAt(block0, "tracer.MyPrintStream.println(\"block0:\" + " + block0 + ");"); - // m.insertAt(block1, "tracer.MyPrintStream.println(\"block1:\" + " + - // block1 + ");"); - // m.insertAt(block2, "tracer.MyPrintStream.println(\"block2:\" + " + - // block2 + ");"); - // m.insertAt(block3, "tracer.MyPrintStream.println(\"block3:\" + " + - // block3 + ");"); - // m.insertAt(block4, "tracer.MyPrintStream.println(\"block4:\" + " + - // block4 + ");"); - - // int block0 = - // m.getMethodInfo().getLineNumber(blocks[0].position()); - // m.insertAt(block0, "tracer.MyPrintStream.println(\"block0\");"); - // m = cc.getDeclaredMethod("getC"); - // cf = new ControlFlow(m); - // blocks = cf.basicBlocks(); - // int block1 = - // m.getMethodInfo().getLineNumber(blocks[1].position()); - // m.insertAt(block1, "tracer.MyPrintStream.println(\"block1\");"); - // m = cc.getDeclaredMethod("getC"); - // cf = new ControlFlow(m); - // blocks = cf.basicBlocks(); - // int block2 = - // m.getMethodInfo().getLineNumber(blocks[2].position()); - // m.insertAt(block2, "tracer.MyPrintStream.println(\"block2\");"); - - // m.instrument(new ExprEditor() { - // public void edit(MethodCall m) throws CannotCompileException - // { - // if (m.getClassName().equals("Hello") - // && m.getMethodName().equals("say")) - // m.replace("$0.hi();"); - // } - // }); + +// // ���\�b�h�{�̓��̊e�u���b�N�̍ŏ��ɏo�͕���}������ +// if (m instanceof CtMethod && blocks != null) { +// } } }