mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 17:56:01 +02:00
Bug 368597: [remote debug] if gdbserver fails to launch on target, launch doesn't get terminated
This commit is contained in:
parent
ccd531c177
commit
13d3bad2de
4 changed files with 120 additions and 7 deletions
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006, 2009 Wind River Systems, Inc. and others.
|
||||
* Copyright (c) 2006, 2012 Wind River Systems, Inc. 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
|
||||
|
@ -12,6 +12,7 @@
|
|||
* Anna Dushistova (MontaVista) - [244173][remotecdt][nls] Externalize Strings in RemoteRunLaunchDelegate
|
||||
* Anna Dushistova (MontaVista) - [181517][usability] Specify commands to be run before remote application launch
|
||||
* Nikita Shulga (EmbeddedAlley) - [265236][remotecdt] Wait for RSE to initialize before querying it for host list
|
||||
* Anna Dushistova (MontaVista) - [368597][remote debug] if gdbserver fails to launch on target, launch doesn't get terminated
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.launch.remote;
|
||||
|
||||
|
@ -45,6 +46,8 @@ public class Messages extends NLS {
|
|||
public static String RemoteCMainTab_Properties_Location;
|
||||
public static String RemoteCMainTab_Properties_Skip_default;
|
||||
|
||||
public static String RemoteGdbLaunchDelegate_gdbserverFailedToStartErrorMessage;
|
||||
|
||||
public static String RemoteRunLaunchDelegate_0;
|
||||
|
||||
public static String RemoteRunLaunchDelegate_RemoteShell;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
################################################################################
|
||||
# Copyright (c) 2006, 2009 Wind River Systems, Inc. and others.
|
||||
# Copyright (c) 2006, 2012 Wind River Systems, Inc. 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
|
||||
|
@ -12,6 +12,7 @@
|
|||
# Anna Dushistova (MontaVista) - [244173][remotecdt][nls] Externalize Strings in RemoteRunLaunchDelegate
|
||||
# Anna Dushistova (MontaVista) - [181517][usability] Specify commands to be run before remote application launch
|
||||
# Nikita Shulga (EmbeddedAlley) - [265236][remotecdt] Wait for RSE to initialize before querying it for host list
|
||||
# Anna Dushistova (MontaVista) - [368597][remote debug] if gdbserver fails to launch on target, launch doesn't get terminated
|
||||
################################################################################
|
||||
|
||||
# NLS_MESSAGEFORMAT_VAR
|
||||
|
@ -49,3 +50,4 @@ RemoteCMainTab_Properties=Properties...
|
|||
RemoteCMainTab_Properties_title=Properties
|
||||
RemoteCMainTab_Properties_Location=Remote workspace location:
|
||||
RemoteCMainTab_Properties_Skip_default=Skip download to target path by default
|
||||
RemoteGdbLaunchDelegate_gdbserverFailedToStartErrorMessage=Could not start gdbserver on the remote host. See console output for more details.
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
* Anna Dushistova (Mentor Graphics) - initial API and implementation
|
||||
* Anna Dushistova (Mentor Graphics) - moved to org.eclipse.cdt.launch.remote.launching
|
||||
* Anna Dushistova (MontaVista) - [318051][remote debug] Terminating when "Remote shell" process is selected doesn't work
|
||||
* Anna Dushistova (MontaVista) - [368597][remote debug] if gdbserver fails to launch on target, launch doesn't get terminated
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.launch.remote.launching;
|
||||
|
||||
|
@ -38,12 +39,18 @@ import org.eclipse.debug.core.DebugPlugin;
|
|||
import org.eclipse.debug.core.ILaunch;
|
||||
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
||||
import org.eclipse.debug.core.model.IProcess;
|
||||
import org.eclipse.rse.core.RSECorePlugin;
|
||||
import org.eclipse.rse.services.shells.HostShellProcessAdapter;
|
||||
import org.eclipse.rse.services.shells.IHostOutput;
|
||||
import org.eclipse.rse.services.shells.IHostShell;
|
||||
import org.eclipse.rse.services.shells.IHostShellChangeEvent;
|
||||
import org.eclipse.rse.services.shells.IHostShellOutputListener;
|
||||
|
||||
public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate {
|
||||
|
||||
private boolean gdbserverReady = false;
|
||||
|
||||
@Override
|
||||
public void launch(ILaunchConfiguration config, String mode,
|
||||
ILaunch launch, IProgressMonitor monitor) throws CoreException {
|
||||
|
@ -100,6 +107,23 @@ public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate {
|
|||
ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
|
||||
|
||||
}
|
||||
final Object lock = new Object();
|
||||
if (remoteShell != null) {
|
||||
remoteShell.addOutputListener(new IHostShellOutputListener() {
|
||||
|
||||
public void shellOutputChanged(IHostShellChangeEvent event) {
|
||||
for (IHostOutput line : event.getLines()) {
|
||||
if (line.getString().contains("Listening on port")) { //$NON-NLS-1$
|
||||
synchronized (lock) {
|
||||
setGdbserverReady(true);
|
||||
lock.notifyAll();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
remoteShellProcess = new HostShellProcessAdapter(remoteShell) {
|
||||
|
||||
|
@ -136,9 +160,28 @@ public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate {
|
|||
ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
|
||||
}
|
||||
|
||||
DebugPlugin.newProcess(launch, remoteShellProcess,
|
||||
IProcess iProcess = DebugPlugin.newProcess(launch, remoteShellProcess,
|
||||
Messages.RemoteRunLaunchDelegate_RemoteShell);
|
||||
|
||||
// Now wait until gdbserver is up and running on the remote host
|
||||
synchronized (lock) {
|
||||
while (!isGdbserverReady()) {
|
||||
if (monitor.isCanceled() || iProcess.isTerminated()) {
|
||||
//gdbserver launch failed
|
||||
if (remoteShellProcess != null) {
|
||||
remoteShellProcess.destroy();
|
||||
}
|
||||
abort(Messages.RemoteGdbLaunchDelegate_gdbserverFailedToStartErrorMessage,
|
||||
null,
|
||||
ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
|
||||
}
|
||||
try {
|
||||
lock.wait(300);
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Let debugger know how gdbserver was started on the remote
|
||||
ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
|
||||
wc.setAttribute(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP,
|
||||
|
@ -163,6 +206,7 @@ public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate {
|
|||
} finally {
|
||||
monitor.done();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected String getProgramArguments(ILaunchConfiguration config)
|
||||
|
@ -181,4 +225,12 @@ public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate {
|
|||
protected String getPluginID() {
|
||||
return Activator.PLUGIN_ID;
|
||||
}
|
||||
|
||||
protected boolean isGdbserverReady() {
|
||||
return gdbserverReady;
|
||||
}
|
||||
|
||||
protected void setGdbserverReady(boolean gdbserverReady) {
|
||||
this.gdbserverReady = gdbserverReady;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
* Anna Dushistova (Mentor Graphics) - [314659]Fixed deprecated methods
|
||||
* Anna Dushistova (Mentor Graphics) - moved to org.eclipse.cdt.launch.remote.launching
|
||||
* Anna Dushistova (MontaVista) - [318051][remote debug] Terminating when "Remote shell" process is selected doesn't work
|
||||
* Anna Dushistova (MontaVista) - [368597][remote debug] if gdbserver fails to launch on target, launch doesn't get terminated
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.launch.remote.launching;
|
||||
|
@ -55,11 +56,15 @@ import org.eclipse.debug.core.model.IProcess;
|
|||
import org.eclipse.osgi.util.NLS;
|
||||
import org.eclipse.rse.core.RSECorePlugin;
|
||||
import org.eclipse.rse.services.shells.HostShellProcessAdapter;
|
||||
import org.eclipse.rse.services.shells.IHostOutput;
|
||||
import org.eclipse.rse.services.shells.IHostShell;
|
||||
import org.eclipse.rse.services.shells.IHostShellChangeEvent;
|
||||
import org.eclipse.rse.services.shells.IHostShellOutputListener;
|
||||
|
||||
public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
|
||||
|
||||
private ICDISession dsession;
|
||||
private boolean gdbserverReady;
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
|
@ -142,6 +147,27 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
|
|||
ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
|
||||
}
|
||||
|
||||
final Object lock = new Object();
|
||||
if (remoteShell != null) {
|
||||
remoteShell
|
||||
.addOutputListener(new IHostShellOutputListener() {
|
||||
|
||||
public void shellOutputChanged(
|
||||
IHostShellChangeEvent event) {
|
||||
for (IHostOutput line : event
|
||||
.getLines()) {
|
||||
if (line.getString().contains(
|
||||
"Listening on port")) { //$NON-NLS-1$
|
||||
synchronized (lock) {
|
||||
setGdbserverReady(true);
|
||||
lock.notifyAll();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
remoteShellProcess = new HostShellProcessAdapter(remoteShell) {
|
||||
|
||||
|
@ -164,8 +190,28 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
|
|||
RSEHelper.abort(Messages.RemoteRunLaunchDelegate_7, e,
|
||||
ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
|
||||
}
|
||||
DebugPlugin.newProcess(launch, remoteShellProcess,
|
||||
Messages.RemoteRunLaunchDelegate_RemoteShell);
|
||||
IProcess rsProcess = DebugPlugin
|
||||
.newProcess(
|
||||
launch,
|
||||
remoteShellProcess,
|
||||
Messages.RemoteRunLaunchDelegate_RemoteShell);
|
||||
|
||||
// Now wait until gdbserver is up and running on the
|
||||
// remote host
|
||||
synchronized (lock) {
|
||||
while (!isGdbserverReady()) {
|
||||
if (monitor.isCanceled()
|
||||
|| rsProcess.isTerminated()) {
|
||||
abort(Messages.RemoteGdbLaunchDelegate_gdbserverFailedToStartErrorMessage,
|
||||
null,
|
||||
ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
|
||||
}
|
||||
try {
|
||||
lock.wait(300);
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Pre-set configuration constants for the
|
||||
// GDBSERVERCDIDebugger to indicate how the gdbserver
|
||||
|
@ -223,6 +269,7 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
|
|||
iprocess, exeFile, true, false, stopSymbol,
|
||||
true);
|
||||
}
|
||||
}
|
||||
} catch (CoreException e) {
|
||||
try {
|
||||
if (dsession != null)
|
||||
|
@ -276,4 +323,13 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate {
|
|||
ICDISession getSession(){
|
||||
return dsession;
|
||||
}
|
||||
|
||||
protected boolean isGdbserverReady() {
|
||||
return gdbserverReady;
|
||||
}
|
||||
|
||||
protected void setGdbserverReady(boolean gdbserverReady) {
|
||||
this.gdbserverReady = gdbserverReady;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue