diff --git a/src/org/ntlab/traceDebugger/BreakPointView.java b/src/org/ntlab/traceDebugger/BreakPointView.java index 4e6af6c..7ab2c9c 100644 --- a/src/org/ntlab/traceDebugger/BreakPointView.java +++ b/src/org/ntlab/traceDebugger/BreakPointView.java @@ -1,8 +1,5 @@ package org.ntlab.traceDebugger; -import org.eclipse.core.resources.IMarker; -import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.model.IDebugElement; import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugUIConstants; @@ -152,6 +149,7 @@ @Override public void run() { debuggingController.debugAction(); + updateImages(true); } }; debugAction.setText("Debug"); @@ -163,11 +161,12 @@ @Override public void run() { debuggingController.terminateAction(); + updateImages(false); } }; terminateAction.setText("Terminate"); terminateAction.setToolTipText("Terminate"); - ImageDescriptor terminateImage = DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_OBJS_LAUNCH_RUN_TERMINATED); + ImageDescriptor terminateImage = DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TERMINATE); terminateAction.setImageDescriptor(terminateImage); stepIntoAction = new Action() { @@ -309,8 +308,34 @@ getSite().registerContextMenu(menuMgr, viewer); } - public void update(TraceBreakPoints traceBreakPoints) { + public void updateTraceBreakPoints(TraceBreakPoints traceBreakPoints) { viewer.setInput(traceBreakPoints.getAllTraceBreakPoints()); viewer.refresh(); } + + public void updateImages(boolean isRunning) { + if (isRunning) { + ImageDescriptor terminateImage = DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TERMINATE); + terminateAction.setImageDescriptor(terminateImage); + ImageDescriptor stepIntoImage = DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEP_INTO); + stepIntoAction.setImageDescriptor(stepIntoImage); + ImageDescriptor stepOverImage = DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEP_OVER); + stepOverAction.setImageDescriptor(stepOverImage); + ImageDescriptor stepReturnImage = DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEP_RETURN); + stepReturnAction.setImageDescriptor(stepReturnImage); + ImageDescriptor image = DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_RESUME); + resumeAction.setImageDescriptor(image); + } else { + ImageDescriptor terminateImage = DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TERMINATE); + terminateAction.setImageDescriptor(terminateImage); + ImageDescriptor stepIntoImage = DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_STEP_INTO); + stepIntoAction.setImageDescriptor(stepIntoImage); + ImageDescriptor stepOverImage = DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_STEP_OVER); + stepOverAction.setImageDescriptor(stepOverImage); + ImageDescriptor stepReturnImage = DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_STEP_RETURN); + stepReturnAction.setImageDescriptor(stepReturnImage); + ImageDescriptor image = DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_RESUME); + resumeAction.setImageDescriptor(image); + } + } } diff --git a/src/org/ntlab/traceDebugger/CallTreeView.java b/src/org/ntlab/traceDebugger/CallTreeView.java index 21d32b2..1940cbf 100644 --- a/src/org/ntlab/traceDebugger/CallTreeView.java +++ b/src/org/ntlab/traceDebugger/CallTreeView.java @@ -46,23 +46,28 @@ if (!(element instanceof TreeNode)) return; Object value = ((TreeNode)element).getValue(); if (!(value instanceof CallTreeModel)) return; - CallTreeModel callTreeModel = (CallTreeModel)value; MethodExecution methodExecution = callTreeModel.getMethodExecution(); - highlight(methodExecution); TracePoint tp = methodExecution.getEntryPoint(); - DebuggingController controller = DebuggingController.getInstance(); - controller.jumpToTheTracePoint(tp, false); - CallStackView callStackView = (CallStackView)TraceDebuggerPlugin.getActiveView(CallStackView.ID); - VariableView variableView = ((VariableView)TraceDebuggerPlugin.getActiveView(VariableView.ID)); - AbstractAnalyzer analyzer = TraceDebuggerPlugin.getAnalyzer(); - if (analyzer instanceof DeltaExtractionAnalyzer) { - DeltaMarkerView deltaMarkerView = (DeltaMarkerView)TraceDebuggerPlugin.getActiveView(DeltaMarkerView.ID); - DeltaMarkerManager deltaMarkerManager = deltaMarkerView.getDeltaMarkerManager(); - IMarker coodinatorMarker = deltaMarkerManager.getCoordinatorDeltaMarker(); - MethodExecution coordinatorME = DeltaMarkerManager.getMethodExecution(coodinatorMarker); - if (coordinatorME != null) callStackView.highlight((MethodExecution)coordinatorME); - variableView.markAndExpandVariablesByDeltaMarkers(deltaMarkerManager.getMarkers()); + + if ((DebuggingController.getInstance().isRunning())) { + highlight(methodExecution); + DebuggingController controller = DebuggingController.getInstance(); + controller.jumpToTheTracePoint(tp, false); + CallStackView callStackView = (CallStackView)TraceDebuggerPlugin.getActiveView(CallStackView.ID); + VariableView variableView = ((VariableView)TraceDebuggerPlugin.getActiveView(VariableView.ID)); + AbstractAnalyzer analyzer = TraceDebuggerPlugin.getAnalyzer(); + if (analyzer instanceof DeltaExtractionAnalyzer) { + DeltaMarkerView deltaMarkerView = (DeltaMarkerView)TraceDebuggerPlugin.getActiveView(DeltaMarkerView.ID); + DeltaMarkerManager deltaMarkerManager = deltaMarkerView.getDeltaMarkerManager(); + IMarker coodinatorMarker = deltaMarkerManager.getCoordinatorDeltaMarker(); + MethodExecution coordinatorME = DeltaMarkerManager.getMethodExecution(coodinatorMarker); + if (coordinatorME != null) callStackView.highlight((MethodExecution)coordinatorME); + variableView.markAndExpandVariablesByDeltaMarkers(deltaMarkerManager.getMarkers()); + } + } else { + int lineNo = tp.getStatement().getLineNo(); + JavaEditorOperator.openSrcFileOfMethodExecution(methodExecution, lineNo); } } }); diff --git a/src/org/ntlab/traceDebugger/DebuggingController.java b/src/org/ntlab/traceDebugger/DebuggingController.java index 8f4f7ec..5c8dbcc 100644 --- a/src/org/ntlab/traceDebugger/DebuggingController.java +++ b/src/org/ntlab/traceDebugger/DebuggingController.java @@ -2,6 +2,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.Set; import org.eclipse.core.filebuffers.FileBuffers; import org.eclipse.core.filebuffers.ITextFileBuffer; @@ -19,6 +20,7 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IViewPart; import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayUpdate; import org.ntlab.traceAnalysisPlatform.tracer.trace.BlockEnter; import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; @@ -36,6 +38,7 @@ private TraceBreakPoint selectedTraceBreakPoint; private TraceBreakPoints traceBreakPoints; private IMarker currentLineMarker; + private boolean isRunning = false; public static final String CURRENT_MARKER_ID = "org.ntlab.traceDebugger.currentMarker"; private DebuggingController() { @@ -58,7 +61,15 @@ return debuggingTp.duplicate(); } + public boolean isRunning() { + return isRunning; + } + public boolean fileOpenAction(Shell shell) { + if (isRunning) { + MessageDialog.openInformation(null, "Running", "This debugger is running on the trace."); + return false; + } FileDialog fileDialog = new FileDialog(shell, SWT.OPEN); fileDialog.setText("Open Trace File"); fileDialog.setFilterExtensions(new String[]{"*.*"}); @@ -67,11 +78,18 @@ TraceJSON trace = new TraceJSON(path); TraceDebuggerPlugin.setAnalyzer(new DeltaExtractionAnalyzer(trace)); VariableUpdatePointFinder.getInstance().setTrace(trace); -// traceBreakPoints.clear(); traceBreakPoints = new TraceBreakPoints(trace); ((CallStackView)TraceDebuggerPlugin.getActiveView(CallStackView.ID)).reset(); ((VariableView)TraceDebuggerPlugin.getActiveView(VariableView.ID)).reset(); - ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).update(traceBreakPoints); + ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).updateTraceBreakPoints(traceBreakPoints); + ((TracePointsView)TraceDebuggerPlugin.getActiveView(TracePointsView.ID)).reset(); + if (TraceDebuggerPlugin.getAnalyzer() instanceof DeltaExtractionAnalyzer) { + ((CallTreeView)TraceDebuggerPlugin.getActiveView(CallTreeView.ID)).reset(); +// Set views = TraceDebuggerPlugin.getViews(DeltaMarkerView.ID); +// for (IViewPart view : views) { +// ((DeltaMarkerView)view).dispose(); +// } + } return true; } @@ -102,21 +120,21 @@ MessageDialog.openInformation(null, "Error", "This trace point does not exist in the trace."); return false; } - ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).update(traceBreakPoints); + ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).updateTraceBreakPoints(traceBreakPoints); return true; } public boolean removeTraceBreakPointAction() { if (selectedTraceBreakPoint == null) return false; traceBreakPoints.removeTraceBreakPoint(selectedTraceBreakPoint); - ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).update(traceBreakPoints); + ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).updateTraceBreakPoints(traceBreakPoints); return true; } public boolean changeAvailableAction() { if (selectedTraceBreakPoint == null) return false; selectedTraceBreakPoint.changeAvailable(); - ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).update(traceBreakPoints); + ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).updateTraceBreakPoints(traceBreakPoints); return true; } @@ -130,6 +148,7 @@ debuggingTp = traceBreakPoints.getFirstTracePoint(); if (debuggingTp == null) return false; refresh(null, debuggingTp, false); + isRunning = true; return true; } @@ -144,9 +163,12 @@ } ((CallStackView)TraceDebuggerPlugin.getActiveView(CallStackView.ID)).reset(); ((VariableView)TraceDebuggerPlugin.getActiveView(VariableView.ID)).reset(); + ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).updateImages(false); + isRunning = false; } public boolean stepIntoAction() { + if (!isRunning) return false; if (debuggingTp == null) return false; TracePoint previousTp = debuggingTp; debuggingTp = debuggingTp.duplicate(); @@ -164,6 +186,7 @@ } public boolean stepOverAction() { + if (!isRunning) return false; if (debuggingTp == null) return false; TracePoint previousTp = debuggingTp; debuggingTp = debuggingTp.duplicate(); @@ -204,6 +227,7 @@ } public boolean stepReturnAction() { + if (!isRunning) return false; if (debuggingTp == null) return false; TracePoint previousTp = debuggingTp; debuggingTp = debuggingTp.duplicate(); @@ -218,6 +242,7 @@ } public boolean stepNextAction() { + if (!isRunning) return false; if (debuggingTp == null) return false; TracePoint previousTp = debuggingTp; debuggingTp = debuggingTp.duplicate(); @@ -252,6 +277,7 @@ } public boolean resumeAction() { + if (!isRunning) return false; if (debuggingTp == null) return false; long currentTime = debuggingTp.getStatement().getTimeStamp(); TracePoint previousTp = debuggingTp; @@ -266,6 +292,7 @@ } public boolean stepBackIntoAction() { + if (!isRunning) return false; if (debuggingTp == null) return false; TracePoint previousTp = debuggingTp; debuggingTp = debuggingTp.duplicate(); @@ -280,6 +307,7 @@ } public boolean stepBackOverAction() { + if (!isRunning) return false; if (debuggingTp == null) return false; TracePoint previousTp = debuggingTp; debuggingTp = debuggingTp.duplicate(); @@ -298,6 +326,7 @@ } public boolean stepBackReturnAction() { + if (!isRunning) return false; if (debuggingTp == null) return false; TracePoint previousTp = debuggingTp; debuggingTp = debuggingTp.duplicate(); @@ -312,6 +341,7 @@ } public boolean backResumeAction() { + if (!isRunning) return false; if (debuggingTp == null) return false; long currentTime = debuggingTp.getStatement().getTimeStamp(); TracePoint previousTp = debuggingTp; @@ -330,6 +360,7 @@ * @return */ public boolean jumpToTheTracePoint(TracePoint tp, boolean isReturned) { + if (!isRunning) return false; if (tp == null) return false; TracePoint previousTp = debuggingTp; debuggingTp = tp.duplicate(); diff --git a/src/org/ntlab/traceDebugger/TraceDebuggerPlugin.java b/src/org/ntlab/traceDebugger/TraceDebuggerPlugin.java index df3ec60..4b47a78 100644 --- a/src/org/ntlab/traceDebugger/TraceDebuggerPlugin.java +++ b/src/org/ntlab/traceDebugger/TraceDebuggerPlugin.java @@ -1,7 +1,9 @@ package org.ntlab.traceDebugger; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; @@ -23,6 +25,8 @@ private static int uniqueIdForViews = 0; + private static Map> viewIdToAllViews = new HashMap<>(); + private static Map viewIdToActiveView = new HashMap<>(); // The shared instance @@ -69,12 +73,30 @@ return viewIdToActiveView.get(viewId); } + public static Map> getAllViews() { + return viewIdToAllViews; + } + + public static Set getViews(String viewId) { + return viewIdToAllViews.get(viewId); + } + public static void setAnalyzer(AbstractAnalyzer analyzer) { TraceDebuggerPlugin.analyzer = analyzer; } public static void setActiveView(String viewId, IViewPart activeView) { viewIdToActiveView.put(viewId, activeView); + addView(viewId, activeView); + } + + private static void addView(String viewId, IViewPart view) { + Set views = viewIdToAllViews.get(viewId); + if (views == null) { + views = new HashSet(); + viewIdToAllViews.put(viewId, views); + } + views.add(view); } public static IViewPart createNewView(String viewId, int mode) { diff --git a/src/org/ntlab/traceDebugger/TracePoints.java b/src/org/ntlab/traceDebugger/TracePoints.java index 3014b65..45f3a19 100644 --- a/src/org/ntlab/traceDebugger/TracePoints.java +++ b/src/org/ntlab/traceDebugger/TracePoints.java @@ -8,19 +8,23 @@ public class TracePoints { List tracePoints = new ArrayList<>(); - public List getTracePoints() { + public List get() { return tracePoints; } - public TracePoint[] getTracePointsArray() { + public TracePoint[] getToArray() { return tracePoints.toArray(new TracePoint[tracePoints.size()]); } - public void addTracePoints(TracePoint tp) { + public void add(TracePoint tp) { tracePoints.add(tp); } - public void removeTracePoints(TracePoint tp) { + public void remove(TracePoint tp) { tracePoints.remove(tp); } + + public void clear() { + tracePoints.clear(); + } } diff --git a/src/org/ntlab/traceDebugger/TracePointsView.java b/src/org/ntlab/traceDebugger/TracePointsView.java index 40b0428..2db9839 100644 --- a/src/org/ntlab/traceDebugger/TracePointsView.java +++ b/src/org/ntlab/traceDebugger/TracePointsView.java @@ -86,7 +86,9 @@ Object element = sel.getFirstElement(); if (element instanceof TracePoint) { selectedTp = (TracePoint)element; - jumpToTheTracePoint(selectedTp); + if (DebuggingController.getInstance().isRunning()) { + jumpToTheTracePoint(selectedTp); + } } } }); @@ -121,7 +123,7 @@ @Override public void run() { if (selectedTp != null) { - tracePoints.removeTracePoints(selectedTp); + tracePoints.remove(selectedTp); update(); } } @@ -132,7 +134,7 @@ jumpAction = new Action() { @Override public void run() { - if (selectedTp != null) { + if (selectedTp != null && DebuggingController.getInstance().isRunning()) { jumpToTheTracePoint(selectedTp); } } @@ -172,12 +174,17 @@ } public void addTracePoint(TracePoint tp) { - tracePoints.addTracePoints(tp); + tracePoints.add(tp); + update(); + } + + public void reset() { + tracePoints.clear(); update(); } private void update() { - viewer.setInput(tracePoints.getTracePointsArray()); + viewer.setInput(tracePoints.getToArray()); viewer.refresh(); }