1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 333284: Thread state is shown incorrectly after attaching to an app in non-stop mode. Use non-interrupting attach when in non-stop to fix this issue, and to improved behavior when attaching.

This commit is contained in:
Marc Khouzam 2011-04-04 01:24:32 +00:00
parent 35255ca2cc
commit 98194b097c
4 changed files with 41 additions and 4 deletions

View file

@ -59,6 +59,7 @@ import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIProcessDMContext; import org.eclipse.cdt.dsf.mi.service.IMIProcessDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIProcesses; import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
import org.eclipse.cdt.dsf.mi.service.IMIRunControl; import org.eclipse.cdt.dsf.mi.service.IMIRunControl;
import org.eclipse.cdt.dsf.mi.service.IMIRunControl.MIRunMode;
import org.eclipse.cdt.dsf.mi.service.MIBreakpointsManager; import org.eclipse.cdt.dsf.mi.service.MIBreakpointsManager;
import org.eclipse.cdt.dsf.mi.service.MIProcesses; import org.eclipse.cdt.dsf.mi.service.MIProcesses;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory; import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
@ -840,8 +841,16 @@ public class GDBProcesses_7_0 extends AbstractDsfService
new Step() { new Step() {
@Override @Override
public void execute(RequestMonitor rm) { public void execute(RequestMonitor 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;
}
fCommandControl.queueCommand( fCommandControl.queueCommand(
fCommandFactory.createMITargetAttach(fContainerDmc, ((IMIProcessDMContext)procCtx).getProcId()), fCommandFactory.createMITargetAttach(fContainerDmc, ((IMIProcessDMContext)procCtx).getProcId(), shouldInterrupt),
new DataRequestMonitor<MIInfo>(getExecutor(), rm)); new DataRequestMonitor<MIInfo>(getExecutor(), rm));
} }
}, },

View file

@ -27,8 +27,10 @@ import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl; import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.IMIContainerDMContext; import org.eclipse.cdt.dsf.mi.service.IMIContainerDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIProcessDMContext; import org.eclipse.cdt.dsf.mi.service.IMIProcessDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIRunControl;
import org.eclipse.cdt.dsf.mi.service.MIBreakpointsManager; import org.eclipse.cdt.dsf.mi.service.MIBreakpointsManager;
import org.eclipse.cdt.dsf.mi.service.MIProcesses; import org.eclipse.cdt.dsf.mi.service.MIProcesses;
import org.eclipse.cdt.dsf.mi.service.IMIRunControl.MIRunMode;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory; import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.MIAddInferiorInfo; import org.eclipse.cdt.dsf.mi.service.command.output.MIAddInferiorInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo; import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
@ -179,8 +181,16 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 {
new Step() { new Step() {
@Override @Override
public void execute(RequestMonitor rm) { public void execute(RequestMonitor rm) {
fCommandControl.queueCommand( // For non-stop mode, we do a non-interrupting attach
fCommandFactory.createMITargetAttach(fContainerDmc, ((IMIProcessDMContext)procCtx).getProcId()), // Bug 333284
boolean shouldInterrupt = true;
IMIRunControl runControl = getServicesTracker().getService(IMIRunControl.class);
if (runControl != null && runControl.getRunMode() == MIRunMode.NON_STOP) {
shouldInterrupt = false;
}
fCommandControl.queueCommand(
fCommandFactory.createMITargetAttach(fContainerDmc, ((IMIProcessDMContext)procCtx).getProcId(), shouldInterrupt),
new DataRequestMonitor<MIInfo>(ImmediateExecutor.getInstance(), rm)); new DataRequestMonitor<MIInfo>(ImmediateExecutor.getInstance(), rm));
} }
}, },

View file

@ -715,6 +715,11 @@ public class CommandFactory {
return new MITargetAttach(ctx, groupId); return new MITargetAttach(ctx, groupId);
} }
/** @since 4.0 */
public ICommand<MIInfo> createMITargetAttach(IMIContainerDMContext ctx, String groupId, boolean interrupt) {
return new MITargetAttach(ctx, groupId, interrupt);
}
public ICommand<MIInfo> createMITargetDetach(ICommandControlDMContext ctx, String groupId) { public ICommand<MIInfo> createMITargetDetach(ICommandControlDMContext ctx, String groupId) {
return new MITargetDetach(ctx, groupId); return new MITargetDetach(ctx, groupId);
} }

View file

@ -43,6 +43,19 @@ public class MITargetAttach extends MICommand<MIInfo> {
* @since 4.0 * @since 4.0
*/ */
public MITargetAttach(IMIContainerDMContext ctx, String pid) { public MITargetAttach(IMIContainerDMContext ctx, String pid) {
super(ctx, "-target-attach", new String[] { pid }); //$NON-NLS-1$ this(ctx, pid, true);
}
/**
* @param ctx indicates which inferior should be used when doing the attach
* @param id the pid of the process to attach to
* @param interrupt indicates if the process should be interrupted once the attach is done
* Leaving the process running is only support with target-async on, which
* we currently only use in non-stop mode
*
* @since 4.0
*/
public MITargetAttach(IMIContainerDMContext ctx, String pid, boolean interrupt) {
super(ctx, "-target-attach", new String[] { pid, interrupt ? "" : "&" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} }
} }