diff --git a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IProcesses.java b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IProcesses.java index d6310abe54d..1ba171b34fd 100644 --- a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IProcesses.java +++ b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IProcesses.java @@ -17,6 +17,7 @@ import org.eclipse.dd.dsf.datamodel.IDMContext; import org.eclipse.dd.dsf.datamodel.IDMData; import org.eclipse.dd.dsf.datamodel.IDMEvent; import org.eclipse.dd.dsf.datamodel.IDMService; +import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext; /** * This interface provides access to the OS's process @@ -68,14 +69,20 @@ public interface IProcesses extends IDMService { /** * Retrieves the current list of processes running on target. + * @param containerDmc The processor or core for which to list all processes * @param rm Request completion monitor, to be filled in with array of process contexts. */ - void getRunningProcesses(DataRequestMonitor rm); + void getRunningProcesses(IContainerDMContext containerDmc, DataRequestMonitor rm); /** - * Attaches debugger to the given process. - */ - void attachDebuggerToProcess(IProcessDMContext procCtx, RequestMonitor requestMonitor); + * Attaches debugger to the given process. + * When attaching to a process, a container context can now be used to characterize the process. + * IContainerDMContext has IProcessDMContext as a parent. This method can optionally choose + * to return the IContainerDMContext inside the DataRequestMonitor. This can be useful for + * backends that do not have the ability to obtain the different IContainerDMContexts through + * {@link getProcessesBeingDebugged} + */ + void attachDebuggerToProcess(IProcessDMContext procCtx, DataRequestMonitor rm); /** * Detaches debugger from the given process. @@ -99,9 +106,12 @@ public interface IProcesses extends IDMService { /** * Retrieves the list of processes which are currently under * debugger control. - * @param rm Request completion monitor. + * @param containerDmc The processor or core for which to list processes being debugged + * @param rm Request completion monitor which contains all container contexts representing + * the processes being debugged. Note that each of these containers also has + * IProcessDMContext as a parent. */ - void getProcessesBeingDebugged(DataRequestMonitor rm); + void getProcessesBeingDebugged(IContainerDMContext containerDmc, DataRequestMonitor rm); /** * Checks whether the given process or thread can be terminated. diff --git a/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/FinalLaunchSequence.java b/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/FinalLaunchSequence.java index d547931fab7..f86fdbcb498 100644 --- a/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/FinalLaunchSequence.java +++ b/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/FinalLaunchSequence.java @@ -38,6 +38,7 @@ import org.eclipse.dd.dsf.concurrent.DsfExecutor; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.concurrent.Sequence; import org.eclipse.dd.dsf.debug.service.IProcesses.IProcessDMContext; +import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.dd.dsf.service.DsfServicesTracker; import org.eclipse.dd.gdb.internal.GdbPlugin; import org.eclipse.dd.gdb.internal.provisional.IGDBLaunchConfigurationConstants; @@ -444,18 +445,18 @@ public class FinalLaunchSequence extends Sequence { fProcService.attachDebuggerToProcess( procDmc, - new DataRequestMonitor(getExecutor(), requestMonitor)); + new DataRequestMonitor(getExecutor(), requestMonitor)); } else { - promptForProcessID(fLaunch.getLaunchConfiguration(), + promptForProcessID(fLaunch.getLaunchConfiguration(), new DataRequestMonitor(getExecutor(), requestMonitor) { @Override protected void handleSuccess() { - IProcessDMContext procDmc = + IProcessDMContext procDmc = fProcService.createProcessContext(Integer.toString(getData())); fProcService.attachDebuggerToProcess( procDmc, - new DataRequestMonitor(getExecutor(), requestMonitor)); + new DataRequestMonitor(getExecutor(), requestMonitor)); } }); } diff --git a/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/service/GDBProcesses.java b/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/service/GDBProcesses.java index d24817e6ab6..3eefc45f87a 100644 --- a/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/service/GDBProcesses.java +++ b/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/service/GDBProcesses.java @@ -21,6 +21,7 @@ import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.datamodel.AbstractDMContext; import org.eclipse.dd.dsf.datamodel.IDMContext; import org.eclipse.dd.dsf.debug.service.IProcesses; +import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.dd.dsf.service.AbstractDsfService; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.gdb.internal.GdbPlugin; @@ -87,7 +88,6 @@ public class GDBProcesses extends AbstractDsfService implements IProcesses { *

* * @param sessionId Session that this context belongs to. - * @param name process name * @param id process identifier. */ protected GdbProcessDMC(String sessionId, String id) { @@ -235,7 +235,8 @@ public class GDBProcesses extends AbstractDsfService implements IProcesses { public void getExecutionData(IThreadDMContext dmc, DataRequestMonitor rm) { // We must first check for GdbProcessDMC because it is also a GdbThreadDMC if (dmc instanceof GdbProcessDMC) { - rm.setData(new GdbThreadDMData("", ((GdbProcessDMC)dmc).getId())); //$NON-NLS-1$ + rm.setData(new GdbThreadDMData(fCommandControl.getExecutablePath().lastSegment(), + ((GdbProcessDMC)dmc).getId())); rm.done(); } else if (dmc instanceof GdbThreadDMC) { rm.setData(new GdbThreadDMData("", ((GdbThreadDMC)dmc).getId())); //$NON-NLS-1$ @@ -246,7 +247,7 @@ public class GDBProcesses extends AbstractDsfService implements IProcesses { } } - public void attachDebuggerToProcess(IProcessDMContext procCtx, final RequestMonitor rm) { + public void attachDebuggerToProcess(IProcessDMContext procCtx, final DataRequestMonitor rm) { if (procCtx instanceof GdbProcessDMC) { int pid; try { @@ -259,7 +260,14 @@ public class GDBProcesses extends AbstractDsfService implements IProcesses { fCommandControl.queueCommand( new CLIAttach(procCtx, pid), - new DataRequestMonitor(getExecutor(), rm)); + new DataRequestMonitor(getExecutor(), rm) { + @Override + protected void handleSuccess() { + rm.setData(null); + rm.done(); + } + }); + } else { rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INTERNAL_ERROR, "Invalid process context.", null)); //$NON-NLS-1$ rm.done(); @@ -299,20 +307,20 @@ public class GDBProcesses extends AbstractDsfService implements IProcesses { NOT_SUPPORTED, "Not supported", null)); //$NON-NLS-1$ rm.done(); } - - public void getProcessesBeingDebugged(DataRequestMonitor rm) { + + public void getProcessesBeingDebugged(IContainerDMContext containerDmc, DataRequestMonitor rm) { // use -list-thread-groups rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED, "Not supported", null)); //$NON-NLS-1$ rm.done(); } - public void getRunningProcesses(DataRequestMonitor rm) { + public void getRunningProcesses(IContainerDMContext containerDmc, DataRequestMonitor rm) { // use -list-thread-groups for local session // monitor list processes is only for remote session fCommandControl.queueCommand( - new CLIMonitorListProcesses(fCommandControl.getControlDMContext()), + new CLIMonitorListProcesses(containerDmc), new DataRequestMonitor(getExecutor(), rm) { @Override protected void handleSuccess() {