diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IChangeReverseMethodHandler.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IChangeReverseMethodHandler.java index 63036bee9bf..dea2bf8b09a 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IChangeReverseMethodHandler.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IChangeReverseMethodHandler.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2015 Intel Corporation and others. + * Copyright (c) 2015, 2016 Intel Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -13,22 +13,30 @@ package org.eclipse.cdt.debug.core.model; import org.eclipse.debug.core.commands.IDebugCommandHandler; /** - * Handler interface for the reverse debug change trace method command + * Handler interface for the reverse debug change method command * * @since 8.0 */ public interface IChangeReverseMethodHandler extends IReverseToggleHandler, IDebugCommandHandler { - public enum ReverseTraceMethod {INVALID, STOP_TRACE, FULL_TRACE, HARDWARE_TRACE, BRANCH_TRACE, PROCESSOR_TRACE, GDB_TRACE}; + /** + * List of different values for the reverse debugging method. + */ + enum ReverseDebugMethod {OFF, SOFTWARE, HARDWARE, BRANCH_TRACE, PROCESSOR_TRACE, GDB_TRACE}; - void setTraceMethod(ReverseTraceMethod traceMethod); + /** + * Sets the value for the reverse debugging method to be used when the button is toggled. + */ + void setReverseDebugMethod(ReverseDebugMethod traceMethod); /** - * get the trace method - * @return FullTrace, BranchTrace, ProcessorTrace - * + * Return the reverse debugging method currently selected. */ - ReverseTraceMethod getTraceMethod(Object context); + ReverseDebugMethod getReverseDebugMethod(Object context); - ReverseTraceMethod getLastTraceMethod(Object context); + /** + * Return the reverse debugging method that was selected before the + * currently selected one. + */ + ReverseDebugMethod getPreviousReverseDebugMethod(Object context); } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/commands/ReverseToggleCommandHandler.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/commands/ReverseToggleCommandHandler.java index 4be744d5d77..a3599be32df 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/commands/ReverseToggleCommandHandler.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/commands/ReverseToggleCommandHandler.java @@ -15,7 +15,7 @@ import java.net.URL; import java.util.Map; import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler; -import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseTraceMethod; +import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseDebugMethod; import org.eclipse.cdt.debug.core.model.IReverseToggleHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; @@ -80,9 +80,9 @@ public class ReverseToggleCommandHandler extends DebugCommandHandler implements // We must hard-code the command id so as to know it from the very start (bug 290699) private static final String REVERSE_TOGGLE_COMMAND_ID = "org.eclipse.cdt.debug.ui.command.reverseToggle"; //$NON-NLS-1$ - private Object fActiveContext = null; - private IReverseToggleHandler fTargetAdapter = null; - private IDebugContextService fContextService = null; + private Object fActiveContext; + private IReverseToggleHandler fTargetAdapter; + private IDebugContextService fContextService; private static ImageDescriptor getImageDescriptor (String path) { Bundle bundle = Platform.getBundle("org.eclipse.cdt.debug.ui"); //$NON-NLS-1$ @@ -106,7 +106,6 @@ public class ReverseToggleCommandHandler extends DebugCommandHandler implements // This constructor might be called after the launch, so we must refresh here too. // This can happen if we activate the action set after the launch. refresh(fContextService.getActiveContext()); - } } } @@ -165,7 +164,7 @@ public class ReverseToggleCommandHandler extends DebugCommandHandler implements @Override public Object execute(ExecutionEvent event) throws ExecutionException { - ReverseTraceMethod traceMethod; + ReverseDebugMethod newMethod; try { if (HandlerUtil.matchesRadioState(event)) { return null; @@ -174,11 +173,11 @@ public class ReverseToggleCommandHandler extends DebugCommandHandler implements String radioState = event.getParameter(RadioState.PARAMETER_ID); if (radioState.equals("UseSoftTrace")) { //$NON-NLS-1$ - traceMethod = ReverseTraceMethod.FULL_TRACE; + newMethod = ReverseDebugMethod.SOFTWARE; } else if (radioState.equals("TraceOff")) { //$NON-NLS-1$ - traceMethod = ReverseTraceMethod.STOP_TRACE; + newMethod = ReverseDebugMethod.OFF; } else if (radioState.equals("UseHardTrace")) { //$NON-NLS-1$ - traceMethod = ReverseTraceMethod.HARDWARE_TRACE; + newMethod = ReverseDebugMethod.HARDWARE; } else { // undefined trace method throw new ExecutionException(Messages.ReverseDebugging_UndefinedTraceMethod); @@ -186,10 +185,11 @@ public class ReverseToggleCommandHandler extends DebugCommandHandler implements // store the parameter in the gdb command handler class if (fTargetAdapter != null && fTargetAdapter instanceof IChangeReverseMethodHandler) { - ReverseTraceMethod currMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getTraceMethod(fActiveContext); - if (currMethod == traceMethod) + ReverseDebugMethod currMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getReverseDebugMethod(fActiveContext); + if (currMethod == newMethod) { return null; - ((IChangeReverseMethodHandler)fTargetAdapter).setTraceMethod(traceMethod); + } + ((IChangeReverseMethodHandler)fTargetAdapter).setReverseDebugMethod(newMethod); } // execute the event @@ -203,18 +203,18 @@ public class ReverseToggleCommandHandler extends DebugCommandHandler implements // Disable tracing if (fTargetAdapter != null && fTargetAdapter instanceof IChangeReverseMethodHandler) { if (fTargetAdapter.toggleNeedsUpdating()) { - ReverseTraceMethod LastTraceMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getLastTraceMethod(fActiveContext); - ReverseTraceMethod currMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getTraceMethod(fActiveContext); - if (currMethod == ReverseTraceMethod.STOP_TRACE) { - if (LastTraceMethod == ReverseTraceMethod.HARDWARE_TRACE) { - traceMethod = ReverseTraceMethod.HARDWARE_TRACE; + ReverseDebugMethod currMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getReverseDebugMethod(fActiveContext); + if (currMethod == ReverseDebugMethod.OFF) { + ReverseDebugMethod prevMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getPreviousReverseDebugMethod(fActiveContext); + if (prevMethod == ReverseDebugMethod.HARDWARE) { + newMethod = ReverseDebugMethod.HARDWARE; } else { - traceMethod = ReverseTraceMethod.FULL_TRACE; + newMethod = ReverseDebugMethod.SOFTWARE; } } else { - traceMethod = ReverseTraceMethod.STOP_TRACE; + newMethod = ReverseDebugMethod.OFF; } - ((IChangeReverseMethodHandler)fTargetAdapter).setTraceMethod(traceMethod); + ((IChangeReverseMethodHandler)fTargetAdapter).setReverseDebugMethod(newMethod); } } super.execute(event); @@ -269,24 +269,24 @@ public class ReverseToggleCommandHandler extends DebugCommandHandler implements public void updateElement(UIElement element, @SuppressWarnings("rawtypes") Map parameters) { if (fTargetAdapter != null && fTargetAdapter instanceof IChangeReverseMethodHandler) { - ReverseTraceMethod reverseMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getTraceMethod(fActiveContext); - ReverseTraceMethod LastTraceMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getLastTraceMethod(fActiveContext); + ReverseDebugMethod currMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getReverseDebugMethod(fActiveContext); ICommandService commandService = PlatformUI.getWorkbench().getService(ICommandService.class); try{ - if (reverseMethod == ReverseTraceMethod.HARDWARE_TRACE) { + if (currMethod == ReverseDebugMethod.HARDWARE) { HandlerUtil.updateRadioState(commandService.getCommand(REVERSE_TOGGLE_COMMAND_ID), "UseHardTrace"); //$NON-NLS-1$ element.setTooltip(Messages.ReverseDebugging_ToggleHardwareTrace); element.setIcon(REVERSE_TOGGLE_HARDWARE_ON_IMAGE); - } else if (reverseMethod == ReverseTraceMethod.FULL_TRACE) { + } else if (currMethod == ReverseDebugMethod.SOFTWARE) { HandlerUtil.updateRadioState(commandService.getCommand(REVERSE_TOGGLE_COMMAND_ID), "UseSoftTrace"); //$NON-NLS-1$ element.setTooltip(Messages.ReverseDebugging_ToggleSoftwareTrace); element.setIcon(REVERSE_TOGGLE_SOFTWARE_ON_IMAGE); } else { - element.setTooltip(Messages.ReverseDebugging_ToggleReverseDebugging); HandlerUtil.updateRadioState(commandService.getCommand(REVERSE_TOGGLE_COMMAND_ID), "TraceOff"); //$NON-NLS-1$ - if (LastTraceMethod == ReverseTraceMethod.HARDWARE_TRACE) { + element.setTooltip(Messages.ReverseDebugging_ToggleReverseDebugging); + ReverseDebugMethod prevMethod = ((IChangeReverseMethodHandler)fTargetAdapter).getPreviousReverseDebugMethod(fActiveContext); + if (prevMethod == ReverseDebugMethod.HARDWARE) { element.setIcon(REVERSE_TOGGLE_HARDWARE_OFF_IMAGE); - } else if (LastTraceMethod == ReverseTraceMethod.FULL_TRACE) { + } else if (prevMethod == ReverseDebugMethod.SOFTWARE) { element.setIcon(REVERSE_TOGGLE_SOFTWARE_OFF_IMAGE); } else { element.setIcon(REVERSE_TOGGLE_DEFAULT_IMAGE); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbReverseToggleCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbReverseToggleCommand.java index aea544bb683..d66b1b78cb0 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbReverseToggleCommand.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbReverseToggleCommand.java @@ -14,12 +14,16 @@ package org.eclipse.cdt.dsf.gdb.internal.ui.commands; import java.util.concurrent.ExecutionException; import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DsfExecutor; import org.eclipse.cdt.dsf.concurrent.DsfRunnable; +import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.Query; +import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl; @@ -59,17 +63,20 @@ public class GdbReverseToggleCommand extends AbstractDebugCommand implements ICh private final DsfServicesTracker fTracker; private final DsfSession fSession; - private ReverseTraceMethod fTraceMethod = null; - private ReverseTraceMethod fLastTraceMethod = null; - private ReverseTraceMethod fNextTraceMethod = null; + /** The reverse debugging method that was last returned by the service **/ + private ReverseDebugMethod fCurrentMethod; + /** The reverse debugging method that was used before the new method was selected **/ + private ReverseDebugMethod fPreviousMethod; + /** The reverse debugging method to be used when the toggle button is selected */ + private ReverseDebugMethod fNextMethod; public GdbReverseToggleCommand(DsfSession session) { fExecutor = session.getExecutor(); fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId()); fSession = session; - fTraceMethod = ReverseTraceMethod.STOP_TRACE; - fLastTraceMethod = ReverseTraceMethod.STOP_TRACE; - fNextTraceMethod = ReverseTraceMethod.STOP_TRACE; + fCurrentMethod = ReverseDebugMethod.OFF; + fPreviousMethod = ReverseDebugMethod.OFF; + fNextMethod = ReverseDebugMethod.OFF; try { fExecutor.execute(new DsfRunnable() { @@ -113,21 +120,23 @@ public class GdbReverseToggleCommand extends AbstractDebugCommand implements ICh final IReverseRunControl2 runControl = fTracker.getService(IReverseRunControl2.class); if (runControl != null) { - ReverseTraceMethod traceMethod = fNextTraceMethod; - if (fNextTraceMethod == ReverseTraceMethod.HARDWARE_TRACE) { + final ReverseDebugMethod newMethod; + if (fNextMethod == ReverseDebugMethod.HARDWARE) { String defaultValue = Platform.getPreferencesService().getString(GdbPlugin.PLUGIN_ID, IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_HARDWARE, IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_GDB_TRACE, null); if (defaultValue.equals(IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_BRANCH_TRACE)) { - traceMethod = ReverseTraceMethod.BRANCH_TRACE; // Branch Trace + newMethod = ReverseDebugMethod.BRANCH_TRACE; } else if (defaultValue.equals(IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_PROCESSOR_TRACE)) { - traceMethod = ReverseTraceMethod.PROCESSOR_TRACE; // Processor Trace + newMethod = ReverseDebugMethod.PROCESSOR_TRACE; } else { - traceMethod = ReverseTraceMethod.GDB_TRACE; // GDB Selected Option + newMethod = ReverseDebugMethod.GDB_TRACE; } + } else { + newMethod = fNextMethod; } - runControl.enableReverseMode(controlDmc, traceMethod, new DataRequestMonitor(fExecutor, rm) { + runControl.enableReverseMode(controlDmc, newMethod, new RequestMonitor(fExecutor, rm) { @Override public void handleError() { // Call the parent function @@ -137,16 +146,21 @@ public class GdbReverseToggleCommand extends AbstractDebugCommand implements ICh // avoid the default dialog box from eclipse and we propagate the error // with the plugin specific code of 1, here the ReverseToggleCommandHandler // interprets it as, the selected trace method is not available - request.setStatus(new Status(IStatus.OK, GdbPlugin.PLUGIN_ID, 1, Messages.GdbReverseDebugging_HardwareTracingNotAvailable, null)); + if (newMethod == ReverseDebugMethod.PROCESSOR_TRACE) { + request.setStatus(new Status(IStatus.OK, GdbPlugin.PLUGIN_ID, 1, Messages.GdbReverseDebugging_ProcessorTraceReverseDebugNotAvailable, null)); + } else if (newMethod == ReverseDebugMethod.BRANCH_TRACE || newMethod == ReverseDebugMethod.GDB_TRACE) { + request.setStatus(new Status(IStatus.OK, GdbPlugin.PLUGIN_ID, 1, Messages.GdbReverseDebugging_HardwareReverseDebugNotAvailable, null)); + } else { + request.setStatus(new Status(IStatus.OK, GdbPlugin.PLUGIN_ID, 1, Messages.GdbReverseDebugging_ReverseDebugNotAvailable, null)); + } } }); - } else { final IReverseRunControl runControl_old = fTracker.getService(IReverseRunControl.class); if (runControl_old != null) { - if (fTraceMethod != ReverseTraceMethod.STOP_TRACE && fTraceMethod != ReverseTraceMethod.FULL_TRACE) { + if (fCurrentMethod != ReverseDebugMethod.OFF && fCurrentMethod != ReverseDebugMethod.SOFTWARE) { runControl_old.enableReverseMode(controlDmc, false, rm); // Switch Off tracing - request.setStatus(new Status(IStatus.OK, GdbPlugin.PLUGIN_ID, 1, Messages.GdbReverseDebugging_HardwareTracingNotAvailable, null)); + request.setStatus(new Status(IStatus.OK, GdbPlugin.PLUGIN_ID, 1, Messages.GdbReverseDebugging_HardwareReverseDebugNotAvailable, null)); return; } runControl_old.isReverseModeEnabled(controlDmc, new DataRequestMonitor(fExecutor, rm) { @@ -302,12 +316,12 @@ public class GdbReverseToggleCommand extends AbstractDebugCommand implements ICh } @Override - public void setTraceMethod(ReverseTraceMethod traceMethod) { - fNextTraceMethod = traceMethod; + public void setReverseDebugMethod(ReverseDebugMethod traceMethod) { + fNextMethod = traceMethod; } @Override - public ReverseTraceMethod getTraceMethod(final Object context) { + public ReverseDebugMethod getReverseDebugMethod(final Object context) { IDMContext dmc; if (context instanceof IDMContext) { @@ -315,52 +329,74 @@ public class GdbReverseToggleCommand extends AbstractDebugCommand implements ICh } else if (context instanceof IDMVMContext) { dmc = ((IDMVMContext)context).getDMContext(); } else { - return ReverseTraceMethod.STOP_TRACE; + return ReverseDebugMethod.OFF; } final ICommandControlDMContext controlDmc = DMContexts.getAncestorOfType(dmc, ICommandControlDMContext.class); if (controlDmc == null) { - return ReverseTraceMethod.STOP_TRACE; + return ReverseDebugMethod.OFF; } - Query ReverseMethodQuery = new Query() { - @Override - public void execute(final DataRequestMonitor rm) { - final IReverseRunControl2 runControl = fTracker.getService(IReverseRunControl2.class); - if (runControl != null) { - runControl.getReverseTraceMethod(controlDmc, rm); - } - else { - rm.setData(ReverseTraceMethod.INVALID); - rm.done(); - } - } - }; - try { - fExecutor.execute(ReverseMethodQuery); - ReverseTraceMethod returnedTrace = ReverseMethodQuery.get(); - ReverseTraceMethod currTrace = ReverseTraceMethod.INVALID; - if (returnedTrace == ReverseTraceMethod.INVALID) - currTrace = isReverseToggled(context) ? ReverseTraceMethod.FULL_TRACE : ReverseTraceMethod.STOP_TRACE ; - else - currTrace = (returnedTrace == ReverseTraceMethod.BRANCH_TRACE || - returnedTrace == ReverseTraceMethod.PROCESSOR_TRACE || - returnedTrace == ReverseTraceMethod.GDB_TRACE ) ? ReverseTraceMethod.HARDWARE_TRACE : returnedTrace; - if (currTrace != fTraceMethod) { - fLastTraceMethod = fTraceMethod; - fTraceMethod = currTrace; - } - return fTraceMethod; - } catch (InterruptedException e) { - } catch (ExecutionException e) { - } catch (RejectedExecutionException e) { - } + Query reverseMethodQuery = new Query() { + @Override + public void execute(DataRequestMonitor rm) { + IReverseRunControl2 runControl = fTracker.getService(IReverseRunControl2.class); + if (runControl != null) { + runControl.getReverseTraceMethod(controlDmc, new ImmediateDataRequestMonitor(rm) { + @Override + protected void handleCompleted() { + if (!isSuccess()) { + rm.done(ReverseDebugMethod.OFF); + } else { + ReverseDebugMethod method = getData(); + if (method == ReverseDebugMethod.BRANCH_TRACE || + method == ReverseDebugMethod.PROCESSOR_TRACE || + method == ReverseDebugMethod.GDB_TRACE) { + method = ReverseDebugMethod.HARDWARE; + } + rm.done(method); + } + } + }); + } else { + IReverseRunControl runControl_old = fTracker.getService(IReverseRunControl.class); + if (runControl_old != null) { + runControl_old.isReverseModeEnabled(controlDmc, new ImmediateDataRequestMonitor(rm) { + @Override + protected void handleCompleted() { + if (isSuccess() && getData()) { + rm.done(ReverseDebugMethod.SOFTWARE); + } else { + rm.done(ReverseDebugMethod.OFF); + } + } + }); + } else { + rm.done(ReverseDebugMethod.OFF); + } + } + } + }; + try { + fExecutor.execute(reverseMethodQuery); + ReverseDebugMethod currMethod = reverseMethodQuery.get(500, TimeUnit.MILLISECONDS); + + if (currMethod != fCurrentMethod) { + fPreviousMethod = fCurrentMethod; + fCurrentMethod = currMethod; + } + return fCurrentMethod; + } catch (InterruptedException e) { + } catch (ExecutionException e) { + } catch (RejectedExecutionException e) { + } catch (TimeoutException e) { + } - return ReverseTraceMethod.STOP_TRACE; + return ReverseDebugMethod.OFF; } @Override - public ReverseTraceMethod getLastTraceMethod(Object context) { - return fLastTraceMethod; + public ReverseDebugMethod getPreviousReverseDebugMethod(Object context) { + return fPreviousMethod; } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/Messages.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/Messages.java index c42aeb84794..10c6c33c26a 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/Messages.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/Messages.java @@ -49,7 +49,11 @@ public class Messages extends NLS { public static String GdbDebugNewExecutableCommand_Select_binary_and_specify_arguments; - public static String GdbReverseDebugging_HardwareTracingNotAvailable; + public static String GdbReverseDebugging_HardwareReverseDebugNotAvailable; + + public static String GdbReverseDebugging_ProcessorTraceReverseDebugNotAvailable; + + public static String GdbReverseDebugging_ReverseDebugNotAvailable; public static String GdbConnectCommand_Error; diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/Messages.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/Messages.properties index 8e5863a32da..f20b56518d4 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/Messages.properties +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/Messages.properties @@ -27,7 +27,8 @@ GdbDebugNewExecutableCommand_Select_binaries_on_host_and_target=Select binaries GdbDebugNewExecutableCommand_Select_Binary=Select Binary GdbDebugNewExecutableCommand_Select_binary_and_specify_arguments=Select a binary and specify the arguments -GdbReverseDebugging_HardwareTracingNotAvailable=Hardware Tracing Method not available, Reverse debugging is switched Off, please select another method - +GdbReverseDebugging_HardwareReverseDebugNotAvailable=Hardware reverse debugging not available. Reverse debugging has been turned off. Please select software reverse debugging explicitly. +GdbReverseDebugging_ProcessorTraceReverseDebugNotAvailable=Hardware reverse debugging based on Processor Trace not available. Reverse debugging has been turned off. Please select software reverse debugging or go to the Reverse Debugging preference page to try another type of hardware reverse debugging. +GdbReverseDebugging_ReverseDebugNotAvailable=Unable to toggle reverse debugging. GdbConnectCommand_FailureMessage=Failure to attach to process: GdbConnectCommand_Error=Error: \ No newline at end of file diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_10.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_10.java index bf962d92019..8ac149bace0 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_10.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_10.java @@ -12,7 +12,7 @@ package org.eclipse.cdt.dsf.gdb.service; import java.util.Map; -import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseTraceMethod; +import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseDebugMethod; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DsfExecutor; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; @@ -61,18 +61,18 @@ public class GDBProcesses_7_10 extends GDBProcesses_7_4 { launch.getLaunchConfiguration().getAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REVERSE_MODE, IGDBLaunchConfigurationConstants.DEBUGGER_REVERSE_MODE_DEFAULT); if (reverseMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_REVERSE_MODE_SOFTWARE)) { - reverseService.enableReverseMode(controlContext, ReverseTraceMethod.FULL_TRACE, rm); + reverseService.enableReverseMode(controlContext, ReverseDebugMethod.SOFTWARE, rm); } else if (reverseMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_REVERSE_MODE_HARDWARE)) { String defaultValue = Platform.getPreferencesService().getString(GdbPlugin.PLUGIN_ID, IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_HARDWARE, IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_GDB_TRACE, null); - ReverseTraceMethod traceMethod = ReverseTraceMethod.GDB_TRACE; + ReverseDebugMethod traceMethod = ReverseDebugMethod.GDB_TRACE; if (defaultValue.equals(IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_BRANCH_TRACE)) { - traceMethod = ReverseTraceMethod.BRANCH_TRACE; + traceMethod = ReverseDebugMethod.BRANCH_TRACE; } else if (defaultValue.equals(IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_PROCESSOR_TRACE)) { - traceMethod = ReverseTraceMethod.PROCESSOR_TRACE; + traceMethod = ReverseDebugMethod.PROCESSOR_TRACE; } reverseService.enableReverseMode(controlContext, traceMethod, rm); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_10.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_10.java index 6edaf21723a..f8c83128efd 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_10.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_10.java @@ -12,7 +12,7 @@ package org.eclipse.cdt.dsf.gdb.service; import java.util.Hashtable; -import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseTraceMethod; +import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseDebugMethod; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.ImmediateRequestMonitor; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; @@ -35,7 +35,7 @@ public class GDBRunControl_7_10 extends GDBRunControl_7_6 implements IReverseRun private IMICommandControl fCommandControl; private CommandFactory fCommandFactory; - private ReverseTraceMethod fReverseTraceMethod; // default: no trace + private ReverseDebugMethod fReverseTraceMethod; // default: no trace public GDBRunControl_7_10(DsfSession session) { super(session); @@ -56,7 +56,7 @@ public class GDBRunControl_7_10 extends GDBRunControl_7_6 implements IReverseRun fCommandControl = getServicesTracker().getService(IMICommandControl.class); fCommandFactory = fCommandControl.getCommandFactory(); - fReverseTraceMethod = ReverseTraceMethod.STOP_TRACE; + fReverseTraceMethod = ReverseDebugMethod.OFF; if (fCommandControl == null) { requestMonitor.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, "Service is not available")); //$NON-NLS-1$ @@ -72,13 +72,13 @@ public class GDBRunControl_7_10 extends GDBRunControl_7_6 implements IReverseRun } @Override - public void getReverseTraceMethod(ICommandControlDMContext context, DataRequestMonitor rm) { + public void getReverseTraceMethod(ICommandControlDMContext context, DataRequestMonitor rm) { rm.setData(fReverseTraceMethod); rm.done(); } @Override - public void enableReverseMode(final ICommandControlDMContext context,final ReverseTraceMethod traceMethod, final RequestMonitor rm) { + public void enableReverseMode(final ICommandControlDMContext context,final ReverseDebugMethod traceMethod, final RequestMonitor rm) { if (!getReverseSupported()) { rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED, "Reverse mode is not supported.", null)); //$NON-NLS-1$ return; @@ -89,7 +89,7 @@ public class GDBRunControl_7_10 extends GDBRunControl_7_6 implements IReverseRun return; } - if (fReverseTraceMethod == ReverseTraceMethod.STOP_TRACE || traceMethod == ReverseTraceMethod.STOP_TRACE) { + if (fReverseTraceMethod == ReverseDebugMethod.OFF || traceMethod == ReverseDebugMethod.OFF) { getConnection().queueCommand( fCommandFactory.createCLIRecord(context, traceMethod), new DataRequestMonitor(getExecutor(), rm) { @@ -97,7 +97,7 @@ public class GDBRunControl_7_10 extends GDBRunControl_7_6 implements IReverseRun public void handleSuccess() { boolean enabled = false; fReverseTraceMethod = traceMethod; - if (fReverseTraceMethod != ReverseTraceMethod.STOP_TRACE) { + if (fReverseTraceMethod != ReverseDebugMethod.OFF) { enabled = true; } setReverseModeEnabled(enabled ); @@ -112,7 +112,7 @@ public class GDBRunControl_7_10 extends GDBRunControl_7_6 implements IReverseRun } getConnection().queueCommand( - fCommandFactory.createCLIRecord(context, ReverseTraceMethod.STOP_TRACE), + fCommandFactory.createCLIRecord(context, ReverseDebugMethod.OFF), new DataRequestMonitor(getExecutor(), rm) { @Override public void handleSuccess() { @@ -130,7 +130,7 @@ public class GDBRunControl_7_10 extends GDBRunControl_7_6 implements IReverseRun public void handleFailure() { rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE, "Trace method could not be selected", null)); //$NON-NLS-1$ setReverseModeEnabled(false); - fReverseTraceMethod = ReverseTraceMethod.STOP_TRACE; + fReverseTraceMethod = ReverseDebugMethod.OFF; rm.done(); } }); @@ -151,7 +151,7 @@ public class GDBRunControl_7_10 extends GDBRunControl_7_6 implements IReverseRun if ("record-started".equals(asyncClass) || //$NON-NLS-1$ "record-stopped".equals(asyncClass)) { //$NON-NLS-1$ if ("record-stopped".equals(asyncClass)) { //$NON-NLS-1$ - fReverseTraceMethod = ReverseTraceMethod.STOP_TRACE; + fReverseTraceMethod = ReverseDebugMethod.OFF; setReverseModeEnabled(false); } else { getConnection().queueCommand( @@ -163,7 +163,7 @@ public class GDBRunControl_7_10 extends GDBRunControl_7_6 implements IReverseRun fReverseTraceMethod = getData().getReverseMethod(); } else { // Use a default value in case of error - fReverseTraceMethod = ReverseTraceMethod.FULL_TRACE; + fReverseTraceMethod = ReverseDebugMethod.SOFTWARE; } setReverseModeEnabled(true); } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/IReverseRunControl2.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/IReverseRunControl2.java index 647ab0bb9bf..f8219bca844 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/IReverseRunControl2.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/IReverseRunControl2.java @@ -10,25 +10,21 @@ *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.service; +import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseDebugMethod; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext; -import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseTraceMethod; /** @since 5.0 */ public interface IReverseRunControl2 extends IReverseRunControl { /** - * Get the reverse debugging trace method. - * - * @param rm Will contain the result of the operation, true or false, not null. + * Get the reverse debugging method. */ - void getReverseTraceMethod(ICommandControlDMContext context, DataRequestMonitor rm); + void getReverseTraceMethod(ICommandControlDMContext context, DataRequestMonitor rm); /** - * Change reverse debugging trace method based on the method parameter. - * - * @param set the reverse debugging trace method to Full Trace, Branch Trace or Processor Trace + * Change reverse debugging method based on the method parameter. */ - void enableReverseMode(ICommandControlDMContext context, ReverseTraceMethod traceMethod, RequestMonitor rm); + void enableReverseMode(ICommandControlDMContext context, ReverseDebugMethod traceMethod, RequestMonitor rm); } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/StartOrRestartProcessSequence_7_10.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/StartOrRestartProcessSequence_7_10.java index aedfbff1f77..e094169c1f4 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/StartOrRestartProcessSequence_7_10.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/StartOrRestartProcessSequence_7_10.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; import org.eclipse.cdt.debug.core.CDebugUtils; -import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseTraceMethod; +import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseDebugMethod; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DsfExecutor; import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants; @@ -39,7 +39,7 @@ public class StartOrRestartProcessSequence_7_10 extends StartOrRestartProcessSeq private IGDBControl fCommandControl; private IReverseRunControl2 fReverseService; - private ReverseTraceMethod fReverseMode = ReverseTraceMethod.FULL_TRACE; + private ReverseDebugMethod fReverseMode = ReverseDebugMethod.SOFTWARE; private final Map fAttributes; public StartOrRestartProcessSequence_7_10(DsfExecutor executor, IContainerDMContext containerDmc, @@ -94,14 +94,14 @@ public class StartOrRestartProcessSequence_7_10 extends StartOrRestartProcessSeq IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_GDB_TRACE, null); if (hwTracePref.equals(IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_BRANCH_TRACE)) { - fReverseMode = ReverseTraceMethod.BRANCH_TRACE; + fReverseMode = ReverseDebugMethod.BRANCH_TRACE; } else if (hwTracePref.equals(IGdbDebugPreferenceConstants.PREF_REVERSE_TRACE_METHOD_PROCESSOR_TRACE)) { - fReverseMode = ReverseTraceMethod.PROCESSOR_TRACE; + fReverseMode = ReverseDebugMethod.PROCESSOR_TRACE; } else { - fReverseMode = ReverseTraceMethod.GDB_TRACE; + fReverseMode = ReverseDebugMethod.GDB_TRACE; } } else if (reverseMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_REVERSE_MODE_SOFTWARE)) { - fReverseMode = ReverseTraceMethod.FULL_TRACE; + fReverseMode = ReverseDebugMethod.SOFTWARE; } else { rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, IDsfStatusConstants.INTERNAL_ERROR, "Unexpected reverse debugging type: " + reverseMode, null)); //$NON-NLS-1$ } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/CommandFactory.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/CommandFactory.java index d32e1e325ad..16eb5565225 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/CommandFactory.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/CommandFactory.java @@ -243,7 +243,7 @@ import org.eclipse.cdt.dsf.mi.service.command.output.MIVarShowAttributesInfo; import org.eclipse.cdt.dsf.mi.service.command.output.MIVarShowFormatInfo; import org.eclipse.cdt.dsf.mi.service.command.output.MIVarUpdateInfo; import org.eclipse.cdt.dsf.mi.service.command.output.CLIInfoRecordInfo; -import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseTraceMethod; +import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseDebugMethod; /** * Factory to create MI/CLI commands. @@ -329,7 +329,7 @@ public class CommandFactory { } /** @since 5.0*/ - public ICommand createCLIRecord(ICommandControlDMContext ctx, ReverseTraceMethod traceMethod) { + public ICommand createCLIRecord(ICommandControlDMContext ctx, ReverseDebugMethod traceMethod) { return new CLIRecord(ctx, traceMethod); } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/commands/CLIRecord.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/commands/CLIRecord.java index 334704217bd..d446ea5a2a6 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/commands/CLIRecord.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/commands/CLIRecord.java @@ -13,7 +13,7 @@ package org.eclipse.cdt.dsf.mi.service.command.commands; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext; import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo; -import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseTraceMethod; +import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseDebugMethod; /** * This command turns on on off the recording of "Process Record and Replay". @@ -28,23 +28,23 @@ public class CLIRecord extends CLICommand { /** Only available for GDB >= 7.10 */ /** @since 5.0 */ - public CLIRecord(ICommandControlDMContext ctx, ReverseTraceMethod traceMethod) { + public CLIRecord(ICommandControlDMContext ctx, ReverseDebugMethod traceMethod) { super(ctx, "record" + createRecordParams(traceMethod)); //$NON-NLS-1$ } - private static String createRecordParams(ReverseTraceMethod traceMethod) + private static String createRecordParams(ReverseDebugMethod traceMethod) { String recordParam; - if (traceMethod == ReverseTraceMethod.STOP_TRACE) { + if (traceMethod == ReverseDebugMethod.OFF) { recordParam = " stop"; //$NON-NLS-1$ - } else if (traceMethod == ReverseTraceMethod.FULL_TRACE) { + } else if (traceMethod == ReverseDebugMethod.SOFTWARE) { recordParam = " full"; //$NON-NLS-1$ - } else if (traceMethod == ReverseTraceMethod.BRANCH_TRACE) { + } else if (traceMethod == ReverseDebugMethod.BRANCH_TRACE) { recordParam = " btrace bts"; //$NON-NLS-1$ - } else if (traceMethod == ReverseTraceMethod.PROCESSOR_TRACE) { + } else if (traceMethod == ReverseDebugMethod.PROCESSOR_TRACE) { recordParam = " btrace pt"; //$NON-NLS-1$ - } else if (traceMethod == ReverseTraceMethod.GDB_TRACE) { + } else if (traceMethod == ReverseDebugMethod.GDB_TRACE) { recordParam = " btrace"; //$NON-NLS-1$ } else {// no trace method defined recordParam = ""; //$NON-NLS-1$ diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/output/CLIInfoRecordInfo.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/output/CLIInfoRecordInfo.java index a223ebd166f..098eb146826 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/output/CLIInfoRecordInfo.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/output/CLIInfoRecordInfo.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipse.cdt.dsf.mi.service.command.output; -import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseTraceMethod; +import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseDebugMethod; /** * 'info record' returns the selected reverse trace method. @@ -28,7 +28,7 @@ import org.eclipse.cdt.debug.core.model.IChangeReverseMethodHandler.ReverseTrace public class CLIInfoRecordInfo extends MIInfo { - private ReverseTraceMethod fReverseMethod; + private ReverseDebugMethod fReverseMethod; public CLIInfoRecordInfo(MIOutput record) { super(record); @@ -52,17 +52,17 @@ public class CLIInfoRecordInfo extends MIInfo { protected void parseReverseMethod(String output) { if (output.contains("Processor")) { //$NON-NLS-1$ - fReverseMethod = ReverseTraceMethod.PROCESSOR_TRACE; + fReverseMethod = ReverseDebugMethod.PROCESSOR_TRACE; } else if (output.contains("Branch")) { //$NON-NLS-1$ - fReverseMethod = ReverseTraceMethod.BRANCH_TRACE; + fReverseMethod = ReverseDebugMethod.BRANCH_TRACE; } else if (output.contains("full")) { //$NON-NLS-1$ - fReverseMethod = ReverseTraceMethod.FULL_TRACE; + fReverseMethod = ReverseDebugMethod.SOFTWARE; } else { - fReverseMethod = ReverseTraceMethod.STOP_TRACE; + fReverseMethod = ReverseDebugMethod.OFF; } } - public ReverseTraceMethod getReverseMethod() { + public ReverseDebugMethod getReverseMethod() { return fReverseMethod; } }