diff --git a/src/org/ntlab/traceDebugger/DebuggingController.java b/src/org/ntlab/traceDebugger/DebuggingController.java index 89ce1f9..420d8e3 100644 --- a/src/org/ntlab/traceDebugger/DebuggingController.java +++ b/src/org/ntlab/traceDebugger/DebuggingController.java @@ -1,5 +1,10 @@ package org.ntlab.traceDebugger; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; @@ -9,8 +14,12 @@ import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayUpdate; import org.ntlab.traceAnalysisPlatform.tracer.trace.BlockEnter; +import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; +import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodInvocation; +import org.ntlab.traceAnalysisPlatform.tracer.trace.Statement; import org.ntlab.traceAnalysisPlatform.tracer.trace.TraceJSON; import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; import org.ntlab.traceDebugger.analyzerProvider.DeltaExtractionAnalyzer; @@ -136,16 +145,48 @@ return true; } +// public boolean stepOverAction() { +// if (debuggingTp == null) return false; +// TracePoint previousTp = debuggingTp; +// debuggingTp = debuggingTp.duplicate(); +// int currentLineNo = debuggingTp.getStatement().getLineNo(); +// boolean isReturned; +// while (!(isReturned = !(debuggingTp.stepOver()))) { +// if (currentLineNo != debuggingTp.getStatement().getLineNo()) break; +// previousTp = debuggingTp.duplicate(); +// } +// if (debuggingTp.getStatement() instanceof BlockEnter) { +// debuggingTp.stepFull(); +// } +// if (!debuggingTp.isValid()) { +// terminateAction(); +// MessageDialog.openInformation(null, "Terminate", "This trace is terminated"); +// return false; +// } +// refresh(previousTp, debuggingTp, isReturned); +// return true; +// } + public boolean stepOverAction() { if (debuggingTp == null) return false; TracePoint previousTp = debuggingTp; debuggingTp = debuggingTp.duplicate(); int currentLineNo = debuggingTp.getStatement().getLineNo(); - boolean isReturned; - while (!(isReturned = !(debuggingTp.stepOver()))) { - if (currentLineNo != debuggingTp.getStatement().getLineNo()) break; + boolean isThroughOnMethodInvocation = false; + boolean isReturned = false; + do { + Statement statement = debuggingTp.getStatement(); + if (currentLineNo != statement.getLineNo()) break; + if (!isThroughOnMethodInvocation) { + if (statement instanceof MethodInvocation) { + isThroughOnMethodInvocation = true; + } else if (statement instanceof FieldUpdate || statement instanceof ArrayUpdate) { + Variables.getInstance().addDifferentialUpdatePoint(debuggingTp); + } + } previousTp = debuggingTp.duplicate(); - } + } while (!(isReturned = !(debuggingTp.stepOver()))); + if (debuggingTp.getStatement() instanceof BlockEnter) { debuggingTp.stepFull(); } @@ -154,7 +195,7 @@ MessageDialog.openInformation(null, "Terminate", "This trace is terminated"); return false; } - refresh(previousTp, debuggingTp, isReturned); + refresh(previousTp, debuggingTp, isReturned, !isThroughOnMethodInvocation); return true; } @@ -176,7 +217,13 @@ if (debuggingTp == null) return false; TracePoint previousTp = debuggingTp; debuggingTp = debuggingTp.duplicate(); - boolean isReturned = false; + boolean isThroughOnMethodInvocation = false; + Statement statement = debuggingTp.getStatement(); + if (statement instanceof MethodInvocation) { + isThroughOnMethodInvocation = true; + } else if (statement instanceof FieldUpdate || statement instanceof ArrayUpdate) { + Variables.getInstance().addDifferentialUpdatePoint(debuggingTp); + } debuggingTp.stepNext(); if (debuggingTp.getStatement() instanceof BlockEnter) { debuggingTp.stepFull(); @@ -186,8 +233,9 @@ MessageDialog.openInformation(null, "Terminate", "This trace is terminated"); return false; } - refresh(previousTp, debuggingTp, isReturned); - return true; + boolean isReturned = false; + refresh(previousTp, debuggingTp, isReturned, !isThroughOnMethodInvocation); + return true; } public boolean resumeAction() { @@ -277,23 +325,24 @@ } private void refresh(TracePoint from, TracePoint to, boolean isReturned) { + refresh(from, to, isReturned, false); + } + + private void refresh(TracePoint from, TracePoint to, boolean isReturned, boolean canDifferentialUpdateVariables) { MethodExecution me = to.getMethodExecution(); int lineNo = to.getStatement().getLineNo(); JavaEditorOperator.openSrcFileOfMethodExecution(me, lineNo); CallStackView callStackView = ((CallStackView)getOtherView(CallStackView.ID)); callStackView.updateByTracePoint(to); - ((VariableView)getOtherView(VariableView.ID)).updateVariablesByTracePoint(from, to, isReturned); + VariableView variableView = ((VariableView)getOtherView(VariableView.ID)); + if (!isReturned && canDifferentialUpdateVariables) { + variableView.updateVariablesForDifferential(); + } else { + variableView.updateVariablesByTracePoint(from, to, isReturned); + } +// ((VariableView)getOtherView(VariableView.ID)).updateVariablesByTracePoint(from, to, isReturned); } -// private void refresh(boolean isReturned) { -// MethodExecution me = debuggingTp.getMethodExecution(); -// int lineNo = debuggingTp.getStatement().getLineNo(); -// JavaEditorOperator.openSrcFileOfMethodExecution(me, lineNo); -// CallStackView callStackView = ((CallStackView)getOtherView(CallStackView.ID)); -// callStackView.updateByTracePoint(debuggingTp); -// ((VariableView)getOtherView(VariableView.ID)).updateVariablesByTracePoint(debuggingTp, isReturned); -// } - private IViewPart getOtherView(String viewId) { IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); try { diff --git a/src/org/ntlab/traceDebugger/Variable.java b/src/org/ntlab/traceDebugger/Variable.java index 4bd9e15..8fd9f40 100644 --- a/src/org/ntlab/traceDebugger/Variable.java +++ b/src/org/ntlab/traceDebugger/Variable.java @@ -19,8 +19,9 @@ public class Variable { private String variableName; - private String className; - private String id; + private String fullyQualifiedVariableName; + private String valueClassName; + private String valueId; private Variable parent; private List children = new ArrayList<>(); private String containerClassName; @@ -34,27 +35,46 @@ private Map additionalAttributes = new HashMap<>(); public Variable(String variableName, String containerClassName, String containerId, - String className, String id, TracePoint before, boolean isReturned) { - this(variableName, containerClassName, containerId, className, id, null, before, isReturned); + String valueClassName, String valueId, TracePoint before, boolean isReturned) { + this(variableName, containerClassName, containerId, valueClassName, valueId, null, before, isReturned); } public Variable(String variableName, String containerClassName, String containerId, - String className, String id, TracePoint lastUpdatePoint, TracePoint before, boolean isReturned) { + String valueClassName, String valueId, TracePoint lastUpdatePoint, TracePoint before, boolean isReturned) { + init(variableName, variableName, containerClassName, containerId, valueClassName, valueId, lastUpdatePoint, before, isReturned); + } + + public Variable(String variableName, String fullyQualifiedVariableName, String containerClassName, String containerId, + String valueClassName, String valueId, TracePoint lastUpdatePoint, TracePoint before, boolean isReturned) { + init(variableName, fullyQualifiedVariableName, containerClassName, containerId, valueClassName, valueId, lastUpdatePoint, before, isReturned); + } + + private void init(String variableName, String fullyQualifiedVariableName, String containerClassName, String containerId, + String valueClassName, String valueId, TracePoint lastUpdatePoint, TracePoint before, boolean isReturned) { this.variableName = variableName; + this.fullyQualifiedVariableName = fullyQualifiedVariableName; this.containerClassName = containerClassName; this.containerId = containerId; - this.className = className; - this.id = id; + this.valueClassName = valueClassName; + this.valueId = valueId; this.lastUpdatePoint = lastUpdatePoint; this.before = before; this.isReturned = isReturned; - this.deepHierarchy = checkDeepHierarchy(); + this.deepHierarchy = checkDeepHierarchy(); + } + + public void update(String valueClassName, String valueId, TracePoint lastUpdatePoint, boolean isReturned) { + init(variableName, fullyQualifiedVariableName, containerClassName, containerId, valueClassName, valueId, lastUpdatePoint, lastUpdatePoint, isReturned); } public String getVariableName() { return variableName; } + public String getFullyQualifiedVariableName() { + return fullyQualifiedVariableName; + } + public String getContainerClassName() { return containerClassName; } @@ -63,12 +83,12 @@ return containerId; } - public String getClassName() { - return className; + public String getValueClassName() { + return valueClassName; } - public String getId() { - return id; + public String getValueId() { + return valueId; } public TracePoint getLastUpdatePoint() { @@ -94,7 +114,7 @@ @Override public String toString() { - return variableName + ": " + className + "(" + "id = " + id + ")"; + return variableName + ": " + valueClassName + "(" + "id = " + valueId + ")"; } /** @@ -106,20 +126,20 @@ */ private DeepHierarchy checkDeepHierarchy() { // �t�B�[���h��ID��Type���Ȃ��ꍇ��AType(=ActualType)��"---"�̏ꍇ�͉������Ȃ� - if (this.getId() == null || this.getId().isEmpty() - || this.getClassName() == null || this.getClassName().isEmpty()) { + if (this.getValueId() == null || this.getValueId().isEmpty() + || this.getValueClassName() == null || this.getValueClassName().isEmpty()) { return DeepHierarchy.NONE; } final String NULL_ACTUAL_TYPE = "---"; // �t�B�[���h�ɑ΂��Ė����I��null����ꂽ�ꍇ��ActualType�̎擾������ - if (this.getClassName().equals(NULL_ACTUAL_TYPE)) return DeepHierarchy.NONE; + if (this.getValueClassName().equals(NULL_ACTUAL_TYPE)) return DeepHierarchy.NONE; final String ARRAY_SIGNATURE_HEAD = "["; // �z��̃V�O�l�`���̐擪�́A�z��̎��������� [ ���A�Ȃ� - if (this.getClassName().startsWith(ARRAY_SIGNATURE_HEAD)) { + if (this.getValueClassName().startsWith(ARRAY_SIGNATURE_HEAD)) { // �t�B�[���h��Type���z��^(�@[ �Ŏn�܂�@)�ꍇ (���̔z�񂪎��Še�v�f�ɂ‚��Ă���Ȃ�f�[�^�擾�������Ăяo��) return DeepHierarchy.ARRAY; } else { String[] primitives = {"byte", "short", "int", "long", "float", "double", "char", "boolean"}; - if (!Arrays.asList(primitives).contains(this.getClassName())) { + if (!Arrays.asList(primitives).contains(this.getValueClassName())) { // �t�B�[���h��Type���Q�ƌ^(=�I�u�W�F�N�g)�̏ꍇ (���̃I�u�W�F�N�g�������Ă���t�B�[���h�ɂ‚��Ă���Ȃ�f�[�^�擾�������Ăяo��) return DeepHierarchy.FIELD; } @@ -171,7 +191,7 @@ private void getFieldsState() { // �t�B�[���h��ID��Type���擾���ĕ\�� - IType type = JavaEditorOperator.findIType(null, className); + IType type = JavaEditorOperator.findIType(null, valueClassName); if (type == null) return; getFieldsState(type); @@ -202,78 +222,41 @@ 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(id, fullyQualifiedFieldName, before, isReturned); + TracePoint updateTracePoint = trace.getFieldUpdateTracePoint(valueId, fullyQualifiedFieldName, before, isReturned); // if (updateTracePoint == null) continue; if (updateTracePoint != null) { FieldUpdate fieldUpdate = (FieldUpdate)updateTracePoint.getStatement(); // �t�B�[���h��ID��Type���擾(String) String fieldObjId = (fieldUpdate != null) ? fieldUpdate.getValueObjId() : "0"; String fieldType = (fieldUpdate != null) ? fieldUpdate.getValueClassName() : "---"; - Variable fieldData = new Variable(fieldName, className, id, fieldType, fieldObjId, updateTracePoint, before, isReturned); + Variable fieldData = new Variable(fieldName, fullyQualifiedFieldName, valueClassName, valueId, fieldType, fieldObjId, updateTracePoint, before, isReturned); this.addChild(fieldData); } else { - Variable fieldData = new Variable(fieldName, className, id, "?", "???", updateTracePoint, before, isReturned); + Variable fieldData = new Variable(fieldName, fullyQualifiedFieldName, valueClassName, valueId, "?", "???", updateTracePoint, before, isReturned); this.addChild(fieldData); } } } catch (JavaModelException e) { e.printStackTrace(); - } + } } -// private void getFieldsState() { -// // �t�B�[���h��ID��Type���擾���ĕ\�� -// TraceJSON trace = (TraceJSON)TraceDebuggerPlugin.getAnalyzer().getTrace(); -// String declaringClassName = className; -// IType type = JavaEditorOperator.findIType(null, declaringClassName); -// if (type == null) { -// System.out.println("IType == null: " + declaringClassName); -// return; -// } -// try { -// for (IField field : type.getFields()) { -// if (Flags.isStatic(field.getFlags())) continue; -// String fieldName = field.getDeclaringType().getElementName() + "." + field.getElementName(); // ���S����N���X�� -// String fullyQualifiedFieldName = field.getDeclaringType().getFullyQualifiedName() + "." + field.getElementName(); // ���S����N���X�� -// -// // ���̃t�B�[���h�ɂ‚��Ă̍ŐV�̍X�V�����擾(FieldUpdate) -//// FieldUpdate fieldUpdate = trace.getRecentlyFieldUpdate(thisObjData.getId(), fieldName, tp); -//// FieldUpdate fieldUpdate = trace.getFieldUpdate(id, fullyQualifiedFieldName, before, isReturned); -// TracePoint updateTracePoint = trace.getFieldUpdateTracePoint(id, fullyQualifiedFieldName, before, isReturned); -//// if (updateTracePoint == null) continue; -// if (updateTracePoint != null) { -// FieldUpdate fieldUpdate = (FieldUpdate)updateTracePoint.getStatement(); -// // �t�B�[���h��ID��Type���擾(String) -// String fieldObjId = (fieldUpdate != null) ? fieldUpdate.getValueObjId() : "0"; -// String fieldType = (fieldUpdate != null) ? fieldUpdate.getValueClassName() : "---"; -// Variable fieldData = new Variable(fieldName, className, id, fieldType, fieldObjId, updateTracePoint, before, isReturned); -// this.addChild(fieldData); -// } else { -// Variable fieldData = new Variable(fieldName, className, id, "?", "???", updateTracePoint, before, isReturned); -// this.addChild(fieldData); -// } -// } -// } catch (JavaModelException e) { -// e.printStackTrace(); -// } -// } - private void getArrayState() { TraceJSON trace = (TraceJSON)TraceDebuggerPlugin.getAnalyzer().getTrace(); for (int i = 0;; i++){ // ���̔z��v�f�ɂ‚��Ă̍ŐV�̍X�V�����擾(ArrayUpdate) - ArrayUpdate arrayUpdate = trace.getRecentlyArrayUpdate(id, i, before); + ArrayUpdate arrayUpdate = trace.getRecentlyArrayUpdate(valueId, i, before); if (arrayUpdate == null) { // �z��̃T�C�Y���擾�ł��Ȃ����߁A�C���f�b�N�X���T�C�Y���߂̂Ƃ��Ɋm���ɔ���������@�Ƃ��ĉ����� // �������A�z��v�f�̓r���ɖ���`���������ꍇ�ł��A�����Ă��܂��̂����_ break; } - String arrayIndexName = this.getVariableName() + "[" + i + "]"; + String arrayIndexName = variableName + "[" + i + "]"; // �z��v�f��ID��Type���擾(String) String valueObjId = arrayUpdate.getValueObjectId(); String valueType = arrayUpdate.getValueClassName(); - Variable arrayIndexData = new Variable(arrayIndexName, className, id, valueType, valueObjId, before, isReturned); + Variable arrayIndexData = new Variable(arrayIndexName, valueClassName, valueId, valueType, valueObjId, before, isReturned); this.addChild(arrayIndexData); } } diff --git a/src/org/ntlab/traceDebugger/VariableLabelProvider.java b/src/org/ntlab/traceDebugger/VariableLabelProvider.java index ab259c6..2e65e31 100644 --- a/src/org/ntlab/traceDebugger/VariableLabelProvider.java +++ b/src/org/ntlab/traceDebugger/VariableLabelProvider.java @@ -29,10 +29,10 @@ } return variableName; case 1: - String simpleName = variableData.getClassName(); + String simpleName = variableData.getValueClassName(); simpleName = simpleName.substring(simpleName.lastIndexOf(".") + 1); // return variableData.getClassName() + " (" + "id = " + variableData.getId() + ")"; - return simpleName + " (" + "id = " + variableData.getId() + ")"; + return simpleName + " (" + "id = " + variableData.getValueId() + ")"; } } } diff --git a/src/org/ntlab/traceDebugger/VariableView.java b/src/org/ntlab/traceDebugger/VariableView.java index 21bb95f..1d12b41 100644 --- a/src/org/ntlab/traceDebugger/VariableView.java +++ b/src/org/ntlab/traceDebugger/VariableView.java @@ -174,8 +174,8 @@ InputDialog inputContainerTypeDialog = new InputDialog(null, "Extract Delta for Collection", "Input cotainer type", "java.util.ArrayList", null); if (inputContainerTypeDialog.open() != InputDialog.OK) return; String containerType = inputContainerTypeDialog.getValue(); - String valueId = selectedVariable.getId(); - String valueType = selectedVariable.getClassName(); + String valueId = selectedVariable.getValueId(); + String valueType = selectedVariable.getValueClassName(); TracePoint tp = DebuggingController.getInstance().getCurrentTp(); Variable variable = new Variable("tmp", containerType, containerId, valueType, valueId, tp, false); delta(variable, true, false); @@ -261,6 +261,11 @@ variables.updateAllObjectDataByTracePoint(from, to, isReturned); viewer.setInput(variables.getVariablesTreeNodes()); } + + public void updateVariablesForDifferential() { + variables.updateForDifferential(); + viewer.refresh(); + } public void markAndExpandVariablesByDeltaMarkers(Map> markers) { List srcSideDeltaMarkers = markers.get(DeltaMarkerManager.SRC_SIDE_DELTA_MARKER); diff --git a/src/org/ntlab/traceDebugger/Variables.java b/src/org/ntlab/traceDebugger/Variables.java index b0c5bfd..42eb16a 100644 --- a/src/org/ntlab/traceDebugger/Variables.java +++ b/src/org/ntlab/traceDebugger/Variables.java @@ -1,6 +1,7 @@ package org.ntlab.traceDebugger; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -9,6 +10,8 @@ import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.viewers.TreeNode; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayUpdate; +import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodInvocation; import org.ntlab.traceAnalysisPlatform.tracer.trace.ObjectReference; @@ -18,6 +21,7 @@ public class Variables { private static final Variables theInstance = new Variables(); private List roots = new ArrayList<>(); + private Map> containerIdToDifferentialUpdateTracePoints = new HashMap<>(); public static final String RETURN_VARIABLE_NAME = "return"; public static Variables getInstance() { @@ -140,7 +144,7 @@ private void addAdditionalAttributes(Variable variable, final Set idSet, final Map additionalAttributes) { if (variable == null) return; - if (idSet.contains(variable.getId())) { + if (idSet.contains(variable.getValueId())) { for (Map.Entry entry : additionalAttributes.entrySet()) { variable.addAdditionalAttribute(entry.getKey(), entry.getValue()); } @@ -150,7 +154,67 @@ } } + public boolean canDifferentalUpdatePoint() { + return !(containerIdToDifferentialUpdateTracePoints.isEmpty()); + } + + public void addDifferentialUpdatePoint(TracePoint tp) { + Statement statement = tp.getStatement(); + String containerId = null; + if (statement instanceof FieldUpdate) { + FieldUpdate fu = (FieldUpdate)statement; + containerId = fu.getContainerObjId(); + } else if (statement instanceof ArrayUpdate) { + ArrayUpdate au = (ArrayUpdate)statement; + containerId = au.getArrayObjectId(); + } + if (containerId == null) return; + List tracePoints = containerIdToDifferentialUpdateTracePoints.get(containerId); + if (tracePoints == null) { + tracePoints = new ArrayList(); + containerIdToDifferentialUpdateTracePoints.put(containerId, tracePoints); + } + tracePoints.add(tp.duplicate()); + } + + public void updateForDifferential() { + for (Variable variable : roots) { + updateForDifferential(variable); + } + containerIdToDifferentialUpdateTracePoints.clear(); + } + + private void updateForDifferential(Variable variable) { + Set containerIdList = containerIdToDifferentialUpdateTracePoints.keySet(); + String containerId = variable.getContainerId(); + if (containerIdList.contains(containerId)) { + for (TracePoint tp : containerIdToDifferentialUpdateTracePoints.get(containerId)) { + Statement statement = tp.getStatement(); + if (statement instanceof FieldUpdate) { + FieldUpdate fu = (FieldUpdate)statement; + if (variable.getFullyQualifiedVariableName().equals(fu.getFieldName())) { + String valueClassName = fu.getValueClassName(); + String valueId = fu.getValueObjId(); + variable.update(valueClassName, valueId, tp, false); + } + } else if (statement instanceof ArrayUpdate) { + ArrayUpdate au = (ArrayUpdate)statement; + String fullyQualifiedVariableName = variable.getFullyQualifiedVariableName(); + if (fullyQualifiedVariableName.contains("[" + au.getIndex() + "]")) { + String valueClassName = au.getValueClassName(); + String valueId = au.getValueObjectId(); + variable.update(valueClassName, valueId, tp, false); + } + } + } + } + for (Variable child : variable.getChildren()) { + updateForDifferential(child); + } + } + public void resetData() { roots.clear(); + containerIdToDifferentialUpdateTracePoints.clear(); } } diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java index dd0bf78..82856c4 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java @@ -51,8 +51,8 @@ addDeltaMarkerView(deltaMarkerViewSubId, deltaMarkerView); String srcId = variable.getContainerId(); String srcClassName = variable.getContainerClassName(); - String dstId = variable.getId(); - String dstClassName = variable.getClassName(); + String dstId = variable.getValueId(); + String dstClassName = variable.getValueClassName(); TracePoint before = variable.getBeforeTracePoint(); Reference reference = new Reference(srcId, dstId, srcClassName, dstClassName); reference.setCollection(isCollection); // true�ɂ���ƃR���N�V�����ȊO���o�ł��Ȃ��Ȃ� @@ -75,8 +75,8 @@ TracePoint before = variable.getBeforeTracePoint(); String srcId = before.getMethodExecution().getThisObjId(); String srcClassName = before.getMethodExecution().getThisClassName(); - String dstId = variable.getId(); - String dstClassName = variable.getClassName(); + String dstId = variable.getValueId(); + String dstClassName = variable.getValueClassName(); MethodExecution me = before.getMethodExecution(); Map references = me.getObjectReferences(dstClassName); ObjectReference objectReference = null;