diff --git a/org.ntlab.traceAnalyzer/src/org/ntlab/objectGraphAnalyzer/ObjectCallCounter.java b/org.ntlab.traceAnalyzer/src/org/ntlab/objectGraphAnalyzer/ObjectCallCounter.java new file mode 100644 index 0000000..67ca244 --- /dev/null +++ b/org.ntlab.traceAnalyzer/src/org/ntlab/objectGraphAnalyzer/ObjectCallCounter.java @@ -0,0 +1,74 @@ +package org.ntlab.objectGraphAnalyzer; + +import java.util.ArrayList; +import java.util.HashMap; + +import org.ntlab.trace.IMethodExecutionVisitor; +import org.ntlab.trace.MethodExecution; +import org.ntlab.trace.ThreadInstance; +import org.ntlab.trace.Trace; +import org.ntlab.trace.TraceJSON; + +public class ObjectCallCounter { + + /** + * @param args + */ + public static void main(String[] args) { + TraceJSON trace = new TraceJSON("traces\\jEditNormal.trace"); + final HashMap classNames = new HashMap<>(); + final HashMap callCounts = new HashMap<>(); + + for (ThreadInstance thread: trace.getAllThreads().values()) { + thread.traverseMethodExecutionsBackward(new IMethodExecutionVisitor() { + @Override + public boolean preVisitThread(ThreadInstance thread) { + return false; + } + + @Override + public boolean preVisitMethodExecution(MethodExecution methodExecution) { + String objId = methodExecution.getThisObjId(); + if (!Trace.isNull(objId)) { + String key = objId + ":" + methodExecution.getSignature(); + if (classNames.get(key) == null) { + classNames.put(key, methodExecution.getThisClassName()); + } + if (callCounts.get(key) == null) { + callCounts.put(key, 1); + } else { + callCounts.put(key, callCounts.get(key) + 1); + } + } else { + String className = methodExecution.getThisClassName(); + String key = className + ":" + methodExecution.getSignature(); + if (classNames.get(key) == null) { + classNames.put(key, className); + } + if (callCounts.get(key) == null) { + callCounts.put(key, 1); + } else { + callCounts.put(key, callCounts.get(key) + 1); + } + } + return false; + } + + @Override + public boolean postVisitThread(ThreadInstance thread) { + return false; + } + + @Override + public boolean postVisitMethodExecution(MethodExecution methodExecution, ArrayList children) { + return false; + } + }); + } + + for (String objId: callCounts.keySet()) { + System.out.println(objId + ":" + classNames.get(objId) + ":" + callCounts.get(objId)); + } + } + +} diff --git a/org.ntlab.traceAnalyzer/src/org/ntlab/objectGraphAnalyzer/ObjectGraphReconstructor.java b/org.ntlab.traceAnalyzer/src/org/ntlab/objectGraphAnalyzer/ObjectGraphReconstructor.java new file mode 100644 index 0000000..1019261 --- /dev/null +++ b/org.ntlab.traceAnalyzer/src/org/ntlab/objectGraphAnalyzer/ObjectGraphReconstructor.java @@ -0,0 +1,82 @@ +package org.ntlab.objectGraphAnalyzer; + +import java.util.HashMap; + +import org.ntlab.trace.FieldUpdate; +import org.ntlab.trace.IStatementVisitor; +import org.ntlab.trace.MethodInvocation; +import org.ntlab.trace.Statement; +import org.ntlab.trace.Trace; +import org.ntlab.trace.TraceJSON; + +public class ObjectGraphReconstructor { + + /** + * @param args + */ + public static void main(String[] args) { + final HashMap classNames = new HashMap<>(); + final HashMap links = new HashMap<>(); + TraceJSON trace = new TraceJSON("traces\\jEditNormal.trace"); + trace.traverseStatementsInTrace(new IStatementVisitor() { + @Override + public boolean preVisitStatement(Statement statement) { + if (statement instanceof FieldUpdate) { + FieldUpdate f = (FieldUpdate)statement; + String linkId = null; + if (!Trace.isNull(f.getContainerObjId())) { + // �ʏ�̃I�u�W�F�N�g�ԎQ�Ƃ̏ꍇ + if (classNames.get(f.getContainerObjId()) == null) { + classNames.put(f.getContainerObjId(), f.getContainerClassName()); + } + linkId = f.getContainerObjId() + ":" + f.getFieldName(); + } else { + // static �t�B�[���h�ɂ��Q�Ƃ̏ꍇ + if (classNames.get(f.getContainerClassName()) == null) { + classNames.put(f.getContainerClassName(), f.getContainerClassName()); + } + linkId = f.getContainerClassName() + ":" + f.getFieldName(); + } + if (!Trace.isNull(f.getValueObjId())) { + // null �ȊO�ւ̎Q�Ƃ̏ꍇ + if (!Trace.isPrimitive(f.getValueClassName())) { + // �Q�ƌ^�̏ꍇ�̂݃����N���� + links.put(linkId, f.getValueObjId()); + if (classNames.get(f.getValueObjId()) == null) { + classNames.put(f.getValueObjId(), f.getValueClassName()); + } + } + } else { + // null �l�̑���̏ꍇ�A�����N���폜 + links.remove(linkId); + } + } + return false; + } + @Override + public boolean postVisitStatement(Statement statement) { + return false; + } + }); + String objectLabel; + String objectElements[]; + String linkElements[]; + String fieldElements[]; + System.out.println("digraph jEditNormal {"); + for (String objectId: classNames.keySet()) { + objectElements = objectId.split("\\."); + objectLabel = objectElements[objectElements.length - 1].replace("$", "_"); + System.out.println(objectLabel + " [label=\"" + objectId + ":" + classNames.get(objectId)+ "\"]"); + } + for (String linkId: links.keySet()) { + linkElements = linkId.split(":"); + fieldElements = linkElements[1].split("\\."); + objectElements = linkElements[0].split("\\."); + objectLabel = objectElements[objectElements.length - 1].replace("$", "_"); + System.out.println(objectLabel + " -> " + + links.get(linkId) + + " [label=\"" + fieldElements[fieldElements.length - 1] +"\"]"); + } + System.out.println("}"); + } +} diff --git a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/FieldAccess.java b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/FieldAccess.java index 02e6e54..b20b5dc 100644 --- a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/FieldAccess.java +++ b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/FieldAccess.java @@ -1,6 +1,7 @@ package org.ntlab.trace; public class FieldAccess extends Statement { + private String fieldName; private String containerClassName; private String containerObjId; private String valueClassName; @@ -31,6 +32,23 @@ this.thisClassName = thisClassName; this.thisObjId = thisObjId; } + + public FieldAccess(String fieldName, String valueClassName, String valueObjId, String containerClassName, + String containerObjId, String thisClassName, String thisObjId, + int lineNo, String threadNo, long timeStamp) { + super(lineNo, threadNo, timeStamp); + this.fieldName = fieldName; + this.containerClassName = containerClassName; + this.containerObjId = containerObjId; + this.valueClassName = valueClassName; + this.valueObjId = valueObjId; + this.thisClassName = thisClassName; + this.thisObjId = thisObjId; + } + + public String getFieldName() { + return fieldName; + } public String getContainerClassName() { return containerClassName; diff --git a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/FieldUpdate.java b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/FieldUpdate.java index b7d8443..6b378cc 100644 --- a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/FieldUpdate.java +++ b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/FieldUpdate.java @@ -1,6 +1,7 @@ package org.ntlab.trace; public class FieldUpdate extends Statement { + private String fieldName; private String containerClassName; private String containerObjId; private String valueClassName; @@ -24,6 +25,20 @@ this.valueObjId = valueObjId; } + public FieldUpdate(String fieldName, String valueClassName, String valueObjId, String containerClassName, String containerObjId, + int lineNo, String threadNo, long timeStamp) { + super(lineNo, threadNo, timeStamp); + this.fieldName = fieldName; + this.containerClassName = containerClassName; + this.containerObjId = containerObjId; + this.valueClassName = valueClassName; + this.valueObjId = valueObjId; + } + + public String getFieldName() { + return fieldName; + } + public String getContainerClassName() { return containerClassName; } diff --git a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/MethodInvocation.java b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/MethodInvocation.java index b815b2d..38eda41 100644 --- a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/MethodInvocation.java +++ b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/MethodInvocation.java @@ -22,6 +22,13 @@ this.thisObjId = thisObjId; } + public long getTimeStamp() { + if (calledMethodExecution != null) { + return calledMethodExecution.getEntryTime(); + } + return timeStamp; + } + public void setCalledMethodExecution(MethodExecution calledMethodExecution) { this.calledMethodExecution = calledMethodExecution; } diff --git a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/TestTrace.java b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/TestTrace.java index 7f67456..8d8cd7b 100644 --- a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/TestTrace.java +++ b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/TestTrace.java @@ -13,13 +13,13 @@ // Trace trace = new Trace("traces\\worstCase.txt"); Trace trace = new TraceJSON("traces\\_worstCase.txt"); // HashSet marked = trace.getMarkedMethodSignatures(1255991806833871L, 1255991808597322L); - HashSet marked = trace.getMarkedMethodSignatures(1044823638835493L, 1044823639353788L); + HashSet marked = trace.getMarkedMethodSignatures(1699553004208835L, 1699553004739523L); System.out.println("===== Marked Methods ====="); for (String method: marked) { System.out.println(method); } // HashSet unmarked = trace.getUnmarkedMethodSignatures(1255991806833871L, 1255991808597322L); - HashSet unmarked = trace.getUnmarkedMethodSignatures(1044823638835493L, 1044823639353788L); + HashSet unmarked = trace.getUnmarkedMethodSignatures(1699553004208835L, 1699553004739523L); System.out.println("===== Unmarked Methods ====="); for (String method: unmarked) { System.out.println(method); @@ -162,5 +162,353 @@ worstCase.L():1 worstCase.I worstCase.B.getI():1 */ + System.out.println("===== All Statements Forward ====="); + trace.traverseStatementsInTrace(new IStatementVisitor() { + @Override + public boolean preVisitStatement(Statement statement) { + System.out.println("pre:" + statement.getClass().getName() + ":" + statement.getTimeStamp()); + return false; + } + @Override + public boolean postVisitStatement(Statement statement) { + System.out.println("post:" + statement.getClass().getName() + ":" + statement.getTimeStamp()); + return false; + } + }); +/* + * ���������� + * +===== All Statements Forward ===== +pre:org.ntlab.trace.BlockEnter:1699552992988213 +post:org.ntlab.trace.BlockEnter:1699552992988213 +pre:org.ntlab.trace.MethodInvocation:1699552993730471 +pre:org.ntlab.trace.MethodInvocation:1699552994339441 +pre:org.ntlab.trace.MethodInvocation:1699552994979793 +pre:org.ntlab.trace.MethodInvocation:1699552995575363 +pre:org.ntlab.trace.MethodInvocation:1699552996163881 +pre:org.ntlab.trace.MethodInvocation:1699552996774613 +pre:org.ntlab.trace.MethodInvocation:1699552997363836 +pre:org.ntlab.trace.MethodInvocation:1699552997949532 +pre:org.ntlab.trace.MethodInvocation:1699552998548628 +pre:org.ntlab.trace.MethodInvocation:1699552999050402 +pre:org.ntlab.trace.MethodInvocation:1699552999466490 +pre:org.ntlab.trace.MethodInvocation:1699552999875526 +pre:org.ntlab.trace.MethodInvocation:1699553000173135 +post:org.ntlab.trace.MethodInvocation:1699553000173135 +pre:org.ntlab.trace.FieldUpdate:1699553000225322 +post:org.ntlab.trace.FieldUpdate:1699553000225322 +post:org.ntlab.trace.MethodInvocation:1699552999875526 +pre:org.ntlab.trace.FieldUpdate:1699553000259878 +post:org.ntlab.trace.FieldUpdate:1699553000259878 +post:org.ntlab.trace.MethodInvocation:1699552999466490 +pre:org.ntlab.trace.FieldUpdate:1699553000290908 +post:org.ntlab.trace.FieldUpdate:1699553000290908 +post:org.ntlab.trace.MethodInvocation:1699552999050402 +pre:org.ntlab.trace.FieldUpdate:1699553000331107 +post:org.ntlab.trace.FieldUpdate:1699553000331107 +post:org.ntlab.trace.MethodInvocation:1699552998548628 +pre:org.ntlab.trace.FieldUpdate:1699553000376947 +post:org.ntlab.trace.FieldUpdate:1699553000376947 +post:org.ntlab.trace.MethodInvocation:1699552997949532 +pre:org.ntlab.trace.FieldUpdate:1699553000422435 +post:org.ntlab.trace.FieldUpdate:1699553000422435 +post:org.ntlab.trace.MethodInvocation:1699552997363836 +pre:org.ntlab.trace.FieldUpdate:1699553000463691 +post:org.ntlab.trace.FieldUpdate:1699553000463691 +post:org.ntlab.trace.MethodInvocation:1699552996774613 +pre:org.ntlab.trace.FieldUpdate:1699553000508121 +post:org.ntlab.trace.FieldUpdate:1699553000508121 +post:org.ntlab.trace.MethodInvocation:1699552996163881 +pre:org.ntlab.trace.FieldUpdate:1699553000551845 +post:org.ntlab.trace.FieldUpdate:1699553000551845 +post:org.ntlab.trace.MethodInvocation:1699552995575363 +pre:org.ntlab.trace.FieldUpdate:1699553000596627 +post:org.ntlab.trace.FieldUpdate:1699553000596627 +post:org.ntlab.trace.MethodInvocation:1699552994979793 +pre:org.ntlab.trace.FieldUpdate:1699553000640352 +post:org.ntlab.trace.FieldUpdate:1699553000640352 +post:org.ntlab.trace.MethodInvocation:1699552994339441 +pre:org.ntlab.trace.FieldUpdate:1699553000682666 +post:org.ntlab.trace.FieldUpdate:1699553000682666 +pre:org.ntlab.trace.MethodInvocation:1699553001472175 +pre:org.ntlab.trace.MethodInvocation:1699553002201034 +pre:org.ntlab.trace.MethodInvocation:1699553003026510 +post:org.ntlab.trace.MethodInvocation:1699553003026510 +pre:org.ntlab.trace.FieldUpdate:1699553003101618 +post:org.ntlab.trace.FieldUpdate:1699553003101618 +post:org.ntlab.trace.MethodInvocation:1699553002201034 +pre:org.ntlab.trace.FieldUpdate:1699553003149926 +post:org.ntlab.trace.FieldUpdate:1699553003149926 +post:org.ntlab.trace.MethodInvocation:1699553001472175 +pre:org.ntlab.trace.FieldUpdate:1699553003190477 +post:org.ntlab.trace.FieldUpdate:1699553003190477 +post:org.ntlab.trace.MethodInvocation:1699552993730471 +pre:org.ntlab.trace.MethodInvocation:1699553003253243 +pre:org.ntlab.trace.BlockEnter:1699553003273695 +post:org.ntlab.trace.BlockEnter:1699553003273695 +pre:org.ntlab.trace.FieldAccess:1699553003299083 +post:org.ntlab.trace.FieldAccess:1699553003299083 +pre:org.ntlab.trace.FieldAccess:1699553003355502 +post:org.ntlab.trace.FieldAccess:1699553003355502 +pre:org.ntlab.trace.MethodInvocation:1699553003386885 +pre:org.ntlab.trace.BlockEnter:1699553003400637 +post:org.ntlab.trace.BlockEnter:1699553003400637 +pre:org.ntlab.trace.FieldAccess:1699553003436956 +post:org.ntlab.trace.FieldAccess:1699553003436956 +pre:org.ntlab.trace.MethodInvocation:1699553003482444 +pre:org.ntlab.trace.BlockEnter:1699553003500427 +post:org.ntlab.trace.BlockEnter:1699553003500427 +pre:org.ntlab.trace.FieldAccess:1699553003526169 +post:org.ntlab.trace.FieldAccess:1699553003526169 +pre:org.ntlab.trace.MethodInvocation:1699553003556141 +pre:org.ntlab.trace.BlockEnter:1699553003570951 +post:org.ntlab.trace.BlockEnter:1699553003570951 +pre:org.ntlab.trace.FieldAccess:1699553003599513 +post:org.ntlab.trace.FieldAccess:1699553003599513 +post:org.ntlab.trace.MethodInvocation:1699553003556141 +pre:org.ntlab.trace.MethodInvocation:1699553003668273 +pre:org.ntlab.trace.BlockEnter:1699553003688020 +post:org.ntlab.trace.BlockEnter:1699553003688020 +pre:org.ntlab.trace.FieldAccess:1699553003715876 +post:org.ntlab.trace.FieldAccess:1699553003715876 +post:org.ntlab.trace.MethodInvocation:1699553003668273 +post:org.ntlab.trace.MethodInvocation:1699553003482444 +pre:org.ntlab.trace.MethodInvocation:1699553003805088 +pre:org.ntlab.trace.BlockEnter:1699553003818135 +post:org.ntlab.trace.BlockEnter:1699553003818135 +pre:org.ntlab.trace.FieldAccess:1699553003846345 +post:org.ntlab.trace.FieldAccess:1699553003846345 +pre:org.ntlab.trace.MethodInvocation:1699553003896769 +pre:org.ntlab.trace.BlockEnter:1699553003912989 +post:org.ntlab.trace.BlockEnter:1699553003912989 +pre:org.ntlab.trace.FieldAccess:1699553003944020 +post:org.ntlab.trace.FieldAccess:1699553003944020 +post:org.ntlab.trace.MethodInvocation:1699553003896769 +pre:org.ntlab.trace.MethodInvocation:1699553004012075 +pre:org.ntlab.trace.BlockEnter:1699553004029706 +post:org.ntlab.trace.BlockEnter:1699553004029706 +pre:org.ntlab.trace.FieldAccess:1699553004082951 +post:org.ntlab.trace.FieldAccess:1699553004082951 +post:org.ntlab.trace.MethodInvocation:1699553004012075 +post:org.ntlab.trace.MethodInvocation:1699553003805088 +post:org.ntlab.trace.MethodInvocation:1699553003386885 +pre:org.ntlab.trace.MethodInvocation:1699553004208835 +pre:org.ntlab.trace.BlockEnter:1699553004228229 +post:org.ntlab.trace.BlockEnter:1699553004228229 +pre:org.ntlab.trace.FieldAccess:1699553004257849 +post:org.ntlab.trace.FieldAccess:1699553004257849 +pre:org.ntlab.trace.MethodInvocation:1699553004302631 +pre:org.ntlab.trace.BlockEnter:1699553004326962 +post:org.ntlab.trace.BlockEnter:1699553004326962 +pre:org.ntlab.trace.FieldAccess:1699553004373507 +post:org.ntlab.trace.FieldAccess:1699553004373507 +pre:org.ntlab.trace.MethodInvocation:1699553004418995 +pre:org.ntlab.trace.BlockEnter:1699553004434510 +post:org.ntlab.trace.BlockEnter:1699553004434510 +pre:org.ntlab.trace.FieldAccess:1699553004461661 +post:org.ntlab.trace.FieldAccess:1699553004461661 +post:org.ntlab.trace.MethodInvocation:1699553004418995 +pre:org.ntlab.trace.MethodInvocation:1699553004515964 +pre:org.ntlab.trace.BlockEnter:1699553004526543 +post:org.ntlab.trace.BlockEnter:1699553004526543 +pre:org.ntlab.trace.FieldAccess:1699553004546994 +post:org.ntlab.trace.FieldAccess:1699553004546994 +post:org.ntlab.trace.MethodInvocation:1699553004515964 +post:org.ntlab.trace.MethodInvocation:1699553004302631 +pre:org.ntlab.trace.MethodInvocation:1699553004606587 +pre:org.ntlab.trace.BlockEnter:1699553004615402 +post:org.ntlab.trace.BlockEnter:1699553004615402 +pre:org.ntlab.trace.FieldAccess:1699553004629507 +post:org.ntlab.trace.FieldAccess:1699553004629507 +pre:org.ntlab.trace.MethodInvocation:1699553004648195 +pre:org.ntlab.trace.BlockEnter:1699553004655953 +post:org.ntlab.trace.BlockEnter:1699553004655953 +pre:org.ntlab.trace.FieldAccess:1699553004670763 +post:org.ntlab.trace.FieldAccess:1699553004670763 +post:org.ntlab.trace.MethodInvocation:1699553004648195 +pre:org.ntlab.trace.MethodInvocation:1699553004703556 +pre:org.ntlab.trace.BlockEnter:1699553004712019 +post:org.ntlab.trace.BlockEnter:1699553004712019 +pre:org.ntlab.trace.FieldUpdate:1699553004728240 +post:org.ntlab.trace.FieldUpdate:1699553004728240 +post:org.ntlab.trace.MethodInvocation:1699553004703556 +post:org.ntlab.trace.MethodInvocation:1699553004606587 +post:org.ntlab.trace.MethodInvocation:1699553004208835 +post:org.ntlab.trace.MethodInvocation:1699553003253243 + */ + System.out.println("===== All Statements Backward ====="); + trace.traverseStatementsInTraceBackward(new IStatementVisitor() { + @Override + public boolean preVisitStatement(Statement statement) { + System.out.println("post:" + statement.getClass().getName() + ":" + statement.getTimeStamp()); + return false; + } + @Override + public boolean postVisitStatement(Statement statement) { + System.out.println("pre:" + statement.getClass().getName() + ":" + statement.getTimeStamp()); + return false; + } + }); } +/* + * ���������� + * +===== All Statements Backward ===== +post:org.ntlab.trace.MethodInvocation:1699553003253243 +post:org.ntlab.trace.MethodInvocation:1699553004208835 +post:org.ntlab.trace.MethodInvocation:1699553004606587 +post:org.ntlab.trace.MethodInvocation:1699553004703556 +post:org.ntlab.trace.FieldUpdate:1699553004728240 +pre:org.ntlab.trace.FieldUpdate:1699553004728240 +post:org.ntlab.trace.BlockEnter:1699553004712019 +pre:org.ntlab.trace.BlockEnter:1699553004712019 +pre:org.ntlab.trace.MethodInvocation:1699553004703556 +post:org.ntlab.trace.MethodInvocation:1699553004648195 +post:org.ntlab.trace.FieldAccess:1699553004670763 +pre:org.ntlab.trace.FieldAccess:1699553004670763 +post:org.ntlab.trace.BlockEnter:1699553004655953 +pre:org.ntlab.trace.BlockEnter:1699553004655953 +pre:org.ntlab.trace.MethodInvocation:1699553004648195 +post:org.ntlab.trace.FieldAccess:1699553004629507 +pre:org.ntlab.trace.FieldAccess:1699553004629507 +post:org.ntlab.trace.BlockEnter:1699553004615402 +pre:org.ntlab.trace.BlockEnter:1699553004615402 +pre:org.ntlab.trace.MethodInvocation:1699553004606587 +post:org.ntlab.trace.MethodInvocation:1699553004302631 +post:org.ntlab.trace.MethodInvocation:1699553004515964 +post:org.ntlab.trace.FieldAccess:1699553004546994 +pre:org.ntlab.trace.FieldAccess:1699553004546994 +post:org.ntlab.trace.BlockEnter:1699553004526543 +pre:org.ntlab.trace.BlockEnter:1699553004526543 +pre:org.ntlab.trace.MethodInvocation:1699553004515964 +post:org.ntlab.trace.MethodInvocation:1699553004418995 +post:org.ntlab.trace.FieldAccess:1699553004461661 +pre:org.ntlab.trace.FieldAccess:1699553004461661 +post:org.ntlab.trace.BlockEnter:1699553004434510 +pre:org.ntlab.trace.BlockEnter:1699553004434510 +pre:org.ntlab.trace.MethodInvocation:1699553004418995 +post:org.ntlab.trace.FieldAccess:1699553004373507 +pre:org.ntlab.trace.FieldAccess:1699553004373507 +post:org.ntlab.trace.BlockEnter:1699553004326962 +pre:org.ntlab.trace.BlockEnter:1699553004326962 +pre:org.ntlab.trace.MethodInvocation:1699553004302631 +post:org.ntlab.trace.FieldAccess:1699553004257849 +pre:org.ntlab.trace.FieldAccess:1699553004257849 +post:org.ntlab.trace.BlockEnter:1699553004228229 +pre:org.ntlab.trace.BlockEnter:1699553004228229 +pre:org.ntlab.trace.MethodInvocation:1699553004208835 +post:org.ntlab.trace.MethodInvocation:1699553003386885 +post:org.ntlab.trace.MethodInvocation:1699553003805088 +post:org.ntlab.trace.MethodInvocation:1699553004012075 +post:org.ntlab.trace.FieldAccess:1699553004082951 +pre:org.ntlab.trace.FieldAccess:1699553004082951 +post:org.ntlab.trace.BlockEnter:1699553004029706 +pre:org.ntlab.trace.BlockEnter:1699553004029706 +pre:org.ntlab.trace.MethodInvocation:1699553004012075 +post:org.ntlab.trace.MethodInvocation:1699553003896769 +post:org.ntlab.trace.FieldAccess:1699553003944020 +pre:org.ntlab.trace.FieldAccess:1699553003944020 +post:org.ntlab.trace.BlockEnter:1699553003912989 +pre:org.ntlab.trace.BlockEnter:1699553003912989 +pre:org.ntlab.trace.MethodInvocation:1699553003896769 +post:org.ntlab.trace.FieldAccess:1699553003846345 +pre:org.ntlab.trace.FieldAccess:1699553003846345 +post:org.ntlab.trace.BlockEnter:1699553003818135 +pre:org.ntlab.trace.BlockEnter:1699553003818135 +pre:org.ntlab.trace.MethodInvocation:1699553003805088 +post:org.ntlab.trace.MethodInvocation:1699553003482444 +post:org.ntlab.trace.MethodInvocation:1699553003668273 +post:org.ntlab.trace.FieldAccess:1699553003715876 +pre:org.ntlab.trace.FieldAccess:1699553003715876 +post:org.ntlab.trace.BlockEnter:1699553003688020 +pre:org.ntlab.trace.BlockEnter:1699553003688020 +pre:org.ntlab.trace.MethodInvocation:1699553003668273 +post:org.ntlab.trace.MethodInvocation:1699553003556141 +post:org.ntlab.trace.FieldAccess:1699553003599513 +pre:org.ntlab.trace.FieldAccess:1699553003599513 +post:org.ntlab.trace.BlockEnter:1699553003570951 +pre:org.ntlab.trace.BlockEnter:1699553003570951 +pre:org.ntlab.trace.MethodInvocation:1699553003556141 +post:org.ntlab.trace.FieldAccess:1699553003526169 +pre:org.ntlab.trace.FieldAccess:1699553003526169 +post:org.ntlab.trace.BlockEnter:1699553003500427 +pre:org.ntlab.trace.BlockEnter:1699553003500427 +pre:org.ntlab.trace.MethodInvocation:1699553003482444 +post:org.ntlab.trace.FieldAccess:1699553003436956 +pre:org.ntlab.trace.FieldAccess:1699553003436956 +post:org.ntlab.trace.BlockEnter:1699553003400637 +pre:org.ntlab.trace.BlockEnter:1699553003400637 +pre:org.ntlab.trace.MethodInvocation:1699553003386885 +post:org.ntlab.trace.FieldAccess:1699553003355502 +pre:org.ntlab.trace.FieldAccess:1699553003355502 +post:org.ntlab.trace.FieldAccess:1699553003299083 +pre:org.ntlab.trace.FieldAccess:1699553003299083 +post:org.ntlab.trace.BlockEnter:1699553003273695 +pre:org.ntlab.trace.BlockEnter:1699553003273695 +pre:org.ntlab.trace.MethodInvocation:1699553003253243 +post:org.ntlab.trace.MethodInvocation:1699552993730471 +post:org.ntlab.trace.FieldUpdate:1699553003190477 +pre:org.ntlab.trace.FieldUpdate:1699553003190477 +post:org.ntlab.trace.MethodInvocation:1699553001472175 +post:org.ntlab.trace.FieldUpdate:1699553003149926 +pre:org.ntlab.trace.FieldUpdate:1699553003149926 +post:org.ntlab.trace.MethodInvocation:1699553002201034 +post:org.ntlab.trace.FieldUpdate:1699553003101618 +pre:org.ntlab.trace.FieldUpdate:1699553003101618 +post:org.ntlab.trace.MethodInvocation:1699553003026510 +pre:org.ntlab.trace.MethodInvocation:1699553003026510 +pre:org.ntlab.trace.MethodInvocation:1699553002201034 +pre:org.ntlab.trace.MethodInvocation:1699553001472175 +post:org.ntlab.trace.FieldUpdate:1699553000682666 +pre:org.ntlab.trace.FieldUpdate:1699553000682666 +post:org.ntlab.trace.MethodInvocation:1699552994339441 +post:org.ntlab.trace.FieldUpdate:1699553000640352 +pre:org.ntlab.trace.FieldUpdate:1699553000640352 +post:org.ntlab.trace.MethodInvocation:1699552994979793 +post:org.ntlab.trace.FieldUpdate:1699553000596627 +pre:org.ntlab.trace.FieldUpdate:1699553000596627 +post:org.ntlab.trace.MethodInvocation:1699552995575363 +post:org.ntlab.trace.FieldUpdate:1699553000551845 +pre:org.ntlab.trace.FieldUpdate:1699553000551845 +post:org.ntlab.trace.MethodInvocation:1699552996163881 +post:org.ntlab.trace.FieldUpdate:1699553000508121 +pre:org.ntlab.trace.FieldUpdate:1699553000508121 +post:org.ntlab.trace.MethodInvocation:1699552996774613 +post:org.ntlab.trace.FieldUpdate:1699553000463691 +pre:org.ntlab.trace.FieldUpdate:1699553000463691 +post:org.ntlab.trace.MethodInvocation:1699552997363836 +post:org.ntlab.trace.FieldUpdate:1699553000422435 +pre:org.ntlab.trace.FieldUpdate:1699553000422435 +post:org.ntlab.trace.MethodInvocation:1699552997949532 +post:org.ntlab.trace.FieldUpdate:1699553000376947 +pre:org.ntlab.trace.FieldUpdate:1699553000376947 +post:org.ntlab.trace.MethodInvocation:1699552998548628 +post:org.ntlab.trace.FieldUpdate:1699553000331107 +pre:org.ntlab.trace.FieldUpdate:1699553000331107 +post:org.ntlab.trace.MethodInvocation:1699552999050402 +post:org.ntlab.trace.FieldUpdate:1699553000290908 +pre:org.ntlab.trace.FieldUpdate:1699553000290908 +post:org.ntlab.trace.MethodInvocation:1699552999466490 +post:org.ntlab.trace.FieldUpdate:1699553000259878 +pre:org.ntlab.trace.FieldUpdate:1699553000259878 +post:org.ntlab.trace.MethodInvocation:1699552999875526 +post:org.ntlab.trace.FieldUpdate:1699553000225322 +pre:org.ntlab.trace.FieldUpdate:1699553000225322 +post:org.ntlab.trace.MethodInvocation:1699553000173135 +pre:org.ntlab.trace.MethodInvocation:1699553000173135 +pre:org.ntlab.trace.MethodInvocation:1699552999875526 +pre:org.ntlab.trace.MethodInvocation:1699552999466490 +pre:org.ntlab.trace.MethodInvocation:1699552999050402 +pre:org.ntlab.trace.MethodInvocation:1699552998548628 +pre:org.ntlab.trace.MethodInvocation:1699552997949532 +pre:org.ntlab.trace.MethodInvocation:1699552997363836 +pre:org.ntlab.trace.MethodInvocation:1699552996774613 +pre:org.ntlab.trace.MethodInvocation:1699552996163881 +pre:org.ntlab.trace.MethodInvocation:1699552995575363 +pre:org.ntlab.trace.MethodInvocation:1699552994979793 +pre:org.ntlab.trace.MethodInvocation:1699552994339441 +pre:org.ntlab.trace.MethodInvocation:1699552993730471 +post:org.ntlab.trace.BlockEnter:1699552992988213 +pre:org.ntlab.trace.BlockEnter:1699552992988213 + */ } diff --git a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/ThreadInstance.java b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/ThreadInstance.java index a88d9c4..16b3403 100644 --- a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/ThreadInstance.java +++ b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/ThreadInstance.java @@ -91,6 +91,11 @@ if (curMethodExecution != null) curMethodExecution.addStatement(fieldAccess); } + public void fieldAccess(String fieldName, String valueClassName, String valueObjId, String containerClassName, String containerObjId, String thisClassName, String thisId, int lineNo, long timeStamp) { + FieldAccess fieldAccess = new FieldAccess(fieldName, valueClassName, valueObjId, containerClassName, containerObjId, thisClassName, thisId, lineNo, id, timeStamp); + if (curMethodExecution != null) curMethodExecution.addStatement(fieldAccess); + } + public void fieldUpdate(String valueClassName, String valueObjId, String containerClassName, String containerObjId) { FieldUpdate fieldUpdate = new FieldUpdate(valueClassName, valueObjId, containerClassName, containerObjId, 0, id); if (curMethodExecution != null) curMethodExecution.addStatement(fieldUpdate); @@ -100,6 +105,11 @@ FieldUpdate fieldUpdate = new FieldUpdate(valueClassName, valueObjId, containerClassName, containerObjId, lineNo, id, timeStamp); if (curMethodExecution != null) curMethodExecution.addStatement(fieldUpdate); } + + public void fieldUpdate(String fieldName, String valueClassName, String valueObjId, String containerClassName, String containerObjId, int lineNo, long timeStamp) { + FieldUpdate fieldUpdate = new FieldUpdate(fieldName, valueClassName, valueObjId, containerClassName, containerObjId, lineNo, id, timeStamp); + if (curMethodExecution != null) curMethodExecution.addStatement(fieldUpdate); + } public void arrayCreate(String arrayClassName, String arrayObjectId, int dimension, int lineNo, long timeStamp) { ArrayCreate arrayCreate = new ArrayCreate(arrayClassName, arrayObjectId, dimension, lineNo, id, timeStamp); diff --git a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/Trace.java b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/Trace.java index 049e4ed..1bf9da7 100644 --- a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/Trace.java +++ b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/Trace.java @@ -19,131 +19,148 @@ /** * �w�肵��PlainText�̃g���[�X�t�@�C������ǂ��� Trace �I�u�W�F�N�g�𐶐����� + * @param file �g���[�X�t�@�C�� + */ + public Trace(BufferedReader file) { + try { + read(file); + file.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * �w�肵��PlainText�̃g���[�X�t�@�C������ǂ��� Trace �I�u�W�F�N�g�𐶐����� * @param traceFile �g���[�X�t�@�C���̃p�X */ public Trace(String traceFile) { BufferedReader file; try { file = new BufferedReader(new FileReader(traceFile)); - // �g���[�X�t�@�C���ǂݍ��� - String line, prevLine = null; - String signature; - String callerSideSignature; - String threadNo = null; - String[] methodData; - String[] argData; - String[] returnData; - String[] accessData; - String[] updateData; - String thisObjectId; - String thisClassName; - boolean isConstractor = false; - boolean isCollectionType = false; - boolean isStatic = false; - long timeStamp = 0L; - ThreadInstance thread = null; - HashMap> stacks = new HashMap>(); - while ((line = file.readLine()) != null) { - // �g���[�X�t�@�C���̉�� - if (line.startsWith("Method")) { - // ���\�b�h�Ăяo���i�R���X�g���N�^�Ăяo�����܂ށj - methodData = line.split(":"); - int n = methodData[0].indexOf(','); - signature = methodData[0].substring(n + 1); - threadNo = methodData[methodData.length - 1].split(" ")[1]; - thisObjectId = methodData[1]; - thisClassName = methodData[0].substring(0, n).split(" ")[1]; - isConstractor = false; - isStatic = false; - if (signature.contains("static ")) { - isStatic = true; - } - callerSideSignature = signature; - timeStamp = Long.parseLong(methodData[methodData.length - 2]); - if (prevLine != null) { - if (prevLine.startsWith("New")) { - isConstractor = true; - } else if (prevLine.startsWith("Invoke")) { - callerSideSignature = prevLine.split(":")[1]; - } - } - thread = threads.get(threadNo); - Stack stack; - if (thread == null) { - thread = new ThreadInstance(threadNo); - threads.put(threadNo, thread); - stack = new Stack(); - stacks.put(threadNo, stack); - } else { - stack = stacks.get(threadNo); - } - stack.push(line); - thread.callMethod(signature, callerSideSignature, thisClassName, thisObjectId, isConstractor, isStatic, timeStamp); - } else if (line.startsWith("Args")) { - // ���\�b�h�Ăяo���̈��� - argData = line.split(":"); - threadNo = argData[argData.length - 1].split(" ")[1]; - thread = threads.get(threadNo); - ArrayList arguments = new ArrayList(); - for (int k = 1; k < argData.length - 2; k += 2) { - arguments.add(new ObjectReference(argData[k+1], argData[k])); - } - thread.setArgments(arguments); - } else if (line.startsWith("Return")) { - // ���\�b�h����̕��A - returnData = line.split(":"); - threadNo = returnData[returnData.length - 1].split(" ")[1]; - Stack stack = stacks.get(threadNo); - if (!stack.isEmpty()) { - String line2 = stack.peek(); - if (line2.split("\\(")[0].endsWith(line.split("\\(")[1])) { - stack.pop(); - } else { - do { - line2 = stack.pop(); - thread.terminateMethod(); - } while (!stack.isEmpty() && !line2.split("\\(")[0].endsWith(line.split("\\(")[1])); - } - thread = threads.get(threadNo); - ObjectReference returnValue = new ObjectReference(returnData[2], returnData[1]); - thisObjectId = returnData[2]; - isCollectionType = false; - String curLine = returnData[0]; - if(curLine.contains("Return call(List") - || curLine.contains("Return call(Vector") - || curLine.contains("Return call(Iterator") - || curLine.contains("Return call(ListIterator") - || curLine.contains("Return call(ArrayList") - || curLine.contains("Return call(Stack") - || curLine.contains("Return call(Hash") - || curLine.contains("Return call(Map") - || curLine.contains("Return call(Set") - || curLine.contains("Return call(Linked") - || curLine.contains("Return call(Thread")) { - isCollectionType = true; - } - thread.returnMethod(returnValue, thisObjectId, isCollectionType); - } - } else if (line.startsWith("get")) { - // �t�B�[���h�A�N�Z�X - accessData = line.split(":"); - threadNo = accessData[8].split(" ")[1]; - thread = threads.get(threadNo); - if (thread != null) thread.fieldAccess(accessData[5], accessData[6], accessData[3], accessData[4], accessData[1], accessData[2]); - } else if (line.startsWith("set")) { - // �t�B�[���h�X�V - updateData = line.split(":"); - threadNo = updateData[6].split(" ")[1]; - thread = threads.get(threadNo); - if (thread != null) thread.fieldUpdate(updateData[3], updateData[4], updateData[1], updateData[2]); - } - prevLine = line; - } + read(file); file.close(); } catch (IOException e) { e.printStackTrace(); } } + + private void read(BufferedReader file) throws IOException { + // �g���[�X�t�@�C���ǂݍ��� + String line, prevLine = null; + String signature; + String callerSideSignature; + String threadNo = null; + String[] methodData; + String[] argData; + String[] returnData; + String[] accessData; + String[] updateData; + String thisObjectId; + String thisClassName; + boolean isConstractor = false; + boolean isCollectionType = false; + boolean isStatic = false; + long timeStamp = 0L; + ThreadInstance thread = null; + HashMap> stacks = new HashMap>(); + while ((line = file.readLine()) != null) { + // �g���[�X�t�@�C���̉�� + if (line.startsWith("Method")) { + // ���\�b�h�Ăяo���i�R���X�g���N�^�Ăяo�����܂ށj + methodData = line.split(":"); + int n = methodData[0].indexOf(','); + signature = methodData[0].substring(n + 1); + threadNo = methodData[methodData.length - 1].split(" ")[1]; + thisObjectId = methodData[1]; + thisClassName = methodData[0].substring(0, n).split(" ")[1]; + isConstractor = false; + isStatic = false; + if (signature.contains("static ")) { + isStatic = true; + } + callerSideSignature = signature; + timeStamp = Long.parseLong(methodData[methodData.length - 2]); + if (prevLine != null) { + if (prevLine.startsWith("New")) { + isConstractor = true; + } else if (prevLine.startsWith("Invoke")) { + callerSideSignature = prevLine.split(":")[1]; + } + } + thread = threads.get(threadNo); + Stack stack; + if (thread == null) { + thread = new ThreadInstance(threadNo); + threads.put(threadNo, thread); + stack = new Stack(); + stacks.put(threadNo, stack); + } else { + stack = stacks.get(threadNo); + } + stack.push(line); + thread.callMethod(signature, callerSideSignature, thisClassName, thisObjectId, isConstractor, isStatic, timeStamp); + } else if (line.startsWith("Args")) { + // ���\�b�h�Ăяo���̈��� + argData = line.split(":"); + threadNo = argData[argData.length - 1].split(" ")[1]; + thread = threads.get(threadNo); + ArrayList arguments = new ArrayList(); + for (int k = 1; k < argData.length - 2; k += 2) { + arguments.add(new ObjectReference(argData[k+1], argData[k])); + } + thread.setArgments(arguments); + } else if (line.startsWith("Return")) { + // ���\�b�h����̕��A + returnData = line.split(":"); + threadNo = returnData[returnData.length - 1].split(" ")[1]; + Stack stack = stacks.get(threadNo); + if (!stack.isEmpty()) { + String line2 = stack.peek(); + if (line2.split("\\(")[0].endsWith(line.split("\\(")[1])) { + stack.pop(); + } else { + do { + line2 = stack.pop(); + thread.terminateMethod(); + } while (!stack.isEmpty() && !line2.split("\\(")[0].endsWith(line.split("\\(")[1])); + } + thread = threads.get(threadNo); + ObjectReference returnValue = new ObjectReference(returnData[2], returnData[1]); + thisObjectId = returnData[2]; + isCollectionType = false; + String curLine = returnData[0]; + if(curLine.contains("Return call(List") + || curLine.contains("Return call(Vector") + || curLine.contains("Return call(Iterator") + || curLine.contains("Return call(ListIterator") + || curLine.contains("Return call(ArrayList") + || curLine.contains("Return call(Stack") + || curLine.contains("Return call(Hash") + || curLine.contains("Return call(Map") + || curLine.contains("Return call(Set") + || curLine.contains("Return call(Linked") + || curLine.contains("Return call(Thread")) { + isCollectionType = true; + } + thread.returnMethod(returnValue, thisObjectId, isCollectionType); + } + } else if (line.startsWith("get")) { + // �t�B�[���h�A�N�Z�X + accessData = line.split(":"); + threadNo = accessData[8].split(" ")[1]; + thread = threads.get(threadNo); + if (thread != null) thread.fieldAccess(accessData[5], accessData[6], accessData[3], accessData[4], accessData[1], accessData[2]); + } else if (line.startsWith("set")) { + // �t�B�[���h�X�V + updateData = line.split(":"); + threadNo = updateData[6].split(" ")[1]; + thread = threads.get(threadNo); + if (thread != null) thread.fieldUpdate(updateData[3], updateData[4], updateData[1], updateData[2]); + } + prevLine = line; + } + } /** * �S�X���b�h���擾���� @@ -551,6 +568,118 @@ return executions; } + /** + * �g���[�X���̑S�X���b�h�𓯊������Ȃ炪�S���s�����������ɒT������ + * + * @param visitor ���s���̃r�W�^�[ + * @return ���f�����g���[�X�|�C���g + */ + public TracePoint traverseStatementsInTrace(IStatementVisitor visitor) { + HashMap> threadRoots = new HashMap>(); + HashMap threadCurPoints = new HashMap(); + // �e�X���b�h�ɂ����Ĉ�ԍŏ��ɊJ�n�������\�b�h���s��T�� + long traceCurTime = -1; + String traceCurThread = null; + long traceCurTime2 = -1; + String traceCurThread2 = null; + for (String threadId: threads.keySet()) { + ThreadInstance thread = threads.get(threadId); + ArrayList roots = (ArrayList)thread.getRoot().clone(); + threadRoots.put(threadId, roots); + TracePoint threadCurTp; + do { + MethodExecution threadCurExecution = roots.remove(0); + threadCurTp = threadCurExecution.getEntryPoint(); + } while (!threadCurTp.isValid() && roots.size() > 0); + if (threadCurTp.isValid()) { + threadCurPoints.put(threadId, threadCurTp); + long methodEntry = threadCurTp.getMethodExecution().getEntryTime(); + if (traceCurTime == -1 || traceCurTime > methodEntry) { + traceCurTime2 = traceCurTime; + traceCurThread2 = traceCurThread; + traceCurTime = methodEntry; + traceCurThread = threadId; + } + } else { + threadCurPoints.put(threadId, null); + } + } + return traverseStatementsInTraceSub(visitor, threadRoots, threadCurPoints, traceCurThread, traceCurThread2, traceCurTime2); + } + + private TracePoint traverseStatementsInTraceSub(IStatementVisitor visitor, + HashMap> threadRoots, + HashMap threadCurPoints, + String curThreadId, String nextThreadId, long nextThreadTime) { + // �S�X���b�h�̓������Ƃ�Ȃ��珇�����Ɏ��s����T������ + for (;;) { + // �T���Ώۂ̃X���b�h���̏������T�� + TracePoint curTp = threadCurPoints.get(curThreadId); + while (curTp != null + && (curTp.getStatement().getTimeStamp() <= nextThreadTime || nextThreadTime == -1)) { + Statement statement = curTp.getStatement(); + if (visitor.preVisitStatement(statement)) return curTp; + if (!(statement instanceof MethodInvocation)) { + if (visitor.postVisitStatement(statement)) return curTp; + } + curTp.stepNoReturn(); // ���A�����ɌĂяo���؂�����Ă��� + if (!curTp.isValid()) { + // ���A���Ȃ��Ƃ���ȏ�T���ł��Ȃ� + while (!curTp.stepOver()) { // ���x�͕��A�͂��邪���炸�ɒT�� + if (curTp.isValid()) { + // �Ăяo����T���O�Ɉ�x�K��ς݂̃��\�b�h�Ăяo���s���A�T���������x�K�₷�� + if (visitor.postVisitStatement(curTp.getStatement())) return curTp; + } else { + // �Ăяo���؂̊J�n���_�܂ŒT�����I�����ꍇ + ArrayList roots = threadRoots.get(curThreadId); + while (!curTp.isValid() && roots.size() > 0) { + // ���̌Ăяo���؂�����΂�����ŏ�����T�� + MethodExecution firstExecution = roots.remove(0); + curTp = firstExecution.getEntryPoint(); + } + if (curTp.isValid()) { + // ���̌Ăяo���؂�����΂�����ŏ�����T�� + threadCurPoints.put(curThreadId, curTp); + } else { + // ���̃X���b�h�̒T�������ׂďI�������ꍇ + threadCurPoints.put(curThreadId, null); + curTp = null; + } + break; + } + } + } + } + curThreadId = nextThreadId; + if (curThreadId == null) break; + // ���̎��ɒT�����ׂ��X���b�h(���T���̗̈悪��ԍŏ��Ɏn�܂�X���b�h)�����肷�� + nextThreadTime = -1; + nextThreadId = null; + boolean continueTraverse = false; + for (String threadId: threadCurPoints.keySet()) { + if (!threadId.equals(curThreadId)) { + TracePoint threadTp = threadCurPoints.get(threadId); + if (threadTp != null) { + continueTraverse = true; + long threadTime = threadTp.getStatement().getTimeStamp(); + if (threadTime > 0 && (nextThreadTime == -1 || nextThreadTime > threadTime)) { + nextThreadTime = threadTime; + nextThreadId = threadId; + } + } + } + } + if (!continueTraverse && threadCurPoints.get(curThreadId) == null) break; + } + return null; + } + + /** + * �g���[�X���̑S�X���b�h�𓯊������Ȃ炪�S���s�����t�����ɒT������ + * + * @param visitor ���s���̃r�W�^�[ + * @return ���f�����g���[�X�|�C���g + */ public TracePoint traverseStatementsInTraceBackward(IStatementVisitor visitor) { HashMap> threadRoots = new HashMap>(); HashMap threadLastPoints = new HashMap(); @@ -645,7 +774,9 @@ if (traverseStatamentsInCallTreeBackwardNoReturn(visitor, lastTp)) return lastTp; } else { // �Ăяo�����ɖ߂����ꍇ - if (!lastTp.isValid()) { + if (lastTp.isValid()) { + if (visitor.postVisitStatement(lastTp.getStatement())) return lastTp; + } else { // �Ăяo���؂̊J�n���_�܂ŒT�����I�����ꍇ ArrayList root = threadRoots.get(traceLastThread); while (!lastTp.isValid() && root.size() > 0) { @@ -664,7 +795,7 @@ } } } - } while (lastTp.getMethodExecution().getEntryTime() > traceLastTime2); + } while (lastTp.getMethodExecution().getEntryTime() >= traceLastTime2); traceLastThread = traceLastThread2; // ���̎��ɒT�����ׂ��X���b�h(���T���̗̈悪��ԍŌ�܂Ŏc���Ă���X���b�h)�����肷�� traceLastTime2 = 0; @@ -744,6 +875,13 @@ return false; } + /** + * before�ȍ~�̌Ăяo���؂��Ăяo���悩��̕��A�������ɍs����Ƃ���܂ŋt�����ɒT������ + * + * @param visitor ���s���̃r�W�^�[ + * @param before �T���J�n���s���_ + * @return true -- �T���𒆒f����, false -- ���A�����Ȃ����肱��ȏ�i�߂Ȃ� + */ private boolean traverseStatamentsInCallTreeBackwardNoReturn(IStatementVisitor visitor, TracePoint before) { for (;;) { Statement statement = before.getStatement(); @@ -1028,4 +1166,22 @@ public static String getNull() { return "0"; } + + public static boolean isPrimitive(String typeName) { + if (typeName.equals("int") + || typeName.equals("boolean") + || typeName.equals("long") + || typeName.equals("double") + || typeName.equals("float") + || typeName.equals("char") + || typeName.equals("byte") + || typeName.equals("java.lang.Integer") + || typeName.equals("java.lang.Boolean") + || typeName.equals("java.lang.Long") + || typeName.equals("java.lang.Double") + || typeName.equals("java.lang.Float") + || typeName.equals("java.lang.Character") + || typeName.equals("java.lang.Byte")) return true; + return false; + } } diff --git a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/TraceJSON.java b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/TraceJSON.java index fd641e2..242f92c 100644 --- a/org.ntlab.traceAnalyzer/src/org/ntlab/trace/TraceJSON.java +++ b/org.ntlab.traceAnalyzer/src/org/ntlab/trace/TraceJSON.java @@ -13,348 +13,367 @@ private HashMap classes = new HashMap<>(); /** - * �w�肵��JSON�g���[�X�t�@�C������ǂ��� Trace �I�u�W�F�N�g�𐶐����� + * �w�肵��JSON�̃g���[�X�t�@�C������ǂ��� Trace �I�u�W�F�N�g�𐶐����� + * @param file �g���[�X�t�@�C�� + */ + public TraceJSON(BufferedReader file) { + try { + readJSON(file); + file.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * �w�肵��JSON�̃g���[�X�t�@�C������ǂ��� Trace �I�u�W�F�N�g�𐶐����� * @param traceFile �g���[�X�t�@�C���̃p�X */ public TraceJSON(String traceFile) { - super(); BufferedReader file; try { file = new BufferedReader(new FileReader(traceFile)); - // �g���[�X�t�@�C���ǂݍ��� - String line = null; - String[] type; - String[] classNameData; - String[] pathData; - String[] signature; - String[] receiver; - String[] arguments; - String[] lineData; - String[] threadId; - String[] thisObj; - String[] containerObj; - String[] valueObj; - String[] returnValue; - String[] arrayObj; - String[] thisData; - String[] containerData; - String[] valueData; - String[] returnData; - String[] arrayData; - String[] blockIdData; - String[] incomingsData; - String[] dimensionData; - String[] indexData; - String className; - String classPath; - String loaderPath; - String time; - String thisObjectId; - String thisClassName; - String containerObjectId; - String containerClassName; - String valueObjectId; - String valueClassName; - String returnClassName; - String returnObjectId; - String arrayObjectId; - String arrayClassName; - String shortSignature; - boolean isConstractor = false; - boolean isCollectionType = false; - boolean isStatic = false; - int dimension; - int index; - int blockId; - int incomings; - int lineNum; - long timeStamp = 0L; - ThreadInstance thread = null; - HashMap> stacks = new HashMap>(); - while ((line = file.readLine()) != null) { - // �g���[�X�t�@�C���̉�� - if (line.startsWith("{\"type\":\"classDef\"")) { - // �N���X��` - type = line.split(",\"name\":\""); - classNameData = type[1].split("\",\"path\":\""); - className = classNameData[0]; - pathData = classNameData[1].split("\",\"loaderPath\":\""); - classPath = pathData[0].substring(1); // �擪�� / ����菜�� - loaderPath = pathData[1].substring(1, pathData[1].length() - 3); // �擪�� / �ƁA������ "}, ����菜�� - initializeClass(className, classPath, loaderPath); - } else if (line.startsWith("{\"type\":\"methodCall\"")) { - // ���\�b�h�Ăяo���̌Ăяo���� - type = line.split(",\"callerSideSignature\":\""); - signature = type[1].split("\",\"threadId\":"); - threadId = signature[1].split(",\"lineNum\":"); - lineNum = Integer.parseInt(threadId[1].substring(0, threadId[1].length() - 2)); // ������ }, ����菜�� - thread = threads.get(threadId[0]); - thread.preCallMethod(signature[0], lineNum); - } else if (line.startsWith("{\"type\":\"methodEntry\"")) { - // ���\�b�h�Ăяo�� - type = line.split("\"signature\":\""); - signature = type[1].split("\",\"receiver\":"); - receiver = signature[1].split(",\"args\":"); - arguments = receiver[1].split(",\"threadId\":"); - threadId = arguments[1].split(",\"time\":"); - thisData = parseClassNameAndObjectId(receiver[0]); - thisClassName = thisData[0]; - thisObjectId = thisData[1]; - isConstractor = false; - isStatic = false; - if (signature[0].contains("static ")) { - isStatic = true; - } - thread = threads.get(threadId[0]); - time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� - timeStamp = Long.parseLong(time); - Stack stack; - if (thread == null) { - thread = new ThreadInstance(threadId[0]); - threads.put(threadId[0], thread); - stack = new Stack(); - stacks.put(threadId[0], stack); - } else { - stack = stacks.get(threadId[0]); - } - stack.push(signature[0]); - // ���\�b�h�Ăяo���̐ݒ� - thread.callMethod(signature[0], null, thisClassName, thisObjectId, isConstractor, isStatic, timeStamp); - // �����̐ݒ� - thread.setArgments(parseArguments(arguments)); - } else if (line.startsWith("{\"type\":\"constructorEntry\"")) { - // �R���X�g���N�^�Ăяo�� - type = line.split("\"signature\":\""); - signature = type[1].split("\",\"class\":\""); - receiver = signature[1].split("\",\"args\":"); - arguments = receiver[1].split(",\"threadId\":"); - threadId = arguments[1].split(",\"time\":"); - thisClassName = receiver[0]; - thisObjectId = "0"; - isConstractor = true; - isStatic = false; - thread = threads.get(threadId[0]); - time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� - timeStamp = Long.parseLong(time); - Stack stack; - if (thread == null) { - thread = new ThreadInstance(threadId[0]); - threads.put(threadId[0], thread); - stack = new Stack(); - stacks.put(threadId[0], stack); - } else { - stack = stacks.get(threadId[0]); - } - stack.push(signature[0]); - // ���\�b�h�Ăяo���̐ݒ� - thread.callMethod(signature[0], null, thisClassName, thisObjectId, isConstractor, isStatic, timeStamp); - // �����̐ݒ� - thread.setArgments(parseArguments(arguments)); - } else if (line.startsWith("{\"type\":\"methodExit\"")) { - // ���\�b�h����̕��A - type = line.split(",\"shortSignature\":\""); - signature = type[1].split("\",\"receiver\":"); - receiver = signature[1].split(",\"returnValue\":"); - returnValue = receiver[1].split(",\"threadId\":"); - threadId = returnValue[1].split(",\"time\":"); - thisData = parseClassNameAndObjectId(receiver[0]); - thisClassName = thisData[0]; - thisObjectId = thisData[1]; - returnData = parseClassNameAndObjectId(returnValue[0]); - returnClassName = returnData[0]; - returnObjectId = returnData[1]; - shortSignature = signature[0]; - time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� - timeStamp = Long.parseLong(time); - Stack stack = stacks.get(threadId[0]); - if (!stack.isEmpty()) { - String line2 = stack.peek(); - if (line2.endsWith(shortSignature)) { - stack.pop(); - } else { - do { - line2 = stack.pop(); - thread.terminateMethod(); - } while (!stack.isEmpty() && !line2.endsWith(shortSignature)); - } - thread = threads.get(threadId[0]); - ObjectReference returnVal = new ObjectReference(returnObjectId, returnClassName); - isCollectionType = false; - if(thisClassName.contains("java.util.List") - || thisClassName.contains("java.util.Vector") - || thisClassName.contains("java.util.Iterator") - || thisClassName.contains("java.util.ListIterator") - || thisClassName.contains("java.util.ArrayList") - || thisClassName.contains("java.util.Stack") - || thisClassName.contains("java.util.Hash") - || thisClassName.contains("java.util.Map") - || thisClassName.contains("java.util.Set") - || thisClassName.contains("java.util.Linked") - || thisClassName.contains("java.lang.Thread")) { - isCollectionType = true; - } - // ���\�b�h����̕��A�̐ݒ� - thread.returnMethod(returnVal, thisObjectId, isCollectionType, timeStamp); - } - } else if (line.startsWith("{\"type\":\"constructorExit\"")) { - // �R���X�g���N�^����̕��A - type = line.split(",\"shortSignature\":\""); - signature = type[1].split("\",\"returnValue\":"); - returnValue = signature[1].split(",\"threadId\":"); - threadId = returnValue[1].split(",\"time\":"); - returnData = parseClassNameAndObjectId(returnValue[0]); - thisClassName = returnClassName = returnData[0]; - thisObjectId = returnObjectId = returnData[1]; - time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� - timeStamp = Long.parseLong(time); - Stack stack = stacks.get(threadId[0]); - shortSignature = signature[0]; - if (!stack.isEmpty()) { - String line2 = stack.peek(); - if (line2.endsWith(shortSignature)) { - stack.pop(); - } else { - do { - line2 = stack.pop(); - thread.terminateMethod(); - } while (!stack.isEmpty() && !line2.endsWith(shortSignature)); - } - thread = threads.get(threadId[0]); - ObjectReference returnVal = new ObjectReference(returnObjectId, returnClassName); - isCollectionType = false; - if(thisClassName.contains("java.util.List") - || thisClassName.contains("java.util.Vector") - || thisClassName.contains("java.util.Iterator") - || thisClassName.contains("java.util.ListIterator") - || thisClassName.contains("java.util.ArrayList") - || thisClassName.contains("java.util.Stack") - || thisClassName.contains("java.util.Hash") - || thisClassName.contains("java.util.Map") - || thisClassName.contains("java.util.Set") - || thisClassName.contains("java.util.Linked") - || thisClassName.contains("java.lang.Thread")) { - isCollectionType = true; - } - // ���\�b�h����̕��A�̐ݒ� - thread.returnMethod(returnVal, thisObjectId, isCollectionType, timeStamp); - } - } else if (line.startsWith("{\"type\":\"fieldGet\"")) { - // �t�B�[���h�A�N�Z�X - type = line.split("\"this\":"); - thisObj = type[1].split(",\"container\":"); - containerObj = thisObj[1].split(",\"value\":"); - valueObj = containerObj[1].split(",\"threadId\":"); - threadId = valueObj[1].split(",\"lineNum\":"); - lineData = threadId[1].split(",\"time\":"); - thisData = parseClassNameAndObjectId(thisObj[0]); - thisClassName = thisData[0]; - thisObjectId = thisData[1]; - containerData = parseClassNameAndObjectId(containerObj[0]); - containerClassName = containerData[0]; - containerObjectId = containerData[1]; - valueData = parseClassNameAndObjectId(valueObj[0]); - valueClassName = valueData[0]; - valueObjectId = valueData[1]; - thread = threads.get(threadId[0]); - lineNum = Integer.parseInt(lineData[0]); - time = lineData[1].substring(0, lineData[1].length() - 2); // ������ }, ����菜�� - timeStamp = Long.parseLong(time); - // �t�B�[���h�A�N�Z�X�̐ݒ� - if (thread != null) thread.fieldAccess(valueClassName, valueObjectId, containerClassName, containerObjectId, thisClassName, thisObjectId, lineNum, timeStamp); - } else if (line.startsWith("{\"type\":\"fieldSet\"")) { - // �t�B�[���h�X�V - type = line.split(",\"container\":"); - containerObj = type[1].split(",\"value\":"); - valueObj = containerObj[1].split(",\"threadId\":"); - threadId = valueObj[1].split(",\"lineNum\":"); - lineData = threadId[1].split(",\"time\":"); - containerData = parseClassNameAndObjectId(containerObj[0]); - containerClassName = containerData[0]; - containerObjectId = containerData[1]; - valueData = parseClassNameAndObjectId(valueObj[0]); - valueClassName = valueData[0]; - valueObjectId = valueData[1]; - thread = threads.get(threadId[0]); - lineNum = Integer.parseInt(lineData[0]); - time = lineData[1].substring(0, lineData[1].length() - 2); // ������ }, ����菜�� - timeStamp = Long.parseLong(time); - // �t�B�[���h�X�V�̐ݒ� - if (thread != null) thread.fieldUpdate(valueClassName, valueObjectId, containerClassName, containerObjectId, lineNum, timeStamp); - } else if (line.startsWith("{\"type\":\"arrayCreate\"")) { - // �z�񐶐� - type = line.split(",\"array\":"); - arrayObj = type[1].split(",\"dimension\":"); - arrayData = parseClassNameAndObjectId(arrayObj[0]); - arrayClassName = arrayData[0]; - arrayObjectId = arrayData[1]; - dimensionData = arrayObj[1].split(",\"threadId\":"); - dimension = Integer.parseInt(dimensionData[0]); - threadId = dimensionData[1].split(",\"lineNum\":"); - thread = threads.get(threadId[0]); - lineData = threadId[1].split(",\"time\":"); - lineNum = Integer.parseInt(lineData[0]); - time = lineData[1].substring(0, lineData[1].length() - 2); // ������ }, ����菜�� - timeStamp = Long.parseLong(time); - if (thread != null) thread.arrayCreate(arrayClassName, arrayObjectId, dimension, lineNum, timeStamp); - } else if (line.startsWith("{\"type\":\"arraySet\"")) { - // �z��v�f�ւ̑�� - type = line.split(",\"array\":"); - arrayObj = type[1].split(",\"index\":"); - arrayData = parseClassNameAndObjectId(arrayObj[0]); - arrayClassName = arrayData[0]; - arrayObjectId = arrayData[1]; - indexData = arrayObj[1].split(",\"value\":"); - index = Integer.parseInt(indexData[0]); - valueObj = indexData[1].split(",\"threadId\":"); - valueData = parseClassNameAndObjectId(valueObj[0]); - valueClassName = valueData[0]; - valueObjectId = valueData[1]; - threadId = valueObj[1].split(",\"time\":"); - thread = threads.get(threadId[0]); - time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� - timeStamp = Long.parseLong(time); - if (thread != null) thread.arraySet(arrayClassName, arrayObjectId, index, valueClassName, valueObjectId, 0, timeStamp); - } else if (line.startsWith("{\"type\":\"arrayGet\"")) { - // �z��v�f�̎Q�� - type = line.split(",\"array\":"); - arrayObj = type[1].split(",\"index\":"); - arrayData = parseClassNameAndObjectId(arrayObj[0]); - arrayClassName = arrayData[0]; - arrayObjectId = arrayData[1]; - indexData = arrayObj[1].split(",\"value\":"); - index = Integer.parseInt(indexData[0]); - valueObj = indexData[1].split(",\"threadId\":"); - valueData = parseClassNameAndObjectId(valueObj[0]); - valueClassName = valueData[0]; - valueObjectId = valueData[1]; - threadId = valueObj[1].split(",\"time\":"); - thread = threads.get(threadId[0]); - time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� - timeStamp = Long.parseLong(time); - if (thread != null) thread.arrayGet(arrayClassName, arrayObjectId, index, valueClassName, valueObjectId, 0, timeStamp); - } else if (line.startsWith("{\"type\":\"blockEntry\"")) { - // �u���b�N�̊J�n - type = line.split(",\"methodSignature\":\""); - signature = type[1].split("\",\"blockId\":"); - blockIdData = signature[1].split(",\"incomings\":"); - blockId = Integer.parseInt(blockIdData[0]); - incomingsData = blockIdData[1].split(",\"threadId\":"); - incomings = Integer.parseInt(incomingsData[0]); - threadId = incomingsData[1].split(",\"lineNum\":"); - thread = threads.get(threadId[0]); - lineData = threadId[1].split(",\"time\":"); - lineNum = Integer.parseInt(lineData[0]); - time = lineData[1].substring(0, lineData[1].length() - 2); // ������ }, ����菜�� - timeStamp = Long.parseLong(time); - if (thread != null) thread.blockEnter(blockId, incomings, lineNum, timeStamp); - } - } + readJSON(file); file.close(); } catch (IOException e) { e.printStackTrace(); } } + private void readJSON(BufferedReader file) throws IOException { + // �g���[�X�t�@�C���ǂݍ��� + String line = null; + String[] type; + String[] classNameData; + String[] pathData; + String[] signature; + String[] receiver; + String[] arguments; + String[] lineData; + String[] threadId; + String[] thisObj; + String[] containerObj; + String[] valueObj; + String[] returnValue; + String[] arrayObj; + String[] thisData; + String[] containerData; + String[] valueData; + String[] returnData; + String[] fieldData; + String[] arrayData; + String[] blockIdData; + String[] incomingsData; + String[] dimensionData; + String[] indexData; + String className; + String classPath; + String loaderPath; + String time; + String thisObjectId; + String thisClassName; + String containerObjectId; + String containerClassName; + String valueObjectId; + String valueClassName; + String returnClassName; + String returnObjectId; + String arrayObjectId; + String arrayClassName; + String shortSignature; + boolean isConstractor = false; + boolean isCollectionType = false; + boolean isStatic = false; + int dimension; + int index; + int blockId; + int incomings; + int lineNum; + long timeStamp = 0L; + ThreadInstance thread = null; + HashMap> stacks = new HashMap>(); + while ((line = file.readLine()) != null) { + // �g���[�X�t�@�C���̉�� + if (line.startsWith("{\"type\":\"classDef\"")) { + // �N���X��` + type = line.split(",\"name\":\""); + classNameData = type[1].split("\",\"path\":\""); + className = classNameData[0]; + pathData = classNameData[1].split("\",\"loaderPath\":\""); + classPath = pathData[0].substring(1); // �擪�� / ����菜�� + loaderPath = pathData[1].substring(1, pathData[1].length() - 3); // �擪�� / �ƁA������ "}, ����菜�� + initializeClass(className, classPath, loaderPath); + } else if (line.startsWith("{\"type\":\"methodCall\"")) { + // ���\�b�h�Ăяo���̌Ăяo���� + type = line.split(",\"callerSideSignature\":\""); + signature = type[1].split("\",\"threadId\":"); + threadId = signature[1].split(",\"lineNum\":"); + lineNum = Integer.parseInt(threadId[1].substring(0, threadId[1].length() - 2)); // ������ }, ����菜�� + thread = threads.get(threadId[0]); + thread.preCallMethod(signature[0], lineNum); + } else if (line.startsWith("{\"type\":\"methodEntry\"")) { + // ���\�b�h�Ăяo�� + type = line.split("\"signature\":\""); + signature = type[1].split("\",\"receiver\":"); + receiver = signature[1].split(",\"args\":"); + arguments = receiver[1].split(",\"threadId\":"); + threadId = arguments[1].split(",\"time\":"); + thisData = parseClassNameAndObjectId(receiver[0]); + thisClassName = thisData[0]; + thisObjectId = thisData[1]; + isConstractor = false; + isStatic = false; + if (signature[0].contains("static ")) { + isStatic = true; + } + thread = threads.get(threadId[0]); + time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� + timeStamp = Long.parseLong(time); + Stack stack; + if (thread == null) { + thread = new ThreadInstance(threadId[0]); + threads.put(threadId[0], thread); + stack = new Stack(); + stacks.put(threadId[0], stack); + } else { + stack = stacks.get(threadId[0]); + } + stack.push(signature[0]); + // ���\�b�h�Ăяo���̐ݒ� + thread.callMethod(signature[0], null, thisClassName, thisObjectId, isConstractor, isStatic, timeStamp); + // �����̐ݒ� + thread.setArgments(parseArguments(arguments)); + } else if (line.startsWith("{\"type\":\"constructorEntry\"")) { + // �R���X�g���N�^�Ăяo�� + type = line.split("\"signature\":\""); + signature = type[1].split("\",\"class\":\""); + receiver = signature[1].split("\",\"args\":"); + arguments = receiver[1].split(",\"threadId\":"); + threadId = arguments[1].split(",\"time\":"); + thisClassName = receiver[0]; + thisObjectId = "0"; + isConstractor = true; + isStatic = false; + thread = threads.get(threadId[0]); + time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� + timeStamp = Long.parseLong(time); + Stack stack; + if (thread == null) { + thread = new ThreadInstance(threadId[0]); + threads.put(threadId[0], thread); + stack = new Stack(); + stacks.put(threadId[0], stack); + } else { + stack = stacks.get(threadId[0]); + } + stack.push(signature[0]); + // ���\�b�h�Ăяo���̐ݒ� + thread.callMethod(signature[0], null, thisClassName, thisObjectId, isConstractor, isStatic, timeStamp); + // �����̐ݒ� + thread.setArgments(parseArguments(arguments)); + } else if (line.startsWith("{\"type\":\"methodExit\"")) { + // ���\�b�h����̕��A + type = line.split(",\"shortSignature\":\""); + signature = type[1].split("\",\"receiver\":"); + receiver = signature[1].split(",\"returnValue\":"); + returnValue = receiver[1].split(",\"threadId\":"); + threadId = returnValue[1].split(",\"time\":"); + thisData = parseClassNameAndObjectId(receiver[0]); + thisClassName = thisData[0]; + thisObjectId = thisData[1]; + returnData = parseClassNameAndObjectId(returnValue[0]); + returnClassName = returnData[0]; + returnObjectId = returnData[1]; + shortSignature = signature[0]; + time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� + timeStamp = Long.parseLong(time); + Stack stack = stacks.get(threadId[0]); + if (!stack.isEmpty()) { + String line2 = stack.peek(); + if (line2.endsWith(shortSignature)) { + stack.pop(); + } else { + do { + line2 = stack.pop(); + thread.terminateMethod(); + } while (!stack.isEmpty() && !line2.endsWith(shortSignature)); + } + thread = threads.get(threadId[0]); + ObjectReference returnVal = new ObjectReference(returnObjectId, returnClassName); + isCollectionType = false; + if(thisClassName.contains("java.util.List") + || thisClassName.contains("java.util.Vector") + || thisClassName.contains("java.util.Iterator") + || thisClassName.contains("java.util.ListIterator") + || thisClassName.contains("java.util.ArrayList") + || thisClassName.contains("java.util.Stack") + || thisClassName.contains("java.util.Hash") + || thisClassName.contains("java.util.Map") + || thisClassName.contains("java.util.Set") + || thisClassName.contains("java.util.Linked") + || thisClassName.contains("java.lang.Thread")) { + isCollectionType = true; + } + // ���\�b�h����̕��A�̐ݒ� + thread.returnMethod(returnVal, thisObjectId, isCollectionType, timeStamp); + } + } else if (line.startsWith("{\"type\":\"constructorExit\"")) { + // �R���X�g���N�^����̕��A + type = line.split(",\"shortSignature\":\""); + signature = type[1].split("\",\"returnValue\":"); + returnValue = signature[1].split(",\"threadId\":"); + threadId = returnValue[1].split(",\"time\":"); + returnData = parseClassNameAndObjectId(returnValue[0]); + thisClassName = returnClassName = returnData[0]; + thisObjectId = returnObjectId = returnData[1]; + time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� + timeStamp = Long.parseLong(time); + Stack stack = stacks.get(threadId[0]); + shortSignature = signature[0]; + if (!stack.isEmpty()) { + String line2 = stack.peek(); + if (line2.endsWith(shortSignature)) { + stack.pop(); + } else { + do { + line2 = stack.pop(); + thread.terminateMethod(); + } while (!stack.isEmpty() && !line2.endsWith(shortSignature)); + } + thread = threads.get(threadId[0]); + ObjectReference returnVal = new ObjectReference(returnObjectId, returnClassName); + isCollectionType = false; + if(thisClassName.contains("java.util.List") + || thisClassName.contains("java.util.Vector") + || thisClassName.contains("java.util.Iterator") + || thisClassName.contains("java.util.ListIterator") + || thisClassName.contains("java.util.ArrayList") + || thisClassName.contains("java.util.Stack") + || thisClassName.contains("java.util.Hash") + || thisClassName.contains("java.util.Map") + || thisClassName.contains("java.util.Set") + || thisClassName.contains("java.util.Linked") + || thisClassName.contains("java.lang.Thread")) { + isCollectionType = true; + } + // ���\�b�h����̕��A�̐ݒ� + thread.returnMethod(returnVal, thisObjectId, isCollectionType, timeStamp); + } + } else if (line.startsWith("{\"type\":\"fieldGet\"")) { + // �t�B�[���h�A�N�Z�X + type = line.split(",\"fieldName\":\""); + fieldData = type[1].split("\",\"this\":"); + thisObj = fieldData[1].split(",\"container\":"); + containerObj = thisObj[1].split(",\"value\":"); + valueObj = containerObj[1].split(",\"threadId\":"); + threadId = valueObj[1].split(",\"lineNum\":"); + lineData = threadId[1].split(",\"time\":"); + thisData = parseClassNameAndObjectId(thisObj[0]); + thisClassName = thisData[0]; + thisObjectId = thisData[1]; + containerData = parseClassNameAndObjectId(containerObj[0]); + containerClassName = containerData[0]; + containerObjectId = containerData[1]; + valueData = parseClassNameAndObjectId(valueObj[0]); + valueClassName = valueData[0]; + valueObjectId = valueData[1]; + thread = threads.get(threadId[0]); + lineNum = Integer.parseInt(lineData[0]); + time = lineData[1].substring(0, lineData[1].length() - 2); // ������ }, ����菜�� + timeStamp = Long.parseLong(time); + // �t�B�[���h�A�N�Z�X�̐ݒ� + if (thread != null) thread.fieldAccess(fieldData[0], valueClassName, valueObjectId, containerClassName, containerObjectId, thisClassName, thisObjectId, lineNum, timeStamp); + } else if (line.startsWith("{\"type\":\"fieldSet\"")) { + // �t�B�[���h�X�V + type = line.split(",\"fieldName\":\""); + fieldData = type[1].split("\",\"container\":"); + containerObj = fieldData[1].split(",\"value\":"); + valueObj = containerObj[1].split(",\"threadId\":"); + threadId = valueObj[1].split(",\"lineNum\":"); + lineData = threadId[1].split(",\"time\":"); + containerData = parseClassNameAndObjectId(containerObj[0]); + containerClassName = containerData[0]; + containerObjectId = containerData[1]; + valueData = parseClassNameAndObjectId(valueObj[0]); + valueClassName = valueData[0]; + valueObjectId = valueData[1]; + thread = threads.get(threadId[0]); + lineNum = Integer.parseInt(lineData[0]); + time = lineData[1].substring(0, lineData[1].length() - 2); // ������ }, ����菜�� + timeStamp = Long.parseLong(time); + // �t�B�[���h�X�V�̐ݒ� + if (thread != null) thread.fieldUpdate(fieldData[0], valueClassName, valueObjectId, containerClassName, containerObjectId, lineNum, timeStamp); + } else if (line.startsWith("{\"type\":\"arrayCreate\"")) { + // �z�񐶐� + type = line.split(",\"array\":"); + arrayObj = type[1].split(",\"dimension\":"); + arrayData = parseClassNameAndObjectId(arrayObj[0]); + arrayClassName = arrayData[0]; + arrayObjectId = arrayData[1]; + dimensionData = arrayObj[1].split(",\"threadId\":"); + dimension = Integer.parseInt(dimensionData[0]); + threadId = dimensionData[1].split(",\"lineNum\":"); + thread = threads.get(threadId[0]); + lineData = threadId[1].split(",\"time\":"); + lineNum = Integer.parseInt(lineData[0]); + time = lineData[1].substring(0, lineData[1].length() - 2); // ������ }, ����菜�� + timeStamp = Long.parseLong(time); + if (thread != null) thread.arrayCreate(arrayClassName, arrayObjectId, dimension, lineNum, timeStamp); + } else if (line.startsWith("{\"type\":\"arraySet\"")) { + // �z��v�f�ւ̑�� + type = line.split(",\"array\":"); + arrayObj = type[1].split(",\"index\":"); + arrayData = parseClassNameAndObjectId(arrayObj[0]); + arrayClassName = arrayData[0]; + arrayObjectId = arrayData[1]; + indexData = arrayObj[1].split(",\"value\":"); + index = Integer.parseInt(indexData[0]); + valueObj = indexData[1].split(",\"threadId\":"); + valueData = parseClassNameAndObjectId(valueObj[0]); + valueClassName = valueData[0]; + valueObjectId = valueData[1]; + threadId = valueObj[1].split(",\"time\":"); + thread = threads.get(threadId[0]); + time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� + timeStamp = Long.parseLong(time); + if (thread != null) thread.arraySet(arrayClassName, arrayObjectId, index, valueClassName, valueObjectId, 0, timeStamp); + } else if (line.startsWith("{\"type\":\"arrayGet\"")) { + // �z��v�f�̎Q�� + type = line.split(",\"array\":"); + arrayObj = type[1].split(",\"index\":"); + arrayData = parseClassNameAndObjectId(arrayObj[0]); + arrayClassName = arrayData[0]; + arrayObjectId = arrayData[1]; + indexData = arrayObj[1].split(",\"value\":"); + index = Integer.parseInt(indexData[0]); + valueObj = indexData[1].split(",\"threadId\":"); + valueData = parseClassNameAndObjectId(valueObj[0]); + valueClassName = valueData[0]; + valueObjectId = valueData[1]; + threadId = valueObj[1].split(",\"time\":"); + thread = threads.get(threadId[0]); + time = threadId[1].substring(0, threadId[1].length() - 2); // ������ }, ����菜�� + timeStamp = Long.parseLong(time); + if (thread != null) thread.arrayGet(arrayClassName, arrayObjectId, index, valueClassName, valueObjectId, 0, timeStamp); + } else if (line.startsWith("{\"type\":\"blockEntry\"")) { + // �u���b�N�̊J�n + type = line.split(",\"methodSignature\":\""); + signature = type[1].split("\",\"blockId\":"); + blockIdData = signature[1].split(",\"incomings\":"); + blockId = Integer.parseInt(blockIdData[0]); + incomingsData = blockIdData[1].split(",\"threadId\":"); + incomings = Integer.parseInt(incomingsData[0]); + threadId = incomingsData[1].split(",\"lineNum\":"); + thread = threads.get(threadId[0]); + lineData = threadId[1].split(",\"time\":"); + lineNum = Integer.parseInt(lineData[0]); + time = lineData[1].substring(0, lineData[1].length() - 2); // ������ }, ����菜�� + timeStamp = Long.parseLong(time); + if (thread != null) thread.blockEnter(blockId, incomings, lineNum, timeStamp); + } + } + } + /** * �N���X���ƃI�u�W�F�N�gID��\��JSON�I�u�W�F�N�g����ǂ��� * @param classNameAndObjectIdJSON �g���[�X�t�@�C������JSON�I�u�W�F�N�g diff --git a/org.ntlab.traceAnalyzer/traces/jEditNormal.trace b/org.ntlab.traceAnalyzer/traces/jEditNormal.trace new file mode 100644 index 0000000..6adcd64 --- /dev/null +++ b/org.ntlab.traceAnalyzer/traces/jEditNormal.trace Binary files differ