/******************************************************************************* * Copyright (c) 2006, 2015 Wind River Systems 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Wind River Systems - initial API and implementation * Ericsson - Modified for additional features in DSF Reference implementation * Ericsson - New version for 7_0 * Vladimir Prus (CodeSourcery) - Support for -data-read-memory-bytes (bug 322658) * Jens Elmenthaler (Verigy) - Added Full GDB pretty-printing support (bug 302121) * Marc Khouzam (Ericsson) - Call new FinalLaunchSequence_7_0 (Bug 365471) * Mikhail Khodjaiants (Mentor Graphics) - Refactor common code in GDBControl* classes (bug 372795) *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.service.command; import java.util.Map; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress; import org.eclipse.cdt.dsf.concurrent.Sequence; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService; import org.eclipse.cdt.dsf.gdb.launching.FinalLaunchSequence_7_0; import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceRecordSelectedChangedDMEvent; import org.eclipse.cdt.dsf.mi.service.command.AbstractMIControl; import org.eclipse.cdt.dsf.mi.service.command.CLIEventProcessor_7_0; import org.eclipse.cdt.dsf.mi.service.command.CommandFactory; import org.eclipse.cdt.dsf.mi.service.command.IEventProcessor; import org.eclipse.cdt.dsf.mi.service.command.MIRunControlEventProcessor_7_0; import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo; import org.eclipse.cdt.dsf.mi.service.command.output.MIListFeaturesInfo; import org.eclipse.cdt.dsf.service.DsfServiceEventHandler; import org.eclipse.cdt.dsf.service.DsfSession; import org.eclipse.debug.core.ILaunchConfiguration; /** * GDB Debugger control implementation. This implementation extends the * base MI control implementation to provide the GDB-specific debugger * features. This includes:<br> * - CLI console support,<br> * - inferior process status tracking.<br> */ public class GDBControl_7_0 extends GDBControl { /** * @since 3.0 */ public GDBControl_7_0(DsfSession session, ILaunchConfiguration config, CommandFactory factory) { super(session, true, config, factory); } @Override protected Sequence getStartupSequence(RequestMonitor requestMonitor) { final Sequence.Step[] initializeSteps = new Sequence.Step[] { new CommandMonitoringStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING), new CommandProcessorsStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING), new CommandTimeoutStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING), new ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING), new RegisterStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING), }; return new Sequence(getExecutor(), requestMonitor) { @Override public Step[] getSteps() { return initializeSteps; } }; } @Override protected Sequence getShutdownSequence(RequestMonitor requestMonitor) { final Sequence.Step[] shutdownSteps = new Sequence.Step[] { new RegisterStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN), new ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN), new CommandTimeoutStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN), new CommandProcessorsStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN), new CommandMonitoringStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN), }; return new Sequence(getExecutor(), requestMonitor) { @Override public Step[] getSteps() { return shutdownSteps; } }; } @Override protected IEventProcessor createCLIEventProcessor(ICommandControlService connection, ICommandControlDMContext controlDmc) { return new CLIEventProcessor_7_0(connection, controlDmc); } @Override protected IEventProcessor createMIRunControlEventProcessor(AbstractMIControl connection, ICommandControlDMContext controlDmc) { return new MIRunControlEventProcessor_7_0(connection, controlDmc); } /** @since 5.1 */ protected void doListFeatures(final RequestMonitor requestMonitor) { queueCommand( getCommandFactory().createMIListFeatures(getContext()), new DataRequestMonitor<MIListFeaturesInfo>(getExecutor(), requestMonitor) { @Override public void handleSuccess() { setFeatures(getData().getFeatures()); super.handleSuccess(); } }); } /** @since 5.1 */ protected void undoListFeatures(RequestMonitor requestMonitor) { requestMonitor.done(); } @Override protected Sequence getCompleteInitializationSequence(Map<String, Object> attributes, RequestMonitorWithProgress rm) { return new FinalLaunchSequence_7_0(getSession(), attributes, rm); } @Override @DsfServiceEventHandler public void eventDispatched(ICommandControlShutdownDMEvent e) { // Handle our "GDB Exited" event and stop processing commands. stopCommandProcessing(); } /** @since 3.0 */ @DsfServiceEventHandler public void eventDispatched(ITraceRecordSelectedChangedDMEvent e) { } /** @since 4.0 */ protected class ListFeaturesStep extends InitializationShutdownStep { ListFeaturesStep(Direction direction) { super(direction); } @Override protected void initialize(final RequestMonitor requestMonitor) { doListFeatures(requestMonitor); } @Override protected void shutdown(RequestMonitor requestMonitor) { undoListFeatures(requestMonitor); } } /** * @since 4.0 */ @Override public void enablePrettyPrintingForMIVariableObjects(RequestMonitor rm) { queueCommand( getCommandFactory().createMIEnablePrettyPrinting(getContext()), new DataRequestMonitor<MIInfo>(getExecutor(), rm)); } /** * @since 4.0 */ @Override public void setPrintPythonErrors(boolean enabled, RequestMonitor rm) { String subCommand = "set python print-stack " + (enabled ? "on" : "off"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ queueCommand( getCommandFactory().createCLIMaintenance(getContext(), subCommand), new DataRequestMonitor<MIInfo>(getExecutor(), rm)); } }