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

Revert "Bug 344890 - [remote] Cannot start a new process on a remote target with extended-remote"

This reverts commit 6f37c7a914.
This commit is contained in:
Mikhail Khodjaiants 2013-01-21 14:33:27 -05:00
parent d55bca53a5
commit 629232eae1
15 changed files with 18 additions and 620 deletions

View file

@ -1,22 +0,0 @@
/*******************************************************************************
* Copyright (c) 2012 Mentor Graphics 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:
* Mentor Graphics - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.core.model;
import org.eclipse.debug.core.commands.IDebugCommandHandler;
/**
* Command handler for the "Debug New Executable" command.
*
* @since 7.3
*/
public interface IDebugNewExecutableHandler extends IDebugCommandHandler {
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 949 B

View file

@ -242,9 +242,3 @@ OpenNewView.name = Open New View
# Disassembly Ruler Column extension point
extPoint.disassemblyRulerColumn=Disassembly Ruler Column
# Debug New Executable Command
DebugNewExecutable.name=Debug New Executable
DebugNewExecutable.description=Debug a new executable
DebugNewExecutable.label=Debug New Executable...
DebugNewExecutable.tooltip=Debug a new executable

View file

@ -2012,12 +2012,7 @@
id="org.eclipse.cdt.debug.ui.command.connect"
name="%Connect.name">
</command>
<command
categoryId="org.eclipse.cdt.debug.ui.category.debugViewLayout"
description="%DebugNewExecutable.description"
id="org.eclipse.cdt.debug.ui.command.debugNewExecutable"
name="%DebugNewExecutable.name">
</command>
</extension>
<extension
point="org.eclipse.ui.handlers">
@ -2084,10 +2079,6 @@
class="org.eclipse.cdt.debug.internal.ui.commands.ConnectCommandHandler"
commandId="org.eclipse.cdt.debug.ui.command.connect">
</handler>
<handler
class="org.eclipse.cdt.debug.internal.ui.commands.DebugNewExecutableHandler"
commandId="org.eclipse.cdt.debug.ui.command.debugNewExecutable">
</handler>
</extension>
<extension
point="org.eclipse.core.expressions.definitions">
@ -2529,28 +2520,6 @@
</visibleWhen>
</command>
</menuContribution>
<!--
<menuContribution
locationURI="toolbar:org.eclipse.debug.ui.DebugView?before=stepGroup">
<command
commandId="org.eclipse.cdt.debug.ui.command.debugNewExecutable"
icon="icons/obj16/new_exec.gif"
label="%DebugNewExecutable.label"
style="push"
tooltip="%DebugNewExecutable.tooltip">
</command>
</menuContribution>
-->
<menuContribution
locationURI="popup:org.eclipse.debug.ui.DebugView?before=emptyLaunchGroup">
<command
commandId="org.eclipse.cdt.debug.ui.command.debugNewExecutable"
icon="icons/obj16/new_exec.gif"
label="%DebugNewExecutable.label"
style="push"
tooltip="%DebugNewExecutable.tooltip">
</command>
</menuContribution>
<!-- Connect contributions to debug view menu, toolbar menu -->
<menuContribution

View file

@ -1,23 +0,0 @@
/*******************************************************************************
* Copyright (c) 2012 Mentor Graphics 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:
* Mentor Graphics - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.commands;
import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler;
import org.eclipse.debug.ui.actions.DebugCommandHandler;
public class DebugNewExecutableHandler extends DebugCommandHandler {
@Override
protected Class<?> getCommandType() {
return IDebugNewExecutableHandler.class;
}
}

View file

@ -19,7 +19,6 @@ import java.util.WeakHashMap;
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.cdt.debug.core.model.IConnectHandler;
import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler;
import org.eclipse.cdt.debug.core.model.IResumeWithoutSignalHandler;
import org.eclipse.cdt.debug.core.model.IReverseResumeHandler;
import org.eclipse.cdt.debug.core.model.IReverseStepIntoHandler;
@ -50,7 +49,6 @@ import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbDisconnectCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbRestartCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbSteppingModeTarget;
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbConnectCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbDebugNewExecutableCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbResumeWithoutSignalCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseResumeCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepIntoCommand;
@ -116,7 +114,6 @@ public class GdbAdapterFactory
final GdbResumeWithoutSignalCommand fResumeWithoutSignalCommand;
final GdbRestartCommand fRestartCommand;
final DsfTerminateCommand fTerminateCommand;
final GdbDebugNewExecutableCommand fDebugNewExecutableCommand;
final GdbConnectCommand fConnectCommand;
final GdbDisconnectCommand fDisconnectCommand;
final IDebugModelProvider fDebugModelProvider;
@ -165,7 +162,6 @@ public class GdbAdapterFactory
fResumeWithoutSignalCommand = new GdbResumeWithoutSignalCommand(session);
fRestartCommand = new GdbRestartCommand(session, fLaunch);
fTerminateCommand = new DsfTerminateCommand(session);
fDebugNewExecutableCommand = new GdbDebugNewExecutableCommand(session, fLaunch);
fConnectCommand = new GdbConnectCommand(session);
fDisconnectCommand = new GdbDisconnectCommand(session);
fSuspendTrigger = new GdbSuspendTrigger(session, fLaunch);
@ -193,7 +189,6 @@ public class GdbAdapterFactory
session.registerModelAdapter(IRestartHandler.class, fRestartCommand);
session.registerModelAdapter(ITerminateHandler.class, fTerminateCommand);
session.registerModelAdapter(IConnectHandler.class, fConnectCommand);
session.registerModelAdapter(IDebugNewExecutableHandler.class, fDebugNewExecutableCommand);
session.registerModelAdapter(IDisconnectHandler.class, fDisconnectCommand);
session.registerModelAdapter(IModelSelectionPolicyFactory.class, fModelSelectionPolicyFactory);
session.registerModelAdapter(IRefreshAllTarget.class, fRefreshAllTarget);
@ -254,7 +249,6 @@ public class GdbAdapterFactory
session.unregisterModelAdapter(IRestartHandler.class);
session.unregisterModelAdapter(ITerminateHandler.class);
session.unregisterModelAdapter(IConnectHandler.class);
session.unregisterModelAdapter(IDebugNewExecutableHandler.class);
session.unregisterModelAdapter(IDisconnectHandler.class);
session.unregisterModelAdapter(IModelSelectionPolicyFactory.class);
session.unregisterModelAdapter(IRefreshAllTarget.class);

View file

@ -1,375 +0,0 @@
/*******************************************************************************
* Copyright (c) 2012 Mentor Graphics 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:
* Mentor Graphics - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.commands;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.RejectedExecutionException;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler;
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.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
import org.eclipse.cdt.dsf.gdb.service.SessionType;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.IRequest;
import org.eclipse.debug.core.commands.AbstractDebugCommand;
import org.eclipse.debug.core.commands.IEnabledStateRequest;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.progress.UIJob;
public class GdbDebugNewExecutableCommand extends AbstractDebugCommand implements IDebugNewExecutableHandler {
private class PromptJob extends UIJob {
private DataRequestMonitor<PromptInfo> fRequestMonitor;
private boolean fRemote = false;
private PromptJob( boolean remote, DataRequestMonitor<PromptInfo> rm ) {
super( "New Executable Prompt Job" ); //$NON-NLS-1$
fRemote = remote;
fRequestMonitor = rm;
}
@Override
public IStatus runInUIThread( IProgressMonitor monitor ) {
int flags = ( fRemote ) ? NewExecutableDialog.REMOTE : 0;
NewExecutableDialog dialog = new NewExecutableDialog( GdbUIPlugin.getShell(), flags );
final boolean canceled = dialog.open() == Window.CANCEL;
final PromptInfo info = dialog.getInfo();
fExecutor.execute( new DsfRunnable() {
@Override
public void run() {
if ( canceled )
fRequestMonitor.cancel();
else
fRequestMonitor.setData( info );
fRequestMonitor.done();
}
} );
return Status.OK_STATUS;
}
}
private class NewExecutableDialog extends TitleAreaDialog {
private static final int REMOTE = 0x1;
private int fFlags = 0;
private PromptInfo fInfo = null;
private Text fHostBinaryText;
private Text fTargetBinaryText;
private Text fArgumentsText;
private NewExecutableDialog( Shell parentShell, int flags ) {
super( parentShell );
setShellStyle( getShellStyle() | SWT.RESIZE );
fFlags = flags;
}
@Override
protected Control createContents( Composite parent ) {
Control control = super.createContents( parent );
validate();
return control;
}
@Override
protected Control createDialogArea( Composite parent ) {
boolean remote = (fFlags & REMOTE) > 0;
getShell().setText( Messages.GdbDebugNewExecutableCommand_Debug_New_Executable );
setTitle( Messages.GdbDebugNewExecutableCommand_Select_Binary );
String message = ( remote ) ?
Messages.GdbDebugNewExecutableCommand_Select_binaries_on_host_and_target :
Messages.GdbDebugNewExecutableCommand_Select_binary_and_specify_arguments;
setMessage( message );
Composite control = (Composite)super.createDialogArea( parent );
Composite comp = new Composite( control, SWT.NONE );
GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true );
GridLayout layout = new GridLayout( 3, false );
comp.setLayout( layout );
comp.setLayoutData( gd );
new Label( comp, SWT.None ).setText( remote ? Messages.GdbDebugNewExecutableCommand_Binary_on_host : Messages.GdbDebugNewExecutableCommand_Binary );
fHostBinaryText = new Text( comp, SWT.BORDER );
fHostBinaryText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) );
fHostBinaryText.addModifyListener( new ModifyListener() {
@Override
public void modifyText( ModifyEvent e ) {
validate();
}
} );
Button browseButton = new Button( comp, SWT.PUSH );
browseButton.setText( Messages.GdbDebugNewExecutableCommand_Browse );
browseButton.setFont( JFaceResources.getDialogFont() );
setButtonLayoutData( browseButton );
browseButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
FileDialog dialog = new FileDialog( getShell() );
dialog.setFileName( fHostBinaryText.getText() );
String result = dialog.open();
if ( result != null ) {
fHostBinaryText.setText( result );
}
}
} );
if ( remote ) {
new Label( comp, SWT.None ).setText( Messages.GdbDebugNewExecutableCommand_Binary_on_target );
fTargetBinaryText = new Text( comp, SWT.BORDER );
fTargetBinaryText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1 ) );
fTargetBinaryText.addModifyListener( new ModifyListener() {
@Override
public void modifyText( ModifyEvent e ) {
validate();
}
} );
}
new Label( comp, SWT.None ).setText( Messages.GdbDebugNewExecutableCommand_Arguments );
fArgumentsText = new Text( comp, SWT.BORDER );
fArgumentsText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1 ) );
return control;
}
@Override
protected void okPressed() {
String targetPath = ( fTargetBinaryText != null ) ? fTargetBinaryText.getText().trim() : null;
String args = fArgumentsText.getText().trim();
fInfo = new PromptInfo( fHostBinaryText.getText().trim(), targetPath, args );
super.okPressed();
}
private PromptInfo getInfo() {
return fInfo;
}
private void validate() {
String message = null;
String hostBinary = fHostBinaryText.getText().trim();
File file = new File( hostBinary );
if ( !file.exists() )
message = Messages.GdbDebugNewExecutableCommand_Binary_file_does_not_exist;
else if ( file.isDirectory() )
message = Messages.GdbDebugNewExecutableCommand_Invalid_binary;
if ( fTargetBinaryText != null ) {
if ( fTargetBinaryText.getText().trim().length() == 0 )
message = Messages.GdbDebugNewExecutableCommand_Binary_on_target_must_be_specified;
}
setErrorMessage( message );
getButton( IDialogConstants.OK_ID ).setEnabled( message == null );
}
}
private class PromptInfo {
private String fHostPath;
private String fTargetPath;
private String fArguments;
private PromptInfo( String hostPath, String targetPath, String args ) {
super();
fHostPath = hostPath;
fTargetPath = targetPath;
fArguments = args;
}
String getHostPath() {
return fHostPath;
}
String getTargetPath() {
return fTargetPath;
}
String getArguments() {
return fArguments;
}
}
private final GdbLaunch fLaunch;
private final DsfExecutor fExecutor;
private final DsfServicesTracker fTracker;
public GdbDebugNewExecutableCommand( DsfSession session, GdbLaunch launch ) {
super();
fLaunch = launch;
fExecutor = session.getExecutor();
fTracker = new DsfServicesTracker( GdbUIPlugin.getBundleContext(), session.getId() );
}
public boolean canDebugNewExecutable() {
Query<Boolean> canDebugQuery = new Query<Boolean>() {
@Override
public void execute( DataRequestMonitor<Boolean> rm ) {
IProcesses procService = fTracker.getService( IProcesses.class );
IGDBBackend backend = fTracker.getService( IGDBBackend.class );
ICommandControlService commandControl = fTracker.getService( ICommandControlService.class );
if ( procService == null || commandControl == null || backend == null ) {
rm.setData( false );
rm.done();
return;
}
procService.isDebugNewProcessSupported( commandControl.getContext(), rm );
}
};
try {
fExecutor.execute( canDebugQuery );
return canDebugQuery.get();
}
catch( InterruptedException e ) {
}
catch( ExecutionException e ) {
}
catch( RejectedExecutionException e ) {
// Can be thrown if the session is shutdown
}
return false;
}
public void debugNewExecutable( final RequestMonitor rm ) {
IGDBBackend backend = fTracker.getService( IGDBBackend.class );
final IProcesses procService = fTracker.getService( IProcesses.class );
final ICommandControlService commandControl = fTracker.getService( ICommandControlService.class );
if ( backend == null || procService == null || commandControl == null ) {
rm.setStatus( new Status( IStatus.ERROR, GdbUIPlugin.PLUGIN_ID, "Service is not available" ) ); //$NON-NLS-1$
rm.done();
return;
}
PromptJob job = new PromptJob(
backend.getSessionType() == SessionType.REMOTE,
new DataRequestMonitor<PromptInfo>( fExecutor, rm ){
@Override
protected void handleCancel() {
rm.cancel();
rm.done();
};
@Override
protected void handleSuccess() {
try {
@SuppressWarnings( "unchecked" )
final Map<String, Object> attributes =
new HashMap<String, Object>( getLaunchConfiguration().getAttributes() );
attributes.put( IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_BINARY, getData().getTargetPath() );
attributes.put( ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, getData().getArguments() );
procService.debugNewProcess(
commandControl.getContext(),
getData().getHostPath(),
attributes,
new ImmediateDataRequestMonitor<IDMContext>( rm ) );
}
catch( CoreException e ) {
rm.setStatus( e.getStatus() );
rm.done();
}
};
} );
job.schedule();
}
@Override
protected void doExecute( Object[] targets, IProgressMonitor monitor, IRequest request ) throws CoreException {
Query<Boolean> query = new Query<Boolean>() {
@Override
protected void execute( DataRequestMonitor<Boolean> rm ) {
debugNewExecutable( rm );
}
};
try {
fExecutor.execute( query );
query.get();
}
catch( InterruptedException e ) {
}
catch( ExecutionException e ) {
}
catch( CancellationException e ) {
// Nothing to do, just ignore the command since the user
// cancelled it.
}
catch( RejectedExecutionException e ) {
// Can be thrown if the session is shutdown
}
}
@Override
protected boolean isExecutable( Object[] targets, IProgressMonitor monitor, IEnabledStateRequest request ) throws CoreException {
return canDebugNewExecutable();
}
@Override
protected Object getTarget( Object element ) {
if ( element instanceof GdbLaunch || element instanceof IDMVMContext )
return element;
return null;
}
public void dispose() {
fTracker.dispose();
}
private ILaunchConfiguration getLaunchConfiguration() {
return fLaunch.getLaunchConfiguration();
}
}

View file

@ -1,48 +0,0 @@
/*******************************************************************************
* Copyright (c) 2012 Mentor Graphics 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:
* Mentor Graphics - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.commands;
import org.eclipse.osgi.util.NLS;
public class Messages extends NLS {
public static String GdbDebugNewExecutableCommand_Arguments;
public static String GdbDebugNewExecutableCommand_Binary;
public static String GdbDebugNewExecutableCommand_Binary_file_does_not_exist;
public static String GdbDebugNewExecutableCommand_Binary_on_host;
public static String GdbDebugNewExecutableCommand_Binary_on_target;
public static String GdbDebugNewExecutableCommand_Binary_on_target_must_be_specified;
public static String GdbDebugNewExecutableCommand_Browse;
public static String GdbDebugNewExecutableCommand_Debug_New_Executable;
public static String GdbDebugNewExecutableCommand_Invalid_binary;
public static String GdbDebugNewExecutableCommand_Select_binaries_on_host_and_target;
public static String GdbDebugNewExecutableCommand_Select_Binary;
public static String GdbDebugNewExecutableCommand_Select_binary_and_specify_arguments;
static {
// initialize resource bundle
NLS.initializeMessages( Messages.class.getName(), Messages.class );
}
private Messages() {
}
}

View file

@ -1,12 +0,0 @@
GdbDebugNewExecutableCommand_Arguments=Arguments:
GdbDebugNewExecutableCommand_Binary=Binary:
GdbDebugNewExecutableCommand_Binary_file_does_not_exist=Binary file does not exist
GdbDebugNewExecutableCommand_Binary_on_host=Binary on host:
GdbDebugNewExecutableCommand_Binary_on_target=Binary on target:
GdbDebugNewExecutableCommand_Binary_on_target_must_be_specified=Binary on target must be specified
GdbDebugNewExecutableCommand_Browse=Browse...
GdbDebugNewExecutableCommand_Debug_New_Executable=Debug New Executable
GdbDebugNewExecutableCommand_Invalid_binary=Invalid binary
GdbDebugNewExecutableCommand_Select_binaries_on_host_and_target=Select binaries on the host and the target and specify the arguments
GdbDebugNewExecutableCommand_Select_Binary=Select Binary
GdbDebugNewExecutableCommand_Select_binary_and_specify_arguments=Select a binary and specify the arguments

View file

@ -114,13 +114,6 @@ public class IGDBLaunchConfigurationConstants {
*/
public static final String ATTR_DEBUGGER_TRACEPOINT_MODE = GdbPlugin.PLUGIN_ID + ".TRACEPOINT_MODE"; //$NON-NLS-1$
/**
* Launch configuration attribute key. The value is a String specifying the path of the executable
* on the target.
* @since 4.2
*/
public static final String ATTR_DEBUGGER_REMOTE_BINARY = GdbPlugin.PLUGIN_ID + ".REMOTE_BINARY"; //$NON-NLS-1$
/**
* Launch configuration attribute value. The key is ATTR_DEBUG_NAME.
*/

View file

@ -19,7 +19,6 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.RejectedExecutionException;
import org.eclipse.cdt.debug.core.model.IConnectHandler;
import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler;
import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor;
import org.eclipse.cdt.dsf.concurrent.DefaultDsfExecutor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
@ -296,9 +295,6 @@ public class GdbLaunch extends DsfLaunch
if (adapter.equals(IConnectHandler.class))
return getSession().getModelAdapter(adapter);
if (adapter.equals(IDebugNewExecutableHandler.class))
return getSession().getModelAdapter(adapter);
// Must force adapters to be loaded.
Platform.getAdapterManager().loadAdapter(this, adapter.getName());
return super.getAdapter(adapter);

View file

@ -200,13 +200,9 @@ public class DebugNewProcessSequence extends ReflectionSequence {
@Execute
public void stepSetArguments(RequestMonitor rm) {
try {
String args = CDebugUtils.getAttribute(
fAttributes,
ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS,
""); //$NON-NLS-1$
String args = fBackend.getProgramArguments();
if (args.length() != 0) {
args = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(args);
if (args != null) {
String[] argArray = CommandLineUtil.argumentsToArray(args);
fCommandControl.queueCommand(
fCommandFactory.createMIGDBSetArgs(getContainerContext(), argArray),

View file

@ -15,19 +15,15 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.MIAddInferiorInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
@ -44,37 +40,14 @@ public class DebugNewProcessSequence_7_2 extends DebugNewProcessSequence {
private IGDBControl fGdbControl;
private IGDBProcesses fProcService;
private IGDBBackend fBackend;
private CommandFactory fCommandFactory;
private String fSessionId;
private final boolean fInitialProcess;
private final Map<String, Object> fAttributes;
public DebugNewProcessSequence_7_2(
DsfExecutor executor,
boolean isInitial,
IDMContext dmc,
String file,
Map<String, Object> attributes,
DataRequestMonitor<IDMContext> rm) {
this(executor, isInitial, dmc, file, null, attributes, rm);
}
/**
* @since 4.2
*/
public DebugNewProcessSequence_7_2(
DsfExecutor executor,
boolean isInitial,
IDMContext dmc,
String fileOnHost,
String fileOnTarget,
Map<String, Object> attributes,
DataRequestMonitor<IDMContext> rm) {
super(executor, isInitial, dmc, fileOnHost, attributes, rm);
public DebugNewProcessSequence_7_2(DsfExecutor executor, boolean isInitial, IDMContext dmc, String file,
Map<String, Object> attributes, DataRequestMonitor<IDMContext> rm) {
super(executor, isInitial, dmc, file, attributes, rm);
fSessionId = dmc.getSessionId();
fInitialProcess = isInitial;
fAttributes = attributes;
}
@Override
@ -87,7 +60,6 @@ public class DebugNewProcessSequence_7_2 extends DebugNewProcessSequence {
// Now insert our steps right after the initialization of the base class.
orderList.add(orderList.indexOf("stepInitializeBaseSequence") + 1, "stepInitializeSequence_7_2"); //$NON-NLS-1$ //$NON-NLS-2$
orderList.add(orderList.indexOf("stepInitializeSequence_7_2") + 1, "stepAddInferior"); //$NON-NLS-1$ //$NON-NLS-2$
orderList.add(orderList.indexOf("stepSetExecutable") + 1, "stepSetRemoteExecutable"); //$NON-NLS-1$ //$NON-NLS-2$
return orderList.toArray(new String[orderList.size()]);
}
@ -104,17 +76,14 @@ public class DebugNewProcessSequence_7_2 extends DebugNewProcessSequence {
DsfServicesTracker tracker = new DsfServicesTracker(GdbPlugin.getBundleContext(), fSessionId);
fGdbControl = tracker.getService(IGDBControl.class);
fProcService = tracker.getService(IGDBProcesses.class);
fBackend = tracker.getService(IGDBBackend.class);
tracker.dispose();
if (fGdbControl == null || fProcService == null || fBackend == null) {
if (fGdbControl == null || fProcService == null) {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, IDsfStatusConstants.INTERNAL_ERROR, "Cannot obtain service", null)); //$NON-NLS-1$
rm.done();
return;
}
fCommandFactory = fGdbControl.getCommandFactory();
rm.done();
}
@ -151,36 +120,4 @@ public class DebugNewProcessSequence_7_2 extends DebugNewProcessSequence {
}
});
}
/**
* Set remote executable.
* @since 4.2
*/
@Execute
public void stepSetRemoteExecutable(final RequestMonitor rm) {
if (fBackend.getSessionType() == SessionType.REMOTE && fBackend.getIsAttachSession()) {
String remoteBinary = CDebugUtils.getAttribute(
fAttributes,
IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_BINARY,
""); //$NON-NLS-1$
if (remoteBinary.length() == 0) {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, "Binary on host is not specified")); //$NON-NLS-1$
rm.done();
return;
}
fGdbControl.queueCommand(
fCommandFactory.createMIGDBSet(
getContainerContext(),
new String[] {
"remote", //$NON-NLS-1$
"exec-file", //$NON-NLS-1$
remoteBinary,
}),
new ImmediateDataRequestMonitor<MIInfo>(rm));
}
else {
rm.done();
}
}
}

View file

@ -469,13 +469,10 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 {
return false;
}
// Multi-process does not work for all-stop right now
IMIRunControl runControl = getServicesTracker().getService(IMIRunControl.class);
if (runControl != null && runControl.getRunMode() == MIRunMode.ALL_STOP) {
// Only one process is allowed in all-stop (for now)
return getNumConnected() == 0;
// NOTE: when we support multi-process in all-stop mode,
// we will need to interrupt the target to when doing the attach.
// We don't yet support starting a new process on a remote target
// Bug 344890
if (type == SessionType.REMOTE && fBackend.getIsAttachSession()) {
return false;
}
return true;

View file

@ -296,9 +296,11 @@ public class StartOrRestartProcessSequence_7_0 extends ReflectionSequence {
*/
@Execute
public void stepCreateConsole(final RequestMonitor rm) {
if (fBackend.getSessionType() == SessionType.REMOTE) {
// The program output for a remote session is handled by gdbserver. Therefore,
// no need to create an inferior process and add it to the launch.
if (fBackend.getSessionType() == SessionType.REMOTE && !fBackend.getIsAttachSession()) {
// Remote non-attach sessions don't support multi-process and therefore will not
// start new processes. Those sessions will only start the one process, which should
// not have a console, because it's output is handled by GDB server. Therefore,
// no need to create an inferior process and add it to the launch
rm.done();
return;
}