diff --git a/src/org/ntlab/traceDebugger/DebuggingController.java b/src/org/ntlab/traceDebugger/DebuggingController.java index 0d73667..1879b4e 100644 --- a/src/org/ntlab/traceDebugger/DebuggingController.java +++ b/src/org/ntlab/traceDebugger/DebuggingController.java @@ -17,6 +17,7 @@ import org.ntlab.traceAnalysisPlatform.tracer.trace.TraceJSON; import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; import org.ntlab.traceDebugger.analyzerProvider.DeltaExtractionAnalyzer; +import org.ntlab.traceDebugger.analyzerProvider.VariableUpdatePointFinder; public class DebuggingController { private static final DebuggingController theInstance = new DebuggingController(); @@ -50,7 +51,10 @@ fileDialog.setFilterExtensions(new String[]{"*.*"}); String path = fileDialog.open(); if (path == null) return false; - TraceDebuggerPlugin.setAnalyzer(new DeltaExtractionAnalyzer(new TraceJSON(path))); + TraceJSON trace = new TraceJSON(path); + TraceDebuggerPlugin.setAnalyzer(new DeltaExtractionAnalyzer(trace)); +// new VariableUpdatePointFinder(trace); + VariableUpdatePointFinder.getInstance().setTrace(trace); traceBreakPoints.clear(); ((CallStackView)getOtherView(CallStackView.ID)).reset(); ((VariableView)getOtherView(VariableView.ID)).reset(); @@ -138,7 +142,7 @@ refresh(null, debuggingTp, false); return true; } - + public boolean stepOverAction() { if (debuggingTp == null) return false; TracePoint previousTp = debuggingTp; @@ -319,6 +323,7 @@ callStackView.updateByTracePoint(to); VariableView variableView = ((VariableView)getOtherView(VariableView.ID)); if (!isReturned && canDifferentialUpdateVariables) { +// variableView.updateVariablesByTracePoint(from, to, isReturned); variableView.updateVariablesForDifferential(from, to, isReturned); } else { variableView.updateVariablesByTracePoint(from, to, isReturned); diff --git a/src/org/ntlab/traceDebugger/Variable.java b/src/org/ntlab/traceDebugger/Variable.java index 657043d..664e21c 100644 --- a/src/org/ntlab/traceDebugger/Variable.java +++ b/src/org/ntlab/traceDebugger/Variable.java @@ -16,6 +16,7 @@ import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; import org.ntlab.traceAnalysisPlatform.tracer.trace.TraceJSON; import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; +import org.ntlab.traceDebugger.analyzerProvider.VariableUpdatePointFinder; public class Variable { private String variableName; @@ -198,7 +199,7 @@ IType type = JavaElementFinder.findIType(null, valueClassName); if (type == null) return; getFieldsState(type); -// getFieldStateForSuperClass(type); // �e�N���X��k���Ă����A�����̃N���X�Œ�`���ꂽ�t�B�[���h�̏����擾���Ă��� (�������������������Ĕ��ɏd���Ȃ�) + getFieldStateForSuperClass(type); // �e�N���X��k���Ă����A�����̃N���X�Œ�`���ꂽ�t�B�[���h�̏����擾���Ă��� (�������������������Ĕ��ɏd���Ȃ�) } /** @@ -232,7 +233,10 @@ TraceJSON trace = (TraceJSON)TraceDebuggerPlugin.getAnalyzer().getTrace(); // FieldUpdate fieldUpdate = trace.getRecentlyFieldUpdate(thisObjData.getId(), fieldName, tp); // FieldUpdate fieldUpdate = trace.getFieldUpdate(id, fullyQualifiedFieldName, before, isReturned); - TracePoint updateTracePoint = trace.getFieldUpdateTracePoint(valueId, fullyQualifiedFieldName, before, isReturned); + +// TracePoint updateTracePoint = trace.getFieldUpdateTracePoint(valueId, fullyQualifiedFieldName, before, isReturned); + TracePoint updateTracePoint = VariableUpdatePointFinder.getInstance().getPoint(valueId, fullyQualifiedFieldName, before); + // if (updateTracePoint == null) continue; if (updateTracePoint != null) { FieldUpdate fieldUpdate = (FieldUpdate)updateTracePoint.getStatement(); diff --git a/src/org/ntlab/traceDebugger/Variables.java b/src/org/ntlab/traceDebugger/Variables.java index 561e41d..4f1ec42 100644 --- a/src/org/ntlab/traceDebugger/Variables.java +++ b/src/org/ntlab/traceDebugger/Variables.java @@ -94,12 +94,22 @@ String thisClassName = me.getThisClassName(); Variable variable = new Variable(RETURN_VARIABLE_NAME, thisClassName, thisObjId, returnValueClassName, returnValueId, from, isReturned); variable.createNextHierarchyState(); - Variable old = roots.get(0); - if (old.getVariableName().equals(RETURN_VARIABLE_NAME)) { - roots.set(0, variable); + if (roots.size() > 0) { + Variable old = roots.get(0); + if (old.getVariableName().equals(RETURN_VARIABLE_NAME)) { + roots.set(0, variable); + } else { + roots.add(0, variable); + } } else { - roots.add(0, variable); + roots.add(0, variable); } +// Variable old = roots.get(0); +// if (old.getVariableName().equals(RETURN_VARIABLE_NAME)) { +// roots.set(0, variable); +// } else { +// roots.add(0, variable); +// } } } diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/VariableUpdatePointFinder.java b/src/org/ntlab/traceDebugger/analyzerProvider/VariableUpdatePointFinder.java new file mode 100644 index 0000000..66f7131 --- /dev/null +++ b/src/org/ntlab/traceDebugger/analyzerProvider/VariableUpdatePointFinder.java @@ -0,0 +1,95 @@ +package org.ntlab.traceDebugger.analyzerProvider; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; +import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; +import org.ntlab.traceAnalysisPlatform.tracer.trace.Statement; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ThreadInstance; +import org.ntlab.traceAnalysisPlatform.tracer.trace.Trace; +import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; + +public class VariableUpdatePointFinder { + private static VariableUpdatePointFinder theInstance = new VariableUpdatePointFinder(); + private Trace trace; + private Map>> updatePoints = new HashMap<>(); + + public void setTrace(Trace trace) { + this.trace = trace; + init(); + } + + public static VariableUpdatePointFinder getInstance() { + return theInstance; + } + + private void init() { + registerVariableUpdatePoints(); + System.out.println(updatePoints); + sort(); + System.out.println(updatePoints); + } + + private void registerVariableUpdatePoints() { + for (Map.Entry entry : trace.getAllThreads().entrySet()) { + ThreadInstance thread = entry.getValue(); + for (MethodExecution me : thread.getRoot()) { + TracePoint start = me.getEntryPoint(); + while (start.stepFull()) { + Statement statement = start.getStatement(); + if (statement instanceof FieldUpdate) { + FieldUpdate fu = (FieldUpdate)statement; + String objectId = fu.getContainerObjId(); + String fieldName = fu.getFieldName(); + Map> innerMap = updatePoints.get(objectId); + if (innerMap == null) { + innerMap = new HashMap<>(); + updatePoints.put(objectId, innerMap); + } + List tracePoints = innerMap.get(fieldName); + if (tracePoints == null) { + tracePoints = new ArrayList<>(); + innerMap.put(fieldName, tracePoints); + } + tracePoints.add(start.duplicate()); + } + } + } + } + } + + private void sort() { + for (Map> innerMap : updatePoints.values()) { + for (List tracePoints : innerMap.values()) { + Collections.sort(tracePoints, new Comparator() { + @Override + public int compare(TracePoint arg0, TracePoint arg1) { + long time0 = arg0.getStatement().getTimeStamp(); + long time1 = arg1.getStatement().getTimeStamp(); + return (time0 < time1) ? -1 : 1; + } + }); + } + } + } + + public TracePoint getPoint(String objectId, String fieldName, TracePoint before) { + Map> innerMap = updatePoints.get(objectId); + if (innerMap == null) return null; + List tracePoints = innerMap.get(fieldName); + if (tracePoints == null) return null; + long beforeTime = before.getStatement().getTimeStamp(); + TracePoint tmp = null; + for (TracePoint tp : tracePoints) { + long time = tp.getStatement().getTimeStamp(); + if (time >= beforeTime) return tmp; + tmp = tp; + } + return tmp; + } +}