mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Fix for the JUnit test due to Bug 223969.
The JUnit launch now re-uses (without any changes) the standard DSF launch sequence. The problem then became that the tests would start too fast, before the suspend event was received. To address this, I added a wait for the Suspend event in the BaseTestCase.baseBeforeMethod() which runs before every test.
This commit is contained in:
parent
c50257d07d
commit
d571b6e48a
4 changed files with 33 additions and 381 deletions
|
@ -16,6 +16,7 @@ import java.util.Map;
|
||||||
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
import org.eclipse.dd.gdb.launching.GdbLaunch;
|
import org.eclipse.dd.gdb.launching.GdbLaunch;
|
||||||
|
import org.eclipse.dd.mi.service.command.events.MIStoppedEvent;
|
||||||
import org.eclipse.debug.core.DebugPlugin;
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
import org.eclipse.debug.core.ILaunchConfiguration;
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
import org.eclipse.debug.core.ILaunchConfigurationType;
|
import org.eclipse.debug.core.ILaunchConfigurationType;
|
||||||
|
@ -81,6 +82,16 @@ public class BaseTestCase {
|
||||||
|
|
||||||
// Now initialize our SyncUtility, since we have the launcher
|
// Now initialize our SyncUtility, since we have the launcher
|
||||||
SyncUtil.initialize(fLaunch.getSession());
|
SyncUtil.initialize(fLaunch.getSession());
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Also wait for the program to stop before allowing tests to start
|
||||||
|
final ServiceEventWaitor<MIStoppedEvent> eventWaitor =
|
||||||
|
new ServiceEventWaitor<MIStoppedEvent>(
|
||||||
|
fLaunch.getSession(),
|
||||||
|
MIStoppedEvent.class);
|
||||||
|
eventWaitor.waitForEvent(10000);
|
||||||
|
} catch (Exception e) {}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
|
|
@ -1,267 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems 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:
|
|
||||||
* Wind River Systems - initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
package org.eclipse.dd.tests.gdb.launching;
|
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
|
||||||
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
|
||||||
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector;
|
|
||||||
import org.eclipse.cdt.debug.mi.core.IMILaunchConfigurationConstants;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
|
||||||
import org.eclipse.core.runtime.IPath;
|
|
||||||
import org.eclipse.core.runtime.IStatus;
|
|
||||||
import org.eclipse.core.runtime.Path;
|
|
||||||
import org.eclipse.core.runtime.Status;
|
|
||||||
import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
|
|
||||||
import org.eclipse.dd.dsf.concurrent.RequestMonitor;
|
|
||||||
import org.eclipse.dd.dsf.concurrent.Sequence;
|
|
||||||
import org.eclipse.dd.dsf.debug.service.StepQueueManager;
|
|
||||||
import org.eclipse.dd.dsf.service.DsfServiceEventHandler;
|
|
||||||
import org.eclipse.dd.dsf.service.DsfSession;
|
|
||||||
import org.eclipse.dd.gdb.launching.GdbLaunch;
|
|
||||||
import org.eclipse.dd.gdb.service.GDBRunControl;
|
|
||||||
import org.eclipse.dd.gdb.service.command.GDBControl;
|
|
||||||
import org.eclipse.dd.mi.service.CSourceLookup;
|
|
||||||
import org.eclipse.dd.mi.service.ExpressionService;
|
|
||||||
import org.eclipse.dd.mi.service.MIBreakpoints;
|
|
||||||
import org.eclipse.dd.mi.service.MIBreakpointsManager;
|
|
||||||
import org.eclipse.dd.mi.service.MIDisassembly;
|
|
||||||
import org.eclipse.dd.mi.service.MIMemory;
|
|
||||||
import org.eclipse.dd.mi.service.MIRegisters;
|
|
||||||
import org.eclipse.dd.mi.service.MIStack;
|
|
||||||
import org.eclipse.dd.mi.service.command.commands.MIBreakInsert;
|
|
||||||
import org.eclipse.dd.mi.service.command.commands.MIExecRun;
|
|
||||||
import org.eclipse.dd.mi.service.command.events.MIStoppedEvent;
|
|
||||||
import org.eclipse.dd.mi.service.command.output.MIBreakInsertInfo;
|
|
||||||
import org.eclipse.dd.mi.service.command.output.MIInfo;
|
|
||||||
import org.eclipse.debug.core.DebugException;
|
|
||||||
|
|
||||||
public class LaunchSequence extends Sequence {
|
|
||||||
|
|
||||||
public class EntryPointHitEventListener {
|
|
||||||
boolean fAborted = false;
|
|
||||||
boolean fFinished = false;
|
|
||||||
final RequestMonitor fRequestMonitor;
|
|
||||||
|
|
||||||
EntryPointHitEventListener(RequestMonitor requestMonitor) {
|
|
||||||
fRequestMonitor = requestMonitor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@DsfServiceEventHandler
|
|
||||||
public void eventDispatched(@SuppressWarnings("unused")
|
|
||||||
MIStoppedEvent e) {
|
|
||||||
fFinished = true;
|
|
||||||
if (!fAborted) {
|
|
||||||
fSession.removeServiceEventListener(this);
|
|
||||||
fRequestMonitor.done();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Step[] fSteps = new Step[] {
|
|
||||||
// Create and initialize the Connection service.
|
|
||||||
new Step() {
|
|
||||||
@Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
//
|
|
||||||
// Create the connection.
|
|
||||||
//
|
|
||||||
fCommandControl = new GDBControl(
|
|
||||||
fSession, getGDBPath(), fExecPath, GDBControl.SessionType.RUN, 30);
|
|
||||||
fCommandControl.initialize(requestMonitor);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
/*
|
|
||||||
* If needed, insert breakpoint at main and run to it.
|
|
||||||
*/
|
|
||||||
new Step() {
|
|
||||||
private boolean fStopInMain = false;
|
|
||||||
private String fStopSymbol = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return The return value actually indicates whether the get operation succeeded,
|
|
||||||
* not whether to stop.
|
|
||||||
*/
|
|
||||||
private boolean readStopAtMain(RequestMonitor requestMonitor) {
|
|
||||||
try {
|
|
||||||
fStopInMain = fLaunch.getLaunchConfiguration().getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, false );
|
|
||||||
} catch (CoreException e) {
|
|
||||||
requestMonitor.setStatus(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, -1, "Cannot retrieve the entry point symbol", e)); //$NON-NLS-1$
|
|
||||||
requestMonitor.done();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean readStopSymbol(RequestMonitor requestMonitor) {
|
|
||||||
try {
|
|
||||||
fStopSymbol = fLaunch.getLaunchConfiguration().getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_SYMBOL_DEFAULT );
|
|
||||||
} catch (CoreException e) {
|
|
||||||
requestMonitor.setStatus(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, DebugException.CONFIGURATION_INVALID, "Cannot retrieve the entry point symbol", e)); //$NON-NLS-1$
|
|
||||||
requestMonitor.done();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute(final RequestMonitor requestMonitor) {
|
|
||||||
if (!readStopAtMain(requestMonitor)) return;
|
|
||||||
if (!fStopInMain) {
|
|
||||||
requestMonitor.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!readStopSymbol(requestMonitor)) return;
|
|
||||||
|
|
||||||
// Create a listener to wait for the stopped event, and register as even handler.
|
|
||||||
// This handler will execute the requestMonitor.
|
|
||||||
final EntryPointHitEventListener entryPointHitListener = new EntryPointHitEventListener(requestMonitor);
|
|
||||||
fSession.addServiceEventListener(entryPointHitListener, null);
|
|
||||||
|
|
||||||
// Create a time-out, to abort if breakpoint not hit.
|
|
||||||
fSession.getExecutor().schedule(
|
|
||||||
new Runnable() { public void run() {
|
|
||||||
// Only process the event if we have not finished yet (hit the breakpoint).
|
|
||||||
if (!entryPointHitListener.fFinished) {
|
|
||||||
// Mark the listener as aborted, and unregister it as event listener.
|
|
||||||
entryPointHitListener.fAborted = true;
|
|
||||||
fSession.removeServiceEventListener(entryPointHitListener);
|
|
||||||
|
|
||||||
// Submit the error result for the step.
|
|
||||||
requestMonitor.setStatus(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, DebugException.TARGET_REQUEST_FAILED, "Timed out running to entry point.", null)); //$NON-NLS-1$
|
|
||||||
requestMonitor.done();
|
|
||||||
}
|
|
||||||
}},
|
|
||||||
60, TimeUnit.SECONDS);
|
|
||||||
|
|
||||||
// Insert a breakpoint at the requested stop symbol.
|
|
||||||
fCommandControl.queueCommand(
|
|
||||||
new MIBreakInsert(fCommandControl.getGDBDMContext(), true, false, null, 0, fStopSymbol, 0),
|
|
||||||
new DataRequestMonitor<MIBreakInsertInfo>(getExecutor(), requestMonitor) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
|
|
||||||
// After the break-insert is done, execute the -exec-run command.
|
|
||||||
fCommandControl.queueCommand(
|
|
||||||
new MIExecRun(fCommandControl.getGDBDMContext(), new String[0]),
|
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
// Note : Do we not need to do something with the original requestMonitor?
|
|
||||||
// Do nothing. Execution was resumed and the EntryPointHitEventListener
|
|
||||||
// will resume execution
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new Step() { @Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
new GDBRunControl(fSession).initialize(requestMonitor);
|
|
||||||
}},
|
|
||||||
new Step() { @Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
new StepQueueManager(fSession).initialize(requestMonitor);
|
|
||||||
}},
|
|
||||||
new Step() { @Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
new MIMemory(fSession).initialize(requestMonitor);
|
|
||||||
}},
|
|
||||||
new Step() { @Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
new MIStack(fSession).initialize(requestMonitor);
|
|
||||||
}},
|
|
||||||
new Step() { @Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
new ExpressionService(fSession).initialize(requestMonitor);
|
|
||||||
}},
|
|
||||||
new Step() { @Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
fSourceLookup = new CSourceLookup(fSession);
|
|
||||||
fSourceLookup.initialize(requestMonitor);
|
|
||||||
}},
|
|
||||||
new Step() { @Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
fSourceLookup.setSourceLookupDirector(
|
|
||||||
fCommandControl.getGDBDMContext(),
|
|
||||||
((CSourceLookupDirector)fLaunch.getSourceLocator()));
|
|
||||||
requestMonitor.done();
|
|
||||||
}},
|
|
||||||
new Step() { @Override
|
|
||||||
public void execute(final RequestMonitor requestMonitor) {
|
|
||||||
// Create the low-level breakpoint service
|
|
||||||
final MIBreakpoints bpService = new MIBreakpoints(fSession);
|
|
||||||
bpService.initialize(new RequestMonitor(getExecutor(), requestMonitor) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
requestMonitor.done();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}},
|
|
||||||
new Step() { @Override
|
|
||||||
public void execute(final RequestMonitor requestMonitor) {
|
|
||||||
// Create high-level breakpoint service and install breakpoints
|
|
||||||
// for the GDB debug context.
|
|
||||||
final MIBreakpointsManager bpmService = new MIBreakpointsManager(fSession, CDebugCorePlugin.PLUGIN_ID);
|
|
||||||
bpmService.initialize(new RequestMonitor(getExecutor(), requestMonitor) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
bpmService.startTrackingBreakpoints(fCommandControl.getGDBDMContext(), requestMonitor);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}},
|
|
||||||
new Step() { @Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
new MIRegisters(fSession).initialize(requestMonitor);
|
|
||||||
}},
|
|
||||||
new Step() { @Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
new MIDisassembly(fSession).initialize(requestMonitor);
|
|
||||||
}},
|
|
||||||
/*new Step() { public void execute(RequestMonitor requestMonitor) {
|
|
||||||
new GDBVariables(fSession).initialize(requestMonitor);
|
|
||||||
}},*/
|
|
||||||
};
|
|
||||||
|
|
||||||
final DsfSession fSession;
|
|
||||||
final GdbLaunch fLaunch;
|
|
||||||
final IPath fExecPath;
|
|
||||||
|
|
||||||
GDBControl fCommandControl;
|
|
||||||
CSourceLookup fSourceLookup;
|
|
||||||
|
|
||||||
public LaunchSequence(DsfSession session, GdbLaunch launch, IPath execPath) {
|
|
||||||
super(session.getExecutor());
|
|
||||||
fSession = session;
|
|
||||||
fLaunch = launch;
|
|
||||||
fExecPath = execPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Step[] getSteps() {
|
|
||||||
return fSteps;
|
|
||||||
}
|
|
||||||
|
|
||||||
private IPath getGDBPath() {
|
|
||||||
IPath retVal = new Path("gdb.exe"); //$NON-NLS-1$
|
|
||||||
try {
|
|
||||||
retVal = new Path( fLaunch.getLaunchConfiguration().getAttribute( IMILaunchConfigurationConstants.ATTR_DEBUG_NAME, IMILaunchConfigurationConstants.DEBUGGER_DEBUG_NAME_DEFAULT ) );
|
|
||||||
} catch (CoreException e) {
|
|
||||||
}
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,108 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 Wind River Systems 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:
|
|
||||||
* Wind River Systems - initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
package org.eclipse.dd.tests.gdb.launching;
|
|
||||||
|
|
||||||
import org.eclipse.core.runtime.IStatus;
|
|
||||||
import org.eclipse.core.runtime.Status;
|
|
||||||
import org.eclipse.dd.dsf.concurrent.DsfExecutor;
|
|
||||||
import org.eclipse.dd.dsf.concurrent.IDsfStatusConstants;
|
|
||||||
import org.eclipse.dd.dsf.concurrent.RequestMonitor;
|
|
||||||
import org.eclipse.dd.dsf.concurrent.Sequence;
|
|
||||||
import org.eclipse.dd.dsf.service.DsfServicesTracker;
|
|
||||||
import org.eclipse.dd.dsf.service.IDsfService;
|
|
||||||
import org.eclipse.dd.gdb.service.GDBRunControl;
|
|
||||||
import org.eclipse.dd.gdb.service.command.GDBControl;
|
|
||||||
import org.eclipse.dd.mi.service.CSourceLookup;
|
|
||||||
import org.eclipse.dd.mi.service.ExpressionService;
|
|
||||||
import org.eclipse.dd.mi.service.MIBreakpoints;
|
|
||||||
import org.eclipse.dd.mi.service.MIBreakpointsManager;
|
|
||||||
import org.eclipse.dd.mi.service.MIDisassembly;
|
|
||||||
import org.eclipse.dd.mi.service.MIMemory;
|
|
||||||
import org.eclipse.dd.mi.service.MIRegisters;
|
|
||||||
import org.eclipse.dd.mi.service.MIStack;
|
|
||||||
|
|
||||||
|
|
||||||
public class ShutdownSequence extends Sequence {
|
|
||||||
|
|
||||||
String fSessionId;
|
|
||||||
String fApplicationName;
|
|
||||||
String fDebugModelId;
|
|
||||||
DsfServicesTracker fTracker;
|
|
||||||
|
|
||||||
|
|
||||||
public ShutdownSequence(DsfExecutor executor, String sessionId, RequestMonitor requestMonitor) {
|
|
||||||
super(executor, requestMonitor);
|
|
||||||
fSessionId = sessionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Step[] getSteps() { return fSteps; }
|
|
||||||
|
|
||||||
private final Step[] fSteps = new Step[] {
|
|
||||||
new Step() {
|
|
||||||
@Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
fTracker = new DsfServicesTracker(TestsPlugin.getBundleContext(), fSessionId);
|
|
||||||
requestMonitor.done();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void rollBack(RequestMonitor requestMonitor) {
|
|
||||||
fTracker.dispose();
|
|
||||||
fTracker = null;
|
|
||||||
requestMonitor.done();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new Step() { @Override public void execute(RequestMonitor requestMonitor) { shutdownService(MIDisassembly.class, requestMonitor); }},
|
|
||||||
new Step() { @Override public void execute(RequestMonitor requestMonitor) { shutdownService(MIRegisters.class, requestMonitor); }},
|
|
||||||
new Step() {
|
|
||||||
// Uninstall the breakpoints before the service is shut down.
|
|
||||||
@Override
|
|
||||||
public void execute(RequestMonitor requestMonitor) {
|
|
||||||
MIBreakpointsManager bpm = fTracker.getService(MIBreakpointsManager.class);
|
|
||||||
GDBControl commandControl = fTracker.getService(GDBControl.class);
|
|
||||||
if (bpm != null && commandControl != null) {
|
|
||||||
bpm.stopTrackingBreakpoints(commandControl.getGDBDMContext(), requestMonitor);
|
|
||||||
} else {
|
|
||||||
requestMonitor.setStatus(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, IDsfStatusConstants.INTERNAL_ERROR,
|
|
||||||
"Needed services not found.", null)); //$NON-NLS-1$
|
|
||||||
requestMonitor.done();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new Step() { @Override public void execute(RequestMonitor requestMonitor) { shutdownService(MIBreakpointsManager.class, requestMonitor); }},
|
|
||||||
new Step() { @Override public void execute(RequestMonitor requestMonitor) { shutdownService(MIBreakpoints.class, requestMonitor); }},
|
|
||||||
new Step() { @Override public void execute(RequestMonitor requestMonitor) { shutdownService(CSourceLookup.class, requestMonitor); }},
|
|
||||||
new Step() { @Override public void execute(RequestMonitor requestMonitor) { shutdownService(ExpressionService.class, requestMonitor); }},
|
|
||||||
new Step() { @Override public void execute(RequestMonitor requestMonitor) { shutdownService(MIStack.class, requestMonitor); }},
|
|
||||||
new Step() { @Override public void execute(RequestMonitor requestMonitor) { shutdownService(MIMemory.class, requestMonitor); }},
|
|
||||||
new Step() { @Override public void execute(RequestMonitor requestMonitor) { shutdownService(GDBRunControl.class, requestMonitor); }},
|
|
||||||
new Step() { @Override public void execute(RequestMonitor requestMonitor) { shutdownService(GDBControl.class, requestMonitor); }},
|
|
||||||
new Step() { @Override public void execute(RequestMonitor requestMonitor) {
|
|
||||||
fTracker.dispose();
|
|
||||||
fTracker = null;
|
|
||||||
requestMonitor.done();
|
|
||||||
}}
|
|
||||||
};
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private void shutdownService(Class clazz, RequestMonitor requestMonitor) {
|
|
||||||
IDsfService service = fTracker.getService(clazz);
|
|
||||||
if (service != null) {
|
|
||||||
service.shutdown(requestMonitor);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
requestMonitor.setStatus(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, IDsfStatusConstants.INTERNAL_ERROR,
|
|
||||||
"Service '" + clazz.getName() + "' not found.", null)); //$NON-NLS-1$//$NON-NLS-2$
|
|
||||||
requestMonitor.done();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -34,9 +34,13 @@ import org.eclipse.core.runtime.Path;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
import org.eclipse.dd.dsf.concurrent.ThreadSafe;
|
import org.eclipse.dd.dsf.concurrent.ThreadSafe;
|
||||||
import org.eclipse.dd.dsf.debug.model.DsfMemoryBlockRetrieval;
|
import org.eclipse.dd.dsf.debug.model.DsfMemoryBlockRetrieval;
|
||||||
|
import org.eclipse.dd.dsf.debug.service.IMemory.IMemoryDMContext;
|
||||||
import org.eclipse.dd.dsf.service.DsfServicesTracker;
|
import org.eclipse.dd.dsf.service.DsfServicesTracker;
|
||||||
|
import org.eclipse.dd.gdb.launching.FinalLaunchSequence;
|
||||||
import org.eclipse.dd.gdb.launching.GdbLaunch;
|
import org.eclipse.dd.gdb.launching.GdbLaunch;
|
||||||
|
import org.eclipse.dd.gdb.launching.ServicesLaunchSequence;
|
||||||
import org.eclipse.dd.gdb.service.command.GDBControl;
|
import org.eclipse.dd.gdb.service.command.GDBControl;
|
||||||
|
import org.eclipse.dd.gdb.service.command.GDBControl.SessionType;
|
||||||
import org.eclipse.dd.mi.service.command.AbstractCLIProcess;
|
import org.eclipse.dd.mi.service.command.AbstractCLIProcess;
|
||||||
import org.eclipse.dd.mi.service.command.MIInferiorProcess;
|
import org.eclipse.dd.mi.service.command.MIInferiorProcess;
|
||||||
import org.eclipse.debug.core.DebugException;
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
@ -104,15 +108,16 @@ public class TestLaunchDelegate extends AbstractCLaunchDelegate
|
||||||
monitor.worked( 1 );
|
monitor.worked( 1 );
|
||||||
|
|
||||||
// Create and invoke the launch sequence to create the debug control and services
|
// Create and invoke the launch sequence to create the debug control and services
|
||||||
final LaunchSequence launchSequence =
|
// Create and invoke the launch sequence to create the debug control and services
|
||||||
new LaunchSequence(launch.getSession(), launch, exePath);
|
final ServicesLaunchSequence servicesLaunchSequence =
|
||||||
launch.getSession().getExecutor().execute(launchSequence);
|
new ServicesLaunchSequence(launch.getSession(), launch, exePath);
|
||||||
|
launch.getSession().getExecutor().execute(servicesLaunchSequence);
|
||||||
try {
|
try {
|
||||||
launchSequence.get();
|
servicesLaunchSequence.get();
|
||||||
} catch (InterruptedException e1) {
|
} catch (InterruptedException e1) {
|
||||||
throw new DebugException(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, DebugException.INTERNAL_ERROR, "Interrupted Exception in dispatch thread", e1)); //$NON-NLS-1$
|
throw new DebugException(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, DebugException.INTERNAL_ERROR, "Interrupted Exception in dispatch thread", e1)); //$NON-NLS-1$
|
||||||
} catch (ExecutionException e1) {
|
} catch (ExecutionException e1) {
|
||||||
throw new DebugException(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, DebugException.REQUEST_FAILED, "Error in launch sequence", e1.getCause())); //$NON-NLS-1$
|
throw new DebugException(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, DebugException.REQUEST_FAILED, "Error in services launch sequence", e1.getCause())); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
launch.initializeControl();
|
launch.initializeControl();
|
||||||
|
@ -143,6 +148,17 @@ public class TestLaunchDelegate extends AbstractCLaunchDelegate
|
||||||
throw new CoreException(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, 0, "Debugger shut down before launch was completed.", e)); //$NON-NLS-1$
|
throw new CoreException(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, 0, "Debugger shut down before launch was completed.", e)); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create and invoke the final launch sequence to setup GDB
|
||||||
|
final FinalLaunchSequence finalLaunchSequence =
|
||||||
|
new FinalLaunchSequence(launch.getSession().getExecutor(), launch, SessionType.RUN);
|
||||||
|
launch.getSession().getExecutor().execute(finalLaunchSequence);
|
||||||
|
try {
|
||||||
|
finalLaunchSequence.get();
|
||||||
|
} catch (InterruptedException e1) {
|
||||||
|
throw new DebugException(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, DebugException.INTERNAL_ERROR, "Interrupted Exception in dispatch thread", e1)); //$NON-NLS-1$
|
||||||
|
} catch (ExecutionException e1) {
|
||||||
|
throw new DebugException(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, DebugException.REQUEST_FAILED, "Error in final launch sequence", e1.getCause())); //$NON-NLS-1$
|
||||||
|
}
|
||||||
// Create a memory retrieval and register it with session
|
// Create a memory retrieval and register it with session
|
||||||
try {
|
try {
|
||||||
launch.getDsfExecutor().submit( new Callable<Object>() {
|
launch.getDsfExecutor().submit( new Callable<Object>() {
|
||||||
|
@ -151,7 +167,7 @@ public class TestLaunchDelegate extends AbstractCLaunchDelegate
|
||||||
GDBControl gdbControl = tracker.getService(GDBControl.class);
|
GDBControl gdbControl = tracker.getService(GDBControl.class);
|
||||||
if (gdbControl != null) {
|
if (gdbControl != null) {
|
||||||
IMemoryBlockRetrieval memRetrieval = new DsfMemoryBlockRetrieval(
|
IMemoryBlockRetrieval memRetrieval = new DsfMemoryBlockRetrieval(
|
||||||
GDB_DEBUG_MODEL_ID, config, gdbControl.getGDBDMContext());
|
GDB_DEBUG_MODEL_ID, config, (IMemoryDMContext)gdbControl.getControlDMContext());
|
||||||
launch.getSession().registerModelAdapter(IMemoryBlockRetrieval.class, memRetrieval);
|
launch.getSession().registerModelAdapter(IMemoryBlockRetrieval.class, memRetrieval);
|
||||||
((DsfMemoryBlockRetrieval) memRetrieval).initialize();
|
((DsfMemoryBlockRetrieval) memRetrieval).initialize();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue