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

Fix for bug219162

This commit is contained in:
Francois Chouinard 2008-02-22 22:11:24 +00:00
parent 5f9445edbd
commit 8c6342dc6d

View file

@ -28,8 +28,10 @@ import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.cdt.debug.core.model.ICBreakpointExtension; import org.eclipse.cdt.debug.core.model.ICBreakpointExtension;
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint; import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
import org.eclipse.cdt.debug.core.model.ICWatchpoint; import org.eclipse.cdt.debug.core.model.ICWatchpoint;
import org.eclipse.cdt.debug.internal.core.breakpoints.BreakpointProblems;
import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IMarkerDelta; import org.eclipse.core.resources.IMarkerDelta;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -60,7 +62,11 @@ import org.eclipse.dd.dsf.service.AbstractDsfService;
import org.eclipse.dd.dsf.service.DsfServiceEventHandler; import org.eclipse.dd.dsf.service.DsfServiceEventHandler;
import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.dsf.service.DsfSession;
import org.eclipse.dd.mi.internal.MIPlugin; import org.eclipse.dd.mi.internal.MIPlugin;
import org.eclipse.dd.mi.service.MIBreakpoints.BreakpointAddedEvent;
import org.eclipse.dd.mi.service.MIBreakpoints.BreakpointRemovedEvent;
import org.eclipse.dd.mi.service.MIBreakpoints.BreakpointUpdatedEvent;
import org.eclipse.dd.mi.service.MIRunControl.MIExecutionDMC; import org.eclipse.dd.mi.service.MIRunControl.MIExecutionDMC;
import org.eclipse.dd.mi.service.command.events.MIBreakpointHitEvent;
import org.eclipse.dd.mi.service.command.events.MIGDBExitEvent; import org.eclipse.dd.mi.service.command.events.MIGDBExitEvent;
import org.eclipse.dd.mi.service.command.events.MIWatchpointScopeEvent; import org.eclipse.dd.mi.service.command.events.MIWatchpointScopeEvent;
import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.DebugPlugin;
@ -148,6 +154,9 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
private Set<IBreakpoint> fPendingRequests = new HashSet<IBreakpoint>(); private Set<IBreakpoint> fPendingRequests = new HashSet<IBreakpoint>();
private Set<IBreakpoint> fPendingBreakpoints = new HashSet<IBreakpoint>(); private Set<IBreakpoint> fPendingBreakpoints = new HashSet<IBreakpoint>();
private Map<ICBreakpoint, IMarker> fBreakpointMarkerProblems =
new HashMap<ICBreakpoint, IMarker>();
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// String constants // String constants
// FIXME: Extract to some centralized location // FIXME: Extract to some centralized location
@ -334,7 +343,6 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
fBreakpointThreads.put(dmc, new HashMap<ICBreakpoint, Set<String>>()); fBreakpointThreads.put(dmc, new HashMap<ICBreakpoint, Set<String>>());
// Install the platform breakpoints (stored in fPlatformBPs) on the target. // Install the platform breakpoints (stored in fPlatformBPs) on the target.
// FIXME: Why bother with a Job?
new Job("DSF BreakpointsManager: Install initial breakpoints on target") { //$NON-NLS-1$ new Job("DSF BreakpointsManager: Install initial breakpoints on target") { //$NON-NLS-1$
@Override @Override
protected IStatus run(IProgressMonitor monitor) { protected IStatus run(IProgressMonitor monitor) {
@ -526,7 +534,6 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
protected void handleCompleted() { protected void handleCompleted() {
// Store the platform breakpoint // Store the platform breakpoint
platformBPs.put(breakpoint, attributes); platformBPs.put(breakpoint, attributes);
threadsIDs.put(breakpoint, threads);
rm.done(); rm.done();
} }
}; };
@ -537,8 +544,7 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
DataRequestMonitor<IBreakpointDMContext> drm = DataRequestMonitor<IBreakpointDMContext> drm =
new DataRequestMonitor<IBreakpointDMContext>(getExecutor(), installRM) { new DataRequestMonitor<IBreakpointDMContext>(getExecutor(), installRM) {
@Override @Override
protected void handleCompleted() { protected void handleOK() {
if (getStatus().isOK()) {
// Add the new back-end breakpoint to the map // Add the new back-end breakpoint to the map
Vector<IBreakpointDMContext> list = breakpointIDs.get(breakpoint); Vector<IBreakpointDMContext> list = breakpointIDs.get(breakpoint);
if (list == null) if (list == null)
@ -563,7 +569,12 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
breakpoint.incrementInstallCount(); breakpoint.incrementInstallCount();
} catch (CoreException e) { } catch (CoreException e) {
} }
installRM.done();
} }
@Override
protected void handleError() {
AddBreakpointProblemMarker(breakpoint, "Breakpoint attribute problem: installation failed", IMarker.SEVERITY_WARNING); //$NON-NLS-1$
installRM.done(); installRM.done();
} }
}; };
@ -575,6 +586,56 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
} }
} }
private void AddBreakpointProblemMarker(final ICBreakpoint breakpoint, final String description, final int severity) {
new Job("Add Breakpoint Problem Marker") { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
if (breakpoint instanceof ICLineBreakpoint) {
ICLineBreakpoint lineBreakpoint = (ICLineBreakpoint) breakpoint;
try {
// Locate the workspace resource via the breakpoint marker
IMarker breakpoint_marker = lineBreakpoint.getMarker();
IResource resource = breakpoint_marker.getResource();
// Add a problem marker to the resource
IMarker problem_marker = resource.createMarker(BreakpointProblems.BREAKPOINT_PROBLEM_MARKER_ID);
int line_number = lineBreakpoint.getLineNumber();
problem_marker.setAttribute(IMarker.LOCATION, String.valueOf(line_number));
problem_marker.setAttribute(IMarker.MESSAGE, description);
problem_marker.setAttribute(IMarker.SEVERITY, severity);
problem_marker.setAttribute(IMarker.LINE_NUMBER, line_number);
// And save the baby
fBreakpointMarkerProblems.put(breakpoint, problem_marker);
} catch (CoreException e) {
}
}
return Status.OK_STATUS;
}
}.schedule();
}
private void RemoveBreakpointProblemMarker(final ICBreakpoint breakpoint) {
new Job("Remove Breakpoint Problem Marker") { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
IMarker marker = fBreakpointMarkerProblems.remove(breakpoint);
if (marker != null) {
try {
marker.delete();
} catch (CoreException e) {
}
}
return Status.OK_STATUS;
}
}.schedule();
}
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
// uninstallBreakpoint // uninstallBreakpoint
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
@ -604,6 +665,9 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
final Map<ICBreakpoint, Set<String>> threadsIDs = fBreakpointThreads.get(dmc); final Map<ICBreakpoint, Set<String>> threadsIDs = fBreakpointThreads.get(dmc);
assert threadsIDs != null; assert threadsIDs != null;
// Remove breakpoint problem marker (if any)
RemoveBreakpointProblemMarker(breakpoint);
// Minimal validation // Minimal validation
if (!platformBPs.containsKey(breakpoint) || !breakpointIDs.containsKey(breakpoint) || !targetBPs.containsValue(breakpoint)) { if (!platformBPs.containsKey(breakpoint) || !breakpointIDs.containsKey(breakpoint) || !targetBPs.containsValue(breakpoint)) {
rm.setStatus(new Status(IStatus.ERROR, MIPlugin.PLUGIN_ID, INTERNAL_ERROR, BREAKPOINT_ALREADY_REMOVED, null)); rm.setStatus(new Status(IStatus.ERROR, MIPlugin.PLUGIN_ID, INTERNAL_ERROR, BREAKPOINT_ALREADY_REMOVED, null));
@ -1057,8 +1121,6 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
for (IBreakpointsTargetDMContext dmc : fPlatformBPs.keySet()) { for (IBreakpointsTargetDMContext dmc : fPlatformBPs.keySet()) {
if (fPlatformBPs.get(dmc).containsKey(breakpoint)) { if (fPlatformBPs.get(dmc).containsKey(breakpoint)) {
uninstallBreakpoint(dmc, (ICBreakpoint) breakpoint, countingRm); uninstallBreakpoint(dmc, (ICBreakpoint) breakpoint, countingRm);
} else {
// Breakpoint not installed for given context, do nothing.
} }
} }
} }
@ -1072,16 +1134,21 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
// IServiceEventListener // IServiceEventListener
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// /* @DsfServiceEventHandler
// * When a breakpoint is hit, handle associated actions (if any) public void eventDispatched(BreakpointAddedEvent e) {
// */ }
// @DsfServiceEventHandler
// public void eventDispatched(DsfMIBreakpointHitEvent e) { @DsfServiceEventHandler
// IExecutionDMContext context = e.getDMContext(); public void eventDispatched(BreakpointUpdatedEvent e) {
// int breakpointNumber = e.getNumber(); }
//// IBreakpoint breakpoint =
//// fBreakpointActionManager. @DsfServiceEventHandler
// } public void eventDispatched(BreakpointRemovedEvent e) {
}
@DsfServiceEventHandler
public void eventDispatched(MIBreakpointHitEvent e) {
}
/* /*
* When a watchpoint goes out of scope, it is automatically removed from * When a watchpoint goes out of scope, it is automatically removed from
@ -1091,7 +1158,6 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
*/ */
@DsfServiceEventHandler @DsfServiceEventHandler
public void eventDispatched(MIWatchpointScopeEvent e) { public void eventDispatched(MIWatchpointScopeEvent e) {
// fBreakpoints.remove(e.getNumber());
} }
@DsfServiceEventHandler @DsfServiceEventHandler