mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-21 21:52:10 +02:00
Bug 580259: Not all remote session have a connected process
Contributed by STMicroelectronics Change-Id: Idec88f4bf0cbc8326bf19b9f081af9f9f9d437e2 Signed-off-by: Torbjörn Svensson <torbjorn.svensson@st.com>
This commit is contained in:
parent
2481f398e0
commit
96839a029d
2 changed files with 62 additions and 62 deletions
|
@ -660,13 +660,18 @@ public class FinalLaunchSequence extends ReflectionSequence {
|
||||||
@Execute
|
@Execute
|
||||||
public void stepAttachRemoteToDebugger(final RequestMonitor requestMonitor) {
|
public void stepAttachRemoteToDebugger(final RequestMonitor requestMonitor) {
|
||||||
if (fGDBBackend.getIsAttachSession() && fGDBBackend.getSessionType() == SessionType.REMOTE) {
|
if (fGDBBackend.getIsAttachSession() && fGDBBackend.getSessionType() == SessionType.REMOTE) {
|
||||||
IProcessDMContext processContext = fProcService.createProcessContext(fCommandControl.getContext(),
|
DataRequestMonitor<Boolean> rm = new DataRequestMonitor<>(getExecutor(), null);
|
||||||
MIProcesses.UNKNOWN_PROCESS_ID);
|
fProcService.canDetachDebuggerFromProcess(null, rm);
|
||||||
fProcService.attachDebuggerToProcess(processContext,
|
|
||||||
new DataRequestMonitor<IDMContext>(getExecutor(), requestMonitor));
|
if (rm.getData()) {
|
||||||
} else {
|
IProcessDMContext processContext = fProcService.createProcessContext(fCommandControl.getContext(),
|
||||||
requestMonitor.done();
|
MIProcesses.UNKNOWN_PROCESS_ID);
|
||||||
|
fProcService.attachDebuggerToProcess(processContext,
|
||||||
|
new DataRequestMonitor<IDMContext>(getExecutor(), requestMonitor));
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
requestMonitor.done();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -285,19 +285,13 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 implements IMultiTerminat
|
||||||
// NOTE: when we support multi-process in all-stop mode,
|
// NOTE: when we support multi-process in all-stop mode,
|
||||||
// we will need to interrupt the target to when doing the attach.
|
// we will need to interrupt the target to when doing the attach.
|
||||||
int numConnected = getNumConnected();
|
int numConnected = getNumConnected();
|
||||||
switch (sessionType) {
|
|
||||||
case REMOTE:
|
|
||||||
// In remote session already one process is connected
|
|
||||||
// Bug 528145
|
|
||||||
return numConnected == 1;
|
|
||||||
case LOCAL:
|
|
||||||
return numConnected == 0;
|
|
||||||
|
|
||||||
default:
|
if (numConnected == 1 && sessionType == SessionType.REMOTE) {
|
||||||
break;
|
// Bug 528145: Special case for remote sessions with an existing connection.
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return numConnected == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -333,38 +327,38 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 implements IMultiTerminat
|
||||||
public void execute(final RequestMonitor rm) {
|
public void execute(final RequestMonitor rm) {
|
||||||
// The remote session is already connected to the process
|
// The remote session is already connected to the process
|
||||||
// Bug 528145
|
// Bug 528145
|
||||||
if (fBackend.getSessionType() == SessionType.REMOTE) {
|
if (fBackend.getSessionType() == SessionType.REMOTE
|
||||||
|
&& doCanDetachDebuggerFromProcess()) {
|
||||||
rm.done();
|
rm.done();
|
||||||
} else {
|
return;
|
||||||
getProcessesBeingDebugged(procCtx,
|
|
||||||
new ImmediateDataRequestMonitor<IDMContext[]>(rm) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
assert getData() != null;
|
|
||||||
|
|
||||||
boolean found = false;
|
|
||||||
for (IDMContext dmc : getData()) {
|
|
||||||
IProcessDMContext procDmc = DMContexts.getAncestorOfType(dmc,
|
|
||||||
IProcessDMContext.class);
|
|
||||||
if (procCtx.equals(procDmc)) {
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (found) {
|
|
||||||
// abort the sequence
|
|
||||||
Status failedStatus = new Status(IStatus.ERROR,
|
|
||||||
GdbPlugin.PLUGIN_ID, REQUEST_FAILED,
|
|
||||||
MessageFormat.format(
|
|
||||||
Messages.Already_connected_process_err,
|
|
||||||
((IMIProcessDMContext) procCtx).getProcId()),
|
|
||||||
null);
|
|
||||||
rm.done(failedStatus);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
super.handleSuccess();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getProcessesBeingDebugged(procCtx, new ImmediateDataRequestMonitor<IDMContext[]>(rm) {
|
||||||
|
@Override
|
||||||
|
protected void handleSuccess() {
|
||||||
|
assert getData() != null;
|
||||||
|
|
||||||
|
boolean found = false;
|
||||||
|
for (IDMContext dmc : getData()) {
|
||||||
|
IProcessDMContext procDmc = DMContexts.getAncestorOfType(dmc,
|
||||||
|
IProcessDMContext.class);
|
||||||
|
if (procCtx.equals(procDmc)) {
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
// abort the sequence
|
||||||
|
Status failedStatus = new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID,
|
||||||
|
REQUEST_FAILED,
|
||||||
|
MessageFormat.format(Messages.Already_connected_process_err,
|
||||||
|
((IMIProcessDMContext) procCtx).getProcId()),
|
||||||
|
null);
|
||||||
|
rm.done(failedStatus);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
super.handleSuccess();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -477,24 +471,25 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 implements IMultiTerminat
|
||||||
public void execute(RequestMonitor rm) {
|
public void execute(RequestMonitor rm) {
|
||||||
// This call end the current attach to the gdbserver in remote session
|
// This call end the current attach to the gdbserver in remote session
|
||||||
// Bug 528145
|
// Bug 528145
|
||||||
if (fBackend.getSessionType() == SessionType.REMOTE) {
|
if (fBackend.getSessionType() == SessionType.REMOTE
|
||||||
|
&& doCanDetachDebuggerFromProcess()) {
|
||||||
rm.done();
|
rm.done();
|
||||||
} else {
|
return;
|
||||||
// For non-stop mode, we do a non-interrupting attach
|
|
||||||
// Bug 333284
|
|
||||||
boolean shouldInterrupt = true;
|
|
||||||
IMIRunControl runControl = getServicesTracker().getService(IMIRunControl.class);
|
|
||||||
if (runControl != null && runControl.getRunMode() == MIRunMode.NON_STOP) {
|
|
||||||
shouldInterrupt = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean extraNewline = targetAttachRequiresTrailingNewline();
|
|
||||||
ICommand<MIInfo> miTargetAttach = fCommandFactory.createMITargetAttach(
|
|
||||||
fContainerDmc, ((IMIProcessDMContext) procCtx).getProcId(), shouldInterrupt,
|
|
||||||
extraNewline);
|
|
||||||
fCommandControl.queueCommand(miTargetAttach,
|
|
||||||
new ImmediateDataRequestMonitor<MIInfo>(rm));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For non-stop mode, we do a non-interrupting attach
|
||||||
|
// Bug 333284
|
||||||
|
boolean shouldInterrupt = true;
|
||||||
|
IMIRunControl runControl = getServicesTracker().getService(IMIRunControl.class);
|
||||||
|
if (runControl != null && runControl.getRunMode() == MIRunMode.NON_STOP) {
|
||||||
|
shouldInterrupt = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean extraNewline = targetAttachRequiresTrailingNewline();
|
||||||
|
ICommand<MIInfo> miTargetAttach = fCommandFactory.createMITargetAttach(fContainerDmc,
|
||||||
|
((IMIProcessDMContext) procCtx).getProcId(), shouldInterrupt, extraNewline);
|
||||||
|
fCommandControl.queueCommand(miTargetAttach,
|
||||||
|
new ImmediateDataRequestMonitor<MIInfo>(rm));
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
Loading…
Add table
Reference in a new issue