mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 09:46:02 +02:00
Bug 344890 - [remote] Cannot start a new process on a remote target with
extended-remote Change-Id: Iae6f29a8a549cc57577911bdc84cc95f6ba983df
This commit is contained in:
parent
ca03d0d23a
commit
6f37c7a914
16 changed files with 625 additions and 19 deletions
|
@ -0,0 +1,22 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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 {
|
||||||
|
}
|
BIN
debug/org.eclipse.cdt.debug.ui/icons/obj16/new_exec.gif
Executable file
BIN
debug/org.eclipse.cdt.debug.ui/icons/obj16/new_exec.gif
Executable file
Binary file not shown.
After Width: | Height: | Size: 949 B |
|
@ -242,3 +242,9 @@ OpenNewView.name = Open New View
|
||||||
|
|
||||||
# Disassembly Ruler Column extension point
|
# Disassembly Ruler Column extension point
|
||||||
extPoint.disassemblyRulerColumn=Disassembly Ruler Column
|
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,7 +2012,12 @@
|
||||||
id="org.eclipse.cdt.debug.ui.command.connect"
|
id="org.eclipse.cdt.debug.ui.command.connect"
|
||||||
name="%Connect.name">
|
name="%Connect.name">
|
||||||
</command>
|
</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>
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.ui.handlers">
|
point="org.eclipse.ui.handlers">
|
||||||
|
@ -2079,6 +2084,10 @@
|
||||||
class="org.eclipse.cdt.debug.internal.ui.commands.ConnectCommandHandler"
|
class="org.eclipse.cdt.debug.internal.ui.commands.ConnectCommandHandler"
|
||||||
commandId="org.eclipse.cdt.debug.ui.command.connect">
|
commandId="org.eclipse.cdt.debug.ui.command.connect">
|
||||||
</handler>
|
</handler>
|
||||||
|
<handler
|
||||||
|
class="org.eclipse.cdt.debug.internal.ui.commands.DebugNewExecutableHandler"
|
||||||
|
commandId="org.eclipse.cdt.debug.ui.command.debugNewExecutable">
|
||||||
|
</handler>
|
||||||
</extension>
|
</extension>
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.core.expressions.definitions">
|
point="org.eclipse.core.expressions.definitions">
|
||||||
|
@ -2520,6 +2529,28 @@
|
||||||
</visibleWhen>
|
</visibleWhen>
|
||||||
</command>
|
</command>
|
||||||
</menuContribution>
|
</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 -->
|
<!-- Connect contributions to debug view menu, toolbar menu -->
|
||||||
<menuContribution
|
<menuContribution
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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,6 +19,7 @@ import java.util.WeakHashMap;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
|
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
|
||||||
import org.eclipse.cdt.debug.core.model.IConnectHandler;
|
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.IResumeWithoutSignalHandler;
|
||||||
import org.eclipse.cdt.debug.core.model.IReverseResumeHandler;
|
import org.eclipse.cdt.debug.core.model.IReverseResumeHandler;
|
||||||
import org.eclipse.cdt.debug.core.model.IReverseStepIntoHandler;
|
import org.eclipse.cdt.debug.core.model.IReverseStepIntoHandler;
|
||||||
|
@ -49,6 +50,7 @@ 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.GdbRestartCommand;
|
||||||
import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbSteppingModeTarget;
|
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.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.GdbResumeWithoutSignalCommand;
|
||||||
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseResumeCommand;
|
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseResumeCommand;
|
||||||
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepIntoCommand;
|
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepIntoCommand;
|
||||||
|
@ -114,6 +116,7 @@ public class GdbAdapterFactory
|
||||||
final GdbResumeWithoutSignalCommand fResumeWithoutSignalCommand;
|
final GdbResumeWithoutSignalCommand fResumeWithoutSignalCommand;
|
||||||
final GdbRestartCommand fRestartCommand;
|
final GdbRestartCommand fRestartCommand;
|
||||||
final DsfTerminateCommand fTerminateCommand;
|
final DsfTerminateCommand fTerminateCommand;
|
||||||
|
final GdbDebugNewExecutableCommand fDebugNewExecutableCommand;
|
||||||
final GdbConnectCommand fConnectCommand;
|
final GdbConnectCommand fConnectCommand;
|
||||||
final GdbDisconnectCommand fDisconnectCommand;
|
final GdbDisconnectCommand fDisconnectCommand;
|
||||||
final IDebugModelProvider fDebugModelProvider;
|
final IDebugModelProvider fDebugModelProvider;
|
||||||
|
@ -162,6 +165,7 @@ public class GdbAdapterFactory
|
||||||
fResumeWithoutSignalCommand = new GdbResumeWithoutSignalCommand(session);
|
fResumeWithoutSignalCommand = new GdbResumeWithoutSignalCommand(session);
|
||||||
fRestartCommand = new GdbRestartCommand(session, fLaunch);
|
fRestartCommand = new GdbRestartCommand(session, fLaunch);
|
||||||
fTerminateCommand = new DsfTerminateCommand(session);
|
fTerminateCommand = new DsfTerminateCommand(session);
|
||||||
|
fDebugNewExecutableCommand = new GdbDebugNewExecutableCommand(session, fLaunch);
|
||||||
fConnectCommand = new GdbConnectCommand(session);
|
fConnectCommand = new GdbConnectCommand(session);
|
||||||
fDisconnectCommand = new GdbDisconnectCommand(session);
|
fDisconnectCommand = new GdbDisconnectCommand(session);
|
||||||
fSuspendTrigger = new GdbSuspendTrigger(session, fLaunch);
|
fSuspendTrigger = new GdbSuspendTrigger(session, fLaunch);
|
||||||
|
@ -189,6 +193,7 @@ public class GdbAdapterFactory
|
||||||
session.registerModelAdapter(IRestartHandler.class, fRestartCommand);
|
session.registerModelAdapter(IRestartHandler.class, fRestartCommand);
|
||||||
session.registerModelAdapter(ITerminateHandler.class, fTerminateCommand);
|
session.registerModelAdapter(ITerminateHandler.class, fTerminateCommand);
|
||||||
session.registerModelAdapter(IConnectHandler.class, fConnectCommand);
|
session.registerModelAdapter(IConnectHandler.class, fConnectCommand);
|
||||||
|
session.registerModelAdapter(IDebugNewExecutableHandler.class, fDebugNewExecutableCommand);
|
||||||
session.registerModelAdapter(IDisconnectHandler.class, fDisconnectCommand);
|
session.registerModelAdapter(IDisconnectHandler.class, fDisconnectCommand);
|
||||||
session.registerModelAdapter(IModelSelectionPolicyFactory.class, fModelSelectionPolicyFactory);
|
session.registerModelAdapter(IModelSelectionPolicyFactory.class, fModelSelectionPolicyFactory);
|
||||||
session.registerModelAdapter(IRefreshAllTarget.class, fRefreshAllTarget);
|
session.registerModelAdapter(IRefreshAllTarget.class, fRefreshAllTarget);
|
||||||
|
@ -249,6 +254,7 @@ public class GdbAdapterFactory
|
||||||
session.unregisterModelAdapter(IRestartHandler.class);
|
session.unregisterModelAdapter(IRestartHandler.class);
|
||||||
session.unregisterModelAdapter(ITerminateHandler.class);
|
session.unregisterModelAdapter(ITerminateHandler.class);
|
||||||
session.unregisterModelAdapter(IConnectHandler.class);
|
session.unregisterModelAdapter(IConnectHandler.class);
|
||||||
|
session.unregisterModelAdapter(IDebugNewExecutableHandler.class);
|
||||||
session.unregisterModelAdapter(IDisconnectHandler.class);
|
session.unregisterModelAdapter(IDisconnectHandler.class);
|
||||||
session.unregisterModelAdapter(IModelSelectionPolicyFactory.class);
|
session.unregisterModelAdapter(IModelSelectionPolicyFactory.class);
|
||||||
session.unregisterModelAdapter(IRefreshAllTarget.class);
|
session.unregisterModelAdapter(IRefreshAllTarget.class);
|
||||||
|
|
|
@ -162,7 +162,7 @@ public class GdbConnectCommand extends AbstractDebugCommand implements IConnectH
|
||||||
Object result = new ProcessPrompter().handleStatus(null, info);
|
Object result = new ProcessPrompter().handleStatus(null, info);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
fRequestMonitor.cancel();
|
fRequestMonitor.cancel();
|
||||||
} else if (result instanceof IProcessExtendedInfo[] || result instanceof String) {
|
} else if (result instanceof IProcessExtendedInfo[] || result instanceof String || result instanceof Integer) {
|
||||||
fRequestMonitor.setData(result);
|
fRequestMonitor.setData(result);
|
||||||
} else if (result instanceof Integer) {
|
} else if (result instanceof Integer) {
|
||||||
// This is the case where the user typed in a pid number directly
|
// This is the case where the user typed in a pid number directly
|
||||||
|
@ -328,6 +328,10 @@ public class GdbConnectCommand extends AbstractDebugCommand implements IConnectH
|
||||||
if (data instanceof String) {
|
if (data instanceof String) {
|
||||||
// User wants to start a new process
|
// User wants to start a new process
|
||||||
startNewProcess(controlCtx, (String)data, rm);
|
startNewProcess(controlCtx, (String)data, rm);
|
||||||
|
} else if (data instanceof Integer) {
|
||||||
|
// User specified the process to attach to by
|
||||||
|
// entering its pid manually
|
||||||
|
attachToProcesses(controlCtx, new IProcessExtendedInfo[] { new ProcessInfo(((Integer)data).intValue(), "") }, rm); //$NON-NLS-1$
|
||||||
} else if (data instanceof IProcessExtendedInfo[]) {
|
} else if (data instanceof IProcessExtendedInfo[]) {
|
||||||
attachToProcesses(controlCtx, (IProcessExtendedInfo[])data, rm);
|
attachToProcesses(controlCtx, (IProcessExtendedInfo[])data, rm);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -0,0 +1,375 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
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,6 +114,13 @@ public class IGDBLaunchConfigurationConstants {
|
||||||
*/
|
*/
|
||||||
public static final String ATTR_DEBUGGER_TRACEPOINT_MODE = GdbPlugin.PLUGIN_ID + ".TRACEPOINT_MODE"; //$NON-NLS-1$
|
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.
|
* Launch configuration attribute value. The key is ATTR_DEBUG_NAME.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,6 +19,7 @@ import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.RejectedExecutionException;
|
import java.util.concurrent.RejectedExecutionException;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.model.IConnectHandler;
|
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.ConfinedToDsfExecutor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DefaultDsfExecutor;
|
import org.eclipse.cdt.dsf.concurrent.DefaultDsfExecutor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
|
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
|
||||||
|
@ -295,7 +296,10 @@ public class GdbLaunch extends DsfLaunch
|
||||||
if (adapter.equals(IConnectHandler.class))
|
if (adapter.equals(IConnectHandler.class))
|
||||||
return getSession().getModelAdapter(adapter);
|
return getSession().getModelAdapter(adapter);
|
||||||
|
|
||||||
// Must force adapters to be loaded.
|
if (adapter.equals(IDebugNewExecutableHandler.class))
|
||||||
|
return getSession().getModelAdapter(adapter);
|
||||||
|
|
||||||
|
// Must force adapters to be loaded.
|
||||||
Platform.getAdapterManager().loadAdapter(this, adapter.getName());
|
Platform.getAdapterManager().loadAdapter(this, adapter.getName());
|
||||||
return super.getAdapter(adapter);
|
return super.getAdapter(adapter);
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,9 +200,13 @@ public class DebugNewProcessSequence extends ReflectionSequence {
|
||||||
@Execute
|
@Execute
|
||||||
public void stepSetArguments(RequestMonitor rm) {
|
public void stepSetArguments(RequestMonitor rm) {
|
||||||
try {
|
try {
|
||||||
String args = fBackend.getProgramArguments();
|
String args = CDebugUtils.getAttribute(
|
||||||
|
fAttributes,
|
||||||
|
ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS,
|
||||||
|
""); //$NON-NLS-1$
|
||||||
|
|
||||||
if (args != null) {
|
if (args.length() != 0) {
|
||||||
|
args = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(args);
|
||||||
String[] argArray = CommandLineUtil.argumentsToArray(args);
|
String[] argArray = CommandLineUtil.argumentsToArray(args);
|
||||||
fCommandControl.queueCommand(
|
fCommandControl.queueCommand(
|
||||||
fCommandFactory.createMIGDBSetArgs(getContainerContext(), argArray),
|
fCommandFactory.createMIGDBSetArgs(getContainerContext(), argArray),
|
||||||
|
|
|
@ -15,15 +15,19 @@ import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.CDebugUtils;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
|
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
|
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
|
||||||
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
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.internal.GdbPlugin;
|
||||||
import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl;
|
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.MIAddInferiorInfo;
|
||||||
|
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
||||||
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
|
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
|
@ -40,14 +44,37 @@ public class DebugNewProcessSequence_7_2 extends DebugNewProcessSequence {
|
||||||
|
|
||||||
private IGDBControl fGdbControl;
|
private IGDBControl fGdbControl;
|
||||||
private IGDBProcesses fProcService;
|
private IGDBProcesses fProcService;
|
||||||
|
private IGDBBackend fBackend;
|
||||||
|
private CommandFactory fCommandFactory;
|
||||||
private String fSessionId;
|
private String fSessionId;
|
||||||
private final boolean fInitialProcess;
|
private final boolean fInitialProcess;
|
||||||
|
private final Map<String, Object> fAttributes;
|
||||||
|
|
||||||
public DebugNewProcessSequence_7_2(DsfExecutor executor, boolean isInitial, IDMContext dmc, String file,
|
public DebugNewProcessSequence_7_2(
|
||||||
Map<String, Object> attributes, DataRequestMonitor<IDMContext> rm) {
|
DsfExecutor executor,
|
||||||
super(executor, isInitial, dmc, file, attributes, rm);
|
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);
|
||||||
fSessionId = dmc.getSessionId();
|
fSessionId = dmc.getSessionId();
|
||||||
fInitialProcess = isInitial;
|
fInitialProcess = isInitial;
|
||||||
|
fAttributes = attributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -60,13 +87,14 @@ public class DebugNewProcessSequence_7_2 extends DebugNewProcessSequence {
|
||||||
// Now insert our steps right after the initialization of the base class.
|
// 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("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("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()]);
|
return orderList.toArray(new String[orderList.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the members of the DebugNewProcessSequence_7_2 class.
|
* Initialize the members of the DebugNewProcessSequence_7_2 class.
|
||||||
* This step is mandatory for the rest of the sequence to complete.
|
* This step is mandatory for the rest of the sequence to complete.
|
||||||
|
@ -76,14 +104,17 @@ public class DebugNewProcessSequence_7_2 extends DebugNewProcessSequence {
|
||||||
DsfServicesTracker tracker = new DsfServicesTracker(GdbPlugin.getBundleContext(), fSessionId);
|
DsfServicesTracker tracker = new DsfServicesTracker(GdbPlugin.getBundleContext(), fSessionId);
|
||||||
fGdbControl = tracker.getService(IGDBControl.class);
|
fGdbControl = tracker.getService(IGDBControl.class);
|
||||||
fProcService = tracker.getService(IGDBProcesses.class);
|
fProcService = tracker.getService(IGDBProcesses.class);
|
||||||
|
fBackend = tracker.getService(IGDBBackend.class);
|
||||||
tracker.dispose();
|
tracker.dispose();
|
||||||
|
|
||||||
if (fGdbControl == null || fProcService == null) {
|
if (fGdbControl == null || fProcService == null || fBackend == null) {
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, IDsfStatusConstants.INTERNAL_ERROR, "Cannot obtain service", null)); //$NON-NLS-1$
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, IDsfStatusConstants.INTERNAL_ERROR, "Cannot obtain service", null)); //$NON-NLS-1$
|
||||||
rm.done();
|
rm.done();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fCommandFactory = fGdbControl.getCommandFactory();
|
||||||
|
|
||||||
rm.done();
|
rm.done();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,5 +150,37 @@ public class DebugNewProcessSequence_7_2 extends DebugNewProcessSequence {
|
||||||
rm.done();
|
rm.done();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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,10 +469,13 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't yet support starting a new process on a remote target
|
// Multi-process does not work for all-stop right now
|
||||||
// Bug 344890
|
IMIRunControl runControl = getServicesTracker().getService(IMIRunControl.class);
|
||||||
if (type == SessionType.REMOTE && fBackend.getIsAttachSession()) {
|
if (runControl != null && runControl.getRunMode() == MIRunMode.ALL_STOP) {
|
||||||
return false;
|
// 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.
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -296,11 +296,9 @@ public class StartOrRestartProcessSequence_7_0 extends ReflectionSequence {
|
||||||
*/
|
*/
|
||||||
@Execute
|
@Execute
|
||||||
public void stepCreateConsole(final RequestMonitor rm) {
|
public void stepCreateConsole(final RequestMonitor rm) {
|
||||||
if (fBackend.getSessionType() == SessionType.REMOTE && !fBackend.getIsAttachSession()) {
|
if (fBackend.getSessionType() == SessionType.REMOTE) {
|
||||||
// Remote non-attach sessions don't support multi-process and therefore will not
|
// The program output for a remote session is handled by gdbserver. Therefore,
|
||||||
// start new processes. Those sessions will only start the one process, which should
|
// no need to create an inferior process and add it to the launch.
|
||||||
// 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();
|
rm.done();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue