1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

Bug 488661: Simplification of reverse debugging code

Most changes are cosmetics (name of local variables, javadoc, etc).
The note-worthy ones are:

1- Change terminology in IChangeReverseMethodHandler to be a little clearer.
This causes changes in multiple files, but it was all automated.

2- Remove ReverseDebugMethod.INVALID which was used as an error code
and not a ReverseDebugMethod value.

3- In GdbReverseToggleCommand, provide a different error message
if there is a failure to set ProcessTrace vs BranchTrace and tell user what to do.

4- Reworked GdbReverseToggleCommand#getReverseDebugMethod in attempt
to make the code easier to understand.  No actual change in functionality.

Change-Id: Ibdc14faff1220e6a20319644b49e641c2101e762
This commit is contained in:
Marc Khouzam 2016-03-23 11:11:51 -04:00
parent 64e7137959
commit 6d5e31038c
12 changed files with 188 additions and 143 deletions

View file

@ -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);
}

View file

@ -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);

View file

@ -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<Boolean>(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<Boolean>(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<ReverseTraceMethod> ReverseMethodQuery = new Query<ReverseTraceMethod>() {
@Override
public void execute(final DataRequestMonitor<ReverseTraceMethod> 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<ReverseDebugMethod> reverseMethodQuery = new Query<ReverseDebugMethod>() {
@Override
public void execute(DataRequestMonitor<ReverseDebugMethod> rm) {
IReverseRunControl2 runControl = fTracker.getService(IReverseRunControl2.class);
if (runControl != null) {
runControl.getReverseTraceMethod(controlDmc, new ImmediateDataRequestMonitor<ReverseDebugMethod>(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<Boolean>(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;
}
}

View file

@ -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;

View file

@ -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:

View file

@ -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);

View file

@ -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<ReverseTraceMethod> rm) {
public void getReverseTraceMethod(ICommandControlDMContext context, DataRequestMonitor<ReverseDebugMethod> 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<MIInfo>(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<MIInfo>(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);
}

View file

@ -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<ReverseTraceMethod> rm);
void getReverseTraceMethod(ICommandControlDMContext context, DataRequestMonitor<ReverseDebugMethod> 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);
}

View file

@ -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<String, Object> 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$
}

View file

@ -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<MIInfo> createCLIRecord(ICommandControlDMContext ctx, ReverseTraceMethod traceMethod) {
public ICommand<MIInfo> createCLIRecord(ICommandControlDMContext ctx, ReverseDebugMethod traceMethod) {
return new CLIRecord(ctx, traceMethod);
}

View file

@ -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<MIInfo> {
/** 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$

View file

@ -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;
}
}