1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-13 20:15:22 +02:00

[234490][remotecdt] Launching with disconnected target fails (apply patch from Anna Dushistova)

This commit is contained in:
Martin Oberhuber 2008-06-03 10:33:56 +00:00
parent 9f90db5b93
commit 8651d749d0

View file

@ -10,6 +10,7 @@
* Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API * Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API
* Martin Oberhuber (Wind River) - [186773] split ISystemRegistryUI from ISystemRegistry * Martin Oberhuber (Wind River) - [186773] split ISystemRegistryUI from ISystemRegistry
* Martin Oberhuber (Wind River) - [226301][api] IShellService should throw SystemMessageException on error * Martin Oberhuber (Wind River) - [226301][api] IShellService should throw SystemMessageException on error
* Anna Dushistova (MontaVista) - [234490][remotecdt] Launching with disconnected target fails
*******************************************************************************/ *******************************************************************************/
@ -33,6 +34,7 @@ import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor;
@ -53,7 +55,6 @@ import org.eclipse.rse.services.shells.IHostShell;
import org.eclipse.rse.services.shells.IShellService; import org.eclipse.rse.services.shells.IShellService;
import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem; import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem;
import org.eclipse.rse.subsystems.shells.core.subsystems.servicesubsystem.IShellServiceSubSystem; import org.eclipse.rse.subsystems.shells.core.subsystems.servicesubsystem.IShellServiceSubSystem;
import org.eclipse.swt.widgets.Display;
public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate { public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
@ -78,8 +79,13 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
String arguments = getProgramArguments(config); String arguments = getProgramArguments(config);
String remoteExePath = config.getAttribute(IRemoteConnectionConfigurationConstants.ATTR_REMOTE_PATH, ""); //$NON-NLS-1$ String remoteExePath = config.getAttribute(IRemoteConnectionConfigurationConstants.ATTR_REMOTE_PATH, ""); //$NON-NLS-1$
if(monitor==null)
monitor = new NullProgressMonitor();
if(mode.equals(ILaunchManager.DEBUG_MODE)){ if(mode.equals(ILaunchManager.DEBUG_MODE)){
monitor.beginTask("Launching", 100); //$NON-NLS-1$
setDefaultSourceLocator(launch, config); setDefaultSourceLocator(launch, config);
String debugMode = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, String debugMode = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN); ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN);
@ -88,7 +94,7 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
ICDISession dsession = null; ICDISession dsession = null;
try { try {
// Download the binary to the remote before debugging. // Download the binary to the remote before debugging.
remoteFileDownload(config, launch, exePath.toString(), remoteExePath); remoteFileDownload(config, launch, exePath.toString(), remoteExePath, new SubProgressMonitor(monitor, 80));
// Automatically start up the gdbserver. In the future this should be expanded to launch // Automatically start up the gdbserver. In the future this should be expanded to launch
// an arbitrary remote damon. // an arbitrary remote damon.
@ -101,7 +107,7 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
if(arguments != null && !arguments.equals("")) //$NON-NLS-1$ if(arguments != null && !arguments.equals("")) //$NON-NLS-1$
command_arguments += " " + arguments; //$NON-NLS-1$ command_arguments += " " + arguments; //$NON-NLS-1$
remoteShellProcess = remoteShellExec(config, gdbserver_command, remoteShellProcess = remoteShellExec(config, gdbserver_command,
command_arguments); command_arguments, new SubProgressMonitor(monitor, 5));
DebugPlugin.newProcess(launch, remoteShellProcess, Messages.RemoteRunLaunchDelegate_RemoteShell); DebugPlugin.newProcess(launch, remoteShellProcess, Messages.RemoteRunLaunchDelegate_RemoteShell);
// Pre-set configuration constants for the GDBSERVERCDIDebugger to indicate how the gdbserver // Pre-set configuration constants for the GDBSERVERCDIDebugger to indicate how the gdbserver
@ -117,7 +123,7 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
// Default to using the GDBServerCDIDebugger. // Default to using the GDBServerCDIDebugger.
GDBServerCDIDebugger2 debugger = new GDBServerCDIDebugger2(); GDBServerCDIDebugger2 debugger = new GDBServerCDIDebugger2();
dsession = ((ICDIDebugger2)debugger).createSession(launch, exePath.toFile(), dsession = ((ICDIDebugger2)debugger).createSession(launch, exePath.toFile(),
new SubProgressMonitor(monitor, 8)); new SubProgressMonitor(monitor, 15));
boolean stopInMain = config boolean stopInMain = config
.getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, false); .getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, false);
@ -149,21 +155,26 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
// ignore // ignore
} }
throw e; throw e;
} finally {
monitor.done();
} }
} }
} else if(mode.equals(ILaunchManager.RUN_MODE)) { } else if(mode.equals(ILaunchManager.RUN_MODE)) {
monitor.beginTask("Launching", 100); //$NON-NLS-1$
Process remoteProcess = null; Process remoteProcess = null;
try { try {
// Download the binary to the remote before debugging. // Download the binary to the remote before debugging.
remoteFileDownload(config, launch, exePath.toString(),remoteExePath ); remoteFileDownload(config, launch, exePath.toString(),remoteExePath, new SubProgressMonitor(monitor,80));
// Use a remote shell to launch the binary. // Use a remote shell to launch the binary.
remoteProcess = remoteShellExec(config, remoteExePath, arguments); remoteProcess = remoteShellExec(config, remoteExePath, arguments, new SubProgressMonitor(monitor,20));
DebugPlugin.newProcess(launch, remoteProcess, renderProcessLabel(exePath.toOSString())); DebugPlugin.newProcess(launch, remoteProcess, renderProcessLabel(exePath.toOSString()));
} catch (CoreException e) { } catch (CoreException e) {
if(remoteProcess != null) if(remoteProcess != null)
remoteProcess.destroy(); remoteProcess.destroy();
throw e; throw e;
} finally {
monitor.done();
} }
} else { } else {
@ -171,6 +182,7 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
IStatus.OK, NLS.bind(Messages.RemoteRunLaunchDelegate_1, mode), null); IStatus.OK, NLS.bind(Messages.RemoteRunLaunchDelegate_1, mode), null);
throw new CoreException(status); throw new CoreException(status);
} }
} }
private String spaceEscapify(String inputString) { private String spaceEscapify(String inputString) {
@ -194,7 +206,7 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
return connections[i]; return connections[i];
} }
protected IService getConnectedRemoteService(ILaunchConfiguration config, String kindOfService) protected IService getConnectedRemoteService(ILaunchConfiguration config, String kindOfService, IProgressMonitor monitor)
throws CoreException { throws CoreException {
// Check that the service requested is file or shell. // Check that the service requested is file or shell.
@ -214,20 +226,18 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
if(i >= subSystems.length) if(i >= subSystems.length)
abort(Messages.RemoteRunLaunchDelegate_4, null, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); abort(Messages.RemoteRunLaunchDelegate_4, null, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
// Need to run this in the UI thread
final ISubSystem subsystem = subSystems[i]; final ISubSystem subsystem = subSystems[i];
Display.getDefault().syncExec(new Runnable() try {
{ subsystem.connect(monitor, false);
public void run() } catch (CoreException e) {
{ try { throw e;
subsystem.connect(false, null); } catch (OperationCanceledException e) {
} catch (Exception e) { throw new CoreException(Status.CANCEL_STATUS);
// Ignore } catch (Exception e) {
} throw new CoreException(new Status(IStatus.ERROR, getPluginID() ,IStatus.OK,
} e.getLocalizedMessage(), e));
}); }
if(!subsystem.isConnected()) if(!subsystem.isConnected())
abort(Messages.RemoteRunLaunchDelegate_5, null, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); abort(Messages.RemoteRunLaunchDelegate_5, null, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
@ -238,27 +248,29 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
} }
protected Process remoteFileDownload(ILaunchConfiguration config, ILaunch launch, protected Process remoteFileDownload(ILaunchConfiguration config, ILaunch launch,
String localExePath, String remoteExePath) throws CoreException { String localExePath, String remoteExePath, IProgressMonitor monitor) throws CoreException {
boolean skipDownload = config.getAttribute(IRemoteConnectionConfigurationConstants.ATTR_SKIP_DOWNLOAD_TO_TARGET, false); boolean skipDownload = config.getAttribute(IRemoteConnectionConfigurationConstants.ATTR_SKIP_DOWNLOAD_TO_TARGET, false);
if(skipDownload) if(skipDownload)
// Nothing to do. Download is skipped. // Nothing to do. Download is skipped.
return null; return null;
monitor.beginTask("Downloading remote file", 100); //$NON-NLS-1$
IFileService fileService = (IFileService) getConnectedRemoteService(config, FILE_SERVICE); IFileService fileService = (IFileService) getConnectedRemoteService(config, FILE_SERVICE, new SubProgressMonitor(monitor, 10));
File file = new File(localExePath); File file = new File(localExePath);
Path remotePath = new Path(remoteExePath); Path remotePath = new Path(remoteExePath);
try { try {
fileService.upload(file, remotePath.removeLastSegments(1).toString(), remotePath.lastSegment(), fileService.upload(file, remotePath.removeLastSegments(1).toString(), remotePath.lastSegment(),
true, null, null, new NullProgressMonitor()); true, null, null, new SubProgressMonitor(monitor, 85));
// Need to change the permissions to match the original file permissions because of a bug in upload // Need to change the permissions to match the original file permissions because of a bug in upload
Process p = remoteShellExec(config, "chmod", "+x " + spaceEscapify(remotePath.toString())); //$NON-NLS-1$ //$NON-NLS-2$ Process p = remoteShellExec(config, "chmod", "+x " + spaceEscapify(remotePath.toString()), new SubProgressMonitor(monitor, 5)); //$NON-NLS-1$ //$NON-NLS-2$
Thread.sleep(500); Thread.sleep(500);
p.destroy(); p.destroy();
} catch (Exception e) { } catch (Exception e) {
abort(Messages.RemoteRunLaunchDelegate_6, e, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR ); abort(Messages.RemoteRunLaunchDelegate_6, e, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR );
} } finally {
monitor.done();
}
return null; return null;
} }
@ -268,7 +280,7 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
} }
protected Process remoteShellExec(ILaunchConfiguration config, String remoteCommandPath, protected Process remoteShellExec(ILaunchConfiguration config, String remoteCommandPath,
String arguments) throws CoreException { String arguments, IProgressMonitor monitor) throws CoreException {
// The exit command is called to force the remote shell to close after our command // The exit command is called to force the remote shell to close after our command
// is executed. This is to prevent a running process at the end of the debug session. // is executed. This is to prevent a running process at the end of the debug session.
// See Bug 158786. // See Bug 158786.
@ -276,7 +288,8 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
spaceEscapify(remoteCommandPath) + " " + arguments; //$NON-NLS-1$ spaceEscapify(remoteCommandPath) + " " + arguments; //$NON-NLS-1$
String remote_command = real_remote_command + CMD_DELIMITER + EXIT_CMD; String remote_command = real_remote_command + CMD_DELIMITER + EXIT_CMD;
IShellService shellService = (IShellService) getConnectedRemoteService(config, SHELL_SERVICE);
IShellService shellService = (IShellService) getConnectedRemoteService(config, SHELL_SERVICE, monitor);
// This is necessary because runCommand does not actually run the command right now. // This is necessary because runCommand does not actually run the command right now.
String env[] = new String[0]; String env[] = new String[0];