From 2aed0a778feedb2ae4197e1a48857d1026be62a4 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Mon, 4 Oct 2010 01:59:32 +0000 Subject: [PATCH] Bug 317500: Dissociates the groupId from the pId, since stating with GDB 7.2, the two ids are no longer the same. --- .../cdt/dsf/gdb/service/GDBProcesses.java | 3 +- .../cdt/dsf/gdb/service/GDBProcesses_7_0.java | 68 +++++++++++++------ .../dsf/gdb/service/command/GDBControl.java | 10 ++- .../gdb/service/command/GDBControl_7_0.java | 4 +- .../cdt/dsf/mi/service/IMIProcesses.java | 14 +++- .../cdt/dsf/mi/service/MIProcesses.java | 11 +-- .../mi/service/command/CLIEventProcessor.java | 13 +--- .../command/MIRunControlEventProcessor.java | 23 ++----- .../MIRunControlEventProcessor_7_0.java | 21 ++++-- 9 files changed, 100 insertions(+), 67 deletions(-) diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java index f8273c70a15..4b81a9f6519 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java @@ -92,8 +92,7 @@ public class GDBProcesses extends MIProcesses { new Hashtable()); ICommandControlService commandControl = getServicesTracker().getService(ICommandControlService.class); - IProcessDMContext procDmc = createProcessContext(commandControl.getContext(), MIProcesses.UNIQUE_GROUP_ID); - IContainerDMContext containerDmc = createContainerContext(procDmc, MIProcesses.UNIQUE_GROUP_ID); + IContainerDMContext containerDmc = createContainerContextFromGroupId(commandControl.getContext(), MIProcesses.UNIQUE_GROUP_ID); fGdb.getInferiorProcess().setContainerContext(containerDmc); getSession().addServiceEventListener(this, null); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java index d9c9fbd0497..4e2a0757888 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java @@ -392,6 +392,10 @@ public class GDBProcesses_7_0 extends AbstractDsfService * A map of thread id to thread group id. We use this to find out to which threadGroup a thread belongs. */ private Map fThreadToGroupMap = new HashMap(); + /** + * A map of thread group id to process id. We use this to find out to which pid a group refers. + */ + private Map fGroupToPidMap = new HashMap(); private IGDBControl fCommandControl; private IGDBBackend fBackend; @@ -549,10 +553,20 @@ public class GDBProcesses_7_0 extends AbstractDsfService } } } - IProcessDMContext processDmc = createProcessContext(controlDmc, groupId); - return createContainerContext(processDmc, groupId); + + return createContainerContextFromGroupId(controlDmc, groupId); } + /** @since 4.0 */ + public IMIContainerDMContext createContainerContextFromGroupId(ICommandControlDMContext controlDmc, String groupId) { + String pid = fGroupToPidMap.get(groupId); + if (pid == null) { + pid = groupId; + } + IProcessDMContext processDmc = createProcessContext(controlDmc, pid); + return createContainerContext(processDmc, groupId); + } + public IMIExecutionDMContext[] getExecutionContexts(IMIContainerDMContext containerDmc) { String groupId = containerDmc.getGroupId(); List execDmcList = new ArrayList(); @@ -765,11 +779,10 @@ public class GDBProcesses_7_0 extends AbstractDsfService @Override protected void handleFailure() { // If the target is not available, generate the list ourselves - IMIContainerDMContext[] containerDmcs = new IMIContainerDMContext[fDebuggedProcessesAndNames.size()]; + IMIContainerDMContext[] containerDmcs = new IMIContainerDMContext[fGroupToPidMap.size()]; int i = 0; - for (String groupId : fDebuggedProcessesAndNames.keySet()) { - IProcessDMContext processDmc = createProcessContext(controlDmc, groupId); - containerDmcs[i++] = createContainerContext(processDmc, groupId); + for (String groupId : fGroupToPidMap.keySet()) { + containerDmcs[i++] = createContainerContextFromGroupId(controlDmc, groupId); } rm.setData(containerDmcs); rm.done(); @@ -808,9 +821,7 @@ public class GDBProcesses_7_0 extends AbstractDsfService // code can be removed when GDB 7.2 is released // START OF WORKAROUND if (groups.length == 0 && fBackend.getSessionType() == SessionType.CORE) { - String groupId = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext processDmc = createProcessContext(controlDmc, groupId); - return new IMIContainerDMContext[] {createContainerContext(processDmc, groupId)}; + return new IMIContainerDMContext[] {createContainerContextFromGroupId(controlDmc, MIProcesses.UNIQUE_GROUP_ID)}; } // END OF WORKAROUND to be removed when GDB 7.2 is available @@ -828,8 +839,7 @@ public class GDBProcesses_7_0 extends AbstractDsfService continue; } String groupId = group.getGroupId(); - IProcessDMContext procDmc = createProcessContext(controlDmc, groupId); - containerDmcs.add(createContainerContext(procDmc, groupId)); + containerDmcs.add(createContainerContextFromGroupId(controlDmc, groupId)); } return containerDmcs.toArray(new IMIContainerDMContext[containerDmcs.size()]); } @@ -1049,6 +1059,7 @@ public class GDBProcesses_7_0 extends AbstractDsfService "thread-group-exited".equals(miEvent)) { //$NON-NLS-1$ String groupId = null; + String pId = null; MIResult[] results = exec.getMIResults(); for (int i = 0; i < results.length; i++) { @@ -1058,19 +1069,32 @@ public class GDBProcesses_7_0 extends AbstractDsfService if (val instanceof MIConst) { groupId = ((MIConst) val).getString().trim(); } + } else if (var.equals("pid")) { //$NON-NLS-1$ + // Available starting with GDB 7.2 + if (val instanceof MIConst) { + pId = ((MIConst) val).getString().trim(); + } } } + if (pId == null) { + // Before GDB 7.2, the groupId was the pid of the process + pId = groupId; + } + if (groupId != null) { if ("thread-group-created".equals(miEvent) || "thread-group-started".equals(miEvent)) { //$NON-NLS-1$ //$NON-NLS-2$ - fDebuggedProcessesAndNames.put(groupId, ""); //$NON-NLS-1$ + + fGroupToPidMap.put(groupId, pId); + + fDebuggedProcessesAndNames.put(pId, ""); //$NON-NLS-1$ // GDB is debugging a new process. Let's fetch its // name and remember it. In order to get the name, // we have to request all running processes, not // just the ones being debugged. We got a lot more // information when we request all processes. - final String finalGroupId = groupId; + final String finalPId = pId; fListThreadGroupsAvailableCache.execute( fCommandFactory.createMIListThreadGroups(fCommandControl.getContext(), true), new DataRequestMonitor(getExecutor(), null) { @@ -1081,10 +1105,12 @@ public class GDBProcesses_7_0 extends AbstractDsfService // sending of this command. fListThreadGroupsAvailableCache.reset(); + // Note that the output of the "-list-thread-groups --available" command + // still shows the pid as a groupId, even for GDB 7.2. if (isSuccess()) { for (IThreadGroupInfo groupInfo : getData().getGroupList()) { - if (groupInfo.getPid().equals(finalGroupId)) { - fDebuggedProcessesAndNames.put(finalGroupId, groupInfo.getName()); + if (groupInfo.getPid().equals(finalPId)) { + fDebuggedProcessesAndNames.put(finalPId, groupInfo.getName()); } } } @@ -1097,10 +1123,11 @@ public class GDBProcesses_7_0 extends AbstractDsfService IProcessList list = null; try { list = CCorePlugin.getDefault().getProcessList(); - int groupId_int = Integer.parseInt(finalGroupId); + int pId_int = Integer.parseInt(finalPId); for (IProcessInfo procInfo : list.getProcessList()) { - if (procInfo.getPid() == groupId_int) { - fDebuggedProcessesAndNames.put(finalGroupId, procInfo.getName()); + if (procInfo.getPid() == pId_int) { + fDebuggedProcessesAndNames.put(finalPId, procInfo.getName()); + break; } } } catch (CoreException e) { @@ -1110,8 +1137,11 @@ public class GDBProcesses_7_0 extends AbstractDsfService } }); } else if ("thread-group-exited".equals(miEvent)) { //$NON-NLS-1$ + + fGroupToPidMap.remove(groupId); + // GDB is no longer debugging this process. Remove it from our list. - fDebuggedProcessesAndNames.remove(groupId); + fDebuggedProcessesAndNames.remove(pId); // Remove any entries for that group from our thread to group map // When detaching from a group, we won't have received any thread-exited event diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java index 7eea1d8d106..442b9294bb2 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java @@ -18,8 +18,8 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; -import java.util.Properties; import java.util.Map.Entry; +import java.util.Properties; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -32,7 +32,6 @@ import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.concurrent.Sequence; import org.eclipse.cdt.dsf.datamodel.AbstractDMEvent; -import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.cdt.dsf.debug.service.command.ICommand; import org.eclipse.cdt.dsf.debug.service.command.ICommandControl; @@ -43,10 +42,10 @@ import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch; import org.eclipse.cdt.dsf.gdb.service.IGDBBackend; import org.eclipse.cdt.dsf.gdb.service.SessionType; import org.eclipse.cdt.dsf.mi.service.IMIBackend; +import org.eclipse.cdt.dsf.mi.service.IMIBackend.BackendStateChangedEvent; import org.eclipse.cdt.dsf.mi.service.IMICommandControl; import org.eclipse.cdt.dsf.mi.service.IMIProcesses; import org.eclipse.cdt.dsf.mi.service.MIProcesses; -import org.eclipse.cdt.dsf.mi.service.IMIBackend.BackendStateChangedEvent; import org.eclipse.cdt.dsf.mi.service.MIProcesses.ContainerExitedDMEvent; import org.eclipse.cdt.dsf.mi.service.MIProcesses.ContainerStartedDMEvent; import org.eclipse.cdt.dsf.mi.service.command.AbstractCLIProcess; @@ -55,8 +54,8 @@ import org.eclipse.cdt.dsf.mi.service.command.CLIEventProcessor; import org.eclipse.cdt.dsf.mi.service.command.CommandFactory; import org.eclipse.cdt.dsf.mi.service.command.MIControlDMContext; import org.eclipse.cdt.dsf.mi.service.command.MIInferiorProcess; -import org.eclipse.cdt.dsf.mi.service.command.MIRunControlEventProcessor; import org.eclipse.cdt.dsf.mi.service.command.MIInferiorProcess.State; +import org.eclipse.cdt.dsf.mi.service.command.MIRunControlEventProcessor; import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo; import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo; import org.eclipse.cdt.dsf.service.DsfServiceEventHandler; @@ -319,8 +318,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl { DsfServicesTracker servicesTracker = new DsfServicesTracker(GdbPlugin.getBundleContext(), getSession().getId()); IMIProcesses procService = servicesTracker.getService(IMIProcesses.class); servicesTracker.dispose(); - IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, MIProcesses.UNIQUE_GROUP_ID); - final IContainerDMContext containerDmc = procService.createContainerContext(procDmc, MIProcesses.UNIQUE_GROUP_ID); + final IContainerDMContext containerDmc = procService.createContainerContextFromGroupId(fControlDmc, MIProcesses.UNIQUE_GROUP_ID); final ICommand execCommand; if (useContinueCommand(launch, restart)) { diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java index dd65e6a3c8f..935b3c47ff4 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java @@ -32,7 +32,6 @@ import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.concurrent.Sequence; import org.eclipse.cdt.dsf.datamodel.AbstractDMEvent; -import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.cdt.dsf.debug.service.command.ICommand; import org.eclipse.cdt.dsf.debug.service.command.ICommandControl; @@ -449,8 +448,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl { @Override public void execute(RequestMonitor rm) { IMIProcesses procService = getServicesTracker().getService(IMIProcesses.class); - IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, MIProcesses.UNIQUE_GROUP_ID); - fContainerDmc = procService.createContainerContext(procDmc, MIProcesses.UNIQUE_GROUP_ID); + fContainerDmc = procService.createContainerContextFromGroupId(fControlDmc, MIProcesses.UNIQUE_GROUP_ID); ICommand command; if (useContinueCommand(launch, restart)) { diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/IMIProcesses.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/IMIProcesses.java index 7233cc786ec..c8b575762c2 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/IMIProcesses.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/IMIProcesses.java @@ -57,11 +57,23 @@ public interface IMIProcesses extends IProcesses /** * Create a container context based on a threadId. This implies knowledge - * of which threads belong to which container. + * of which threads belong to which container. This method can only be used + * if the threadId has been already created. * * @param controlDmc The parent command control context of this context * @param threadId The thread id belonging to the container we want to create */ IMIContainerDMContext createContainerContextFromThreadId(ICommandControlDMContext controlDmc, String threadId); + + /** + * Create a container context based on a groupId. This implies knowledge + * of which pid is represented by the groupId. This method can only be used + * if the groupId has been already created. + * + * @param controlDmc The parent command control context of this context + * @param goupId The thread-group id of the container we want to create + * @since 4.0 + */ + IMIContainerDMContext createContainerContextFromGroupId(ICommandControlDMContext controlDmc, String groupId); } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIProcesses.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIProcesses.java index 6264a07c284..c2a253100e3 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIProcesses.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIProcesses.java @@ -413,11 +413,16 @@ public class MIProcesses extends AbstractDsfService implements IMIProcesses, ICa } public IMIContainerDMContext createContainerContextFromThreadId(ICommandControlDMContext controlDmc, String threadId) { - String groupId = UNIQUE_GROUP_ID; + return createContainerContextFromGroupId(controlDmc, UNIQUE_GROUP_ID); + } + + /** @since 4.0 */ + public IMIContainerDMContext createContainerContextFromGroupId(ICommandControlDMContext controlDmc, String groupId) { IProcessDMContext processDmc = createProcessContext(controlDmc, groupId); return createContainerContext(processDmc, groupId); } + public void getExecutionData(IThreadDMContext dmc, final DataRequestMonitor rm) { if (dmc instanceof MIProcessDMC) { rm.setData(new MIThreadDMData("", ((MIProcessDMC)dmc).getProcId())); //$NON-NLS-1$ @@ -568,9 +573,7 @@ public class MIProcesses extends AbstractDsfService implements IMIProcesses, ICa // This service version only handles a single process to debug, therefore, we can simply // create the context describing this process ourselves. ICommandControlDMContext controlDmc = DMContexts.getAncestorOfType(dmc, ICommandControlDMContext.class); - String groupId = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = createProcessContext(controlDmc, groupId); - IMIContainerDMContext newContainerDmc = createContainerContext(procDmc, groupId); + IMIContainerDMContext newContainerDmc = createContainerContextFromGroupId(controlDmc, UNIQUE_GROUP_ID); rm.setData(new IContainerDMContext[] {newContainerDmc}); rm.done(); } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/CLIEventProcessor.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/CLIEventProcessor.java index 14c3bfc8a01..aebdfabd533 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/CLIEventProcessor.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/CLIEventProcessor.java @@ -20,15 +20,14 @@ import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor; import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext; -import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.cdt.dsf.debug.service.ISignals.ISignalsDMContext; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService; +import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext; import org.eclipse.cdt.dsf.debug.service.command.ICommandListener; import org.eclipse.cdt.dsf.debug.service.command.ICommandResult; import org.eclipse.cdt.dsf.debug.service.command.ICommandToken; import org.eclipse.cdt.dsf.debug.service.command.IEventListener; -import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext; import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; import org.eclipse.cdt.dsf.mi.service.IMIProcesses; import org.eclipse.cdt.dsf.mi.service.MIProcesses; @@ -124,10 +123,7 @@ public class CLIEventProcessor IMIProcesses procService = fServicesTracker.getService(IMIProcesses.class); if (procService != null) { - String groupId = MIProcesses.UNIQUE_GROUP_ID; - - IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, groupId); - IContainerDMContext processContainerDmc = procService.createContainerContext(procDmc, groupId); + IContainerDMContext processContainerDmc = procService.createContainerContextFromGroupId(fControlDmc, MIProcesses.UNIQUE_GROUP_ID); MIEvent e = new MIThreadCreatedEvent(processContainerDmc, threadId); fCommandControl.getSession().dispatchEvent(e, fCommandControl.getProperties()); } @@ -167,10 +163,7 @@ public class CLIEventProcessor // if it was a step instruction set state running IMIProcesses procService = fServicesTracker.getService(IMIProcesses.class); if (procService != null) { - String groupId = MIProcesses.UNIQUE_GROUP_ID; - - IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, groupId); - IContainerDMContext processContainerDmc = procService.createContainerContext(procDmc, groupId); + IContainerDMContext processContainerDmc = procService.createContainerContextFromGroupId(fControlDmc, MIProcesses.UNIQUE_GROUP_ID); MIEvent event = new MIRunningEvent(processContainerDmc, token, type); fCommandControl.getSession().dispatchEvent(event, fCommandControl.getProperties()); } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor.java index ddabcd314e8..3e6811e6be7 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor.java @@ -15,6 +15,7 @@ import java.util.LinkedList; import java.util.List; import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor; +import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext; import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl; @@ -192,9 +193,7 @@ public class MIRunControlEventProcessor IMIProcesses procService = fServicesTracker.getService(IMIProcesses.class); if (runControl != null && procService != null) { // We don't know which thread stopped so we simply create a container event. - String groupId = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, groupId); - IContainerDMContext processContainerDmc = procService.createContainerContext(procDmc, groupId); + IContainerDMContext processContainerDmc = procService.createContainerContextFromGroupId(fControlDmc, MIProcesses.UNIQUE_GROUP_ID); if (runControl.isSuspended(processContainerDmc) == false) { // Create an MISignalEvent because that is what the *stopped event should have been @@ -235,13 +234,11 @@ public class MIRunControlEventProcessor return null; } - String groupId = MIProcesses.UNIQUE_GROUP_ID; - - IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, groupId); - IContainerDMContext processContainerDmc = procService.createContainerContext(procDmc, groupId); + IContainerDMContext processContainerDmc = procService.createContainerContextFromGroupId(fControlDmc, MIProcesses.UNIQUE_GROUP_ID); IExecutionDMContext execDmc = processContainerDmc; if (threadId != null) { + IProcessDMContext procDmc = DMContexts.getAncestorOfType(processContainerDmc, IProcessDMContext.class); IThreadDMContext threadDmc = procService.createThreadContext(procDmc, threadId); execDmc = procService.createExecutionContext(processContainerDmc, threadDmc, threadId); } @@ -318,9 +315,7 @@ public class MIRunControlEventProcessor IMIProcesses procService = fServicesTracker.getService(IMIProcesses.class); if (procService != null) { - String groupId = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, groupId); - IContainerDMContext processContainerDmc = procService.createContainerContext(procDmc, groupId); + IContainerDMContext processContainerDmc = procService.createContainerContextFromGroupId(fControlDmc, MIProcesses.UNIQUE_GROUP_ID); fCommandControl.getSession().dispatchEvent( new MIRunningEvent(processContainerDmc, id, type), fCommandControl.getProperties()); @@ -343,9 +338,7 @@ public class MIRunControlEventProcessor if (backendService != null && backendService.getIsAttachSession() == false) { IMIProcesses procService = fServicesTracker.getService(IMIProcesses.class); if (procService != null) { - String groupId = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, groupId); - IContainerDMContext processContainerDmc = procService.createContainerContext(procDmc, groupId); + IContainerDMContext processContainerDmc = procService.createContainerContextFromGroupId(fControlDmc, MIProcesses.UNIQUE_GROUP_ID); fCommandControl.getSession().dispatchEvent( new ContainerStartedDMEvent(processContainerDmc), fCommandControl.getProperties()); @@ -367,9 +360,7 @@ public class MIRunControlEventProcessor IMIProcesses procService = fServicesTracker.getService(IMIProcesses.class); if (runControl != null && procService != null) { // We don't know which thread stopped so we simply create a container event. - String groupId = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, groupId); - IContainerDMContext processContainerDmc = procService.createContainerContext(procDmc, groupId); + IContainerDMContext processContainerDmc = procService.createContainerContextFromGroupId(fControlDmc, MIProcesses.UNIQUE_GROUP_ID); // An attaching operation is debugging a new inferior and always stops it. // We should not check that the container is suspended, because at startup, we are considered diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor_7_0.java index 723f738ee7f..06690d5a1b2 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor_7_0.java @@ -197,8 +197,7 @@ public class MIRunControlEventProcessor_7_0 IMIProcesses procService = fServicesTracker.getService(IMIProcesses.class); if (procService != null) { - IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, groupId); - IContainerDMContext processContainerDmc = procService.createContainerContext(procDmc, groupId); + IContainerDMContext processContainerDmc = procService.createContainerContextFromGroupId(fControlDmc, groupId); MIEvent event = null; if ("thread-created".equals(miEvent)) { //$NON-NLS-1$ @@ -216,6 +215,7 @@ public class MIRunControlEventProcessor_7_0 "thread-group-exited".equals(miEvent)) { //$NON-NLS-1$ String groupId = null; + String pId = null; MIResult[] results = exec.getMIResults(); for (int i = 0; i < results.length; i++) { @@ -225,12 +225,22 @@ public class MIRunControlEventProcessor_7_0 if (val instanceof MIConst) { groupId = ((MIConst) val).getString().trim(); } + } else if (var.equals("pid")) { //$NON-NLS-1$ + // Available starting with GDB 7.2 + if (val instanceof MIConst) { + pId = ((MIConst) val).getString().trim(); + } } } + + if (pId == null) { + // Before GDB 7.2, the groupId was the pid of the process + pId = groupId; + } IMIProcesses procService = fServicesTracker.getService(IMIProcesses.class); - if (groupId != null && procService != null) { - IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, groupId); + if (pId != null && procService != null) { + IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, pId); MIEvent event = null; if ("thread-group-created".equals(miEvent) || "thread-group-started".equals(miEvent)) { //$NON-NLS-1$ //$NON-NLS-2$ @@ -295,8 +305,7 @@ public class MIRunControlEventProcessor_7_0 procDmc = DMContexts.getAncestorOfType(containerDmc, IProcessDMContext.class); } else { // This code would only trigger if the groupId was provided by MI - procDmc = procService.createProcessContext(fControlDmc, groupId); - containerDmc = procService.createContainerContext(procDmc, groupId); + containerDmc = procService.createContainerContextFromGroupId(fControlDmc, groupId); } IExecutionDMContext execDmc = containerDmc;