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:
parent
9f90db5b93
commit
8651d749d0
1 changed files with 41 additions and 28 deletions
|
@ -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];
|
||||||
|
|
Loading…
Add table
Reference in a new issue