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:
parent
d55bca53a5
commit
629232eae1
15 changed files with 18 additions and 620 deletions
|
@ -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 |
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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() {
|
||||
}
|
||||
}
|
|
@ -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
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue