mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-08 18:26:01 +02:00
[303004] Allow to extend MIBreakpoints instead of copying it. Use inheritance for GDBBreakpoints_7_0 now that we can.
This commit is contained in:
parent
5eec05f77f
commit
72be877f9b
3 changed files with 140 additions and 786 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2009, 2010 Ericsson and others.
|
* Copyright (c) 2010 Ericsson and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -16,10 +16,7 @@ import java.util.Map;
|
||||||
|
|
||||||
import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.Immutable;
|
|
||||||
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.datamodel.AbstractDMContext;
|
|
||||||
import org.eclipse.cdt.dsf.datamodel.AbstractDMEvent;
|
|
||||||
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
||||||
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IBreakpoints;
|
import org.eclipse.cdt.dsf.debug.service.IBreakpoints;
|
||||||
|
@ -29,149 +26,27 @@ import org.eclipse.cdt.dsf.mi.service.MIBreakpointDMData;
|
||||||
import org.eclipse.cdt.dsf.mi.service.MIBreakpoints;
|
import org.eclipse.cdt.dsf.mi.service.MIBreakpoints;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIPasscount;
|
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIPasscount;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.CLITrace;
|
import org.eclipse.cdt.dsf.mi.service.command.commands.CLITrace;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakAfter;
|
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakCondition;
|
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakDelete;
|
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakDisable;
|
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakEnable;
|
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakInsert;
|
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakInsert;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakList;
|
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakList;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakWatch;
|
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.CLITraceInfo;
|
import org.eclipse.cdt.dsf.mi.service.command.output.CLITraceInfo;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo;
|
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakListInfo;
|
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakListInfo;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakpoint;
|
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakpoint;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
||||||
import org.eclipse.cdt.dsf.service.AbstractDsfService;
|
|
||||||
import org.eclipse.cdt.dsf.service.DsfSession;
|
import org.eclipse.cdt.dsf.service.DsfSession;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
import org.osgi.framework.BundleContext;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initial breakpoint service implementation.
|
* Breakpoint service for GDB 7.0.
|
||||||
* Implements the IBreakpoints interface.
|
* It also supports tracepoints
|
||||||
|
|
||||||
* @since 3.0
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoints
|
public class GDBBreakpoints_7_0 extends MIBreakpoints
|
||||||
{
|
{
|
||||||
// Services
|
private ICommandControl fConnection;
|
||||||
ICommandControl fConnection;
|
|
||||||
|
|
||||||
// Service breakpoints tracking
|
|
||||||
// The breakpoints are stored per context and keyed on the back-end breakpoint reference
|
|
||||||
private Map<IBreakpointsTargetDMContext, Map<Integer, MIBreakpointDMData>> fBreakpoints =
|
|
||||||
new HashMap<IBreakpointsTargetDMContext, Map<Integer, MIBreakpointDMData>>();
|
|
||||||
|
|
||||||
// Error messages
|
|
||||||
final String NULL_STRING = ""; //$NON-NLS-1$
|
|
||||||
final String UNKNOWN_EXECUTION_CONTEXT = "Unknown execution context"; //$NON-NLS-1$
|
|
||||||
final String UNKNOWN_BREAKPOINT_CONTEXT = "Unknown breakpoint context"; //$NON-NLS-1$
|
|
||||||
final String UNKNOWN_BREAKPOINT_TYPE = "Unknown breakpoint type"; //$NON-NLS-1$
|
|
||||||
final String UNKNOWN_BREAKPOINT = "Unknown breakpoint"; //$NON-NLS-1$
|
|
||||||
final String BREAKPOINT_INSERTION_FAILURE = "Breakpoint insertion failure"; //$NON-NLS-1$
|
|
||||||
final String WATCHPOINT_INSERTION_FAILURE = "Watchpoint insertion failure"; //$NON-NLS-1$
|
|
||||||
final String TRACEPOINT_INSERTION_FAILURE = "Tracepoint insertion failure"; //$NON-NLS-1$
|
|
||||||
final String INVALID_CONDITION = "Invalid condition"; //$NON-NLS-1$
|
|
||||||
final String INVALID_BREAKPOINT_TYPE = "Invalid breakpoint type"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
// Breakpoint Events
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
static private class BreakpointsChangedEvent extends AbstractDMEvent<IBreakpointsTargetDMContext> implements IBreakpointsChangedEvent {
|
|
||||||
private IBreakpointDMContext[] fEventBreakpoints;
|
|
||||||
|
|
||||||
public BreakpointsChangedEvent(IBreakpointDMContext bp) {
|
|
||||||
super(DMContexts.getAncestorOfType(bp, IBreakpointsTargetDMContext.class));
|
|
||||||
fEventBreakpoints = new IBreakpointDMContext[] { bp };
|
|
||||||
}
|
|
||||||
public IBreakpointDMContext[] getBreakpoints() {
|
|
||||||
return fEventBreakpoints;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static private class BreakpointAddedEvent extends BreakpointsChangedEvent implements IBreakpointsAddedEvent {
|
|
||||||
public BreakpointAddedEvent(IBreakpointDMContext context) {
|
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static private class BreakpointUpdatedEvent extends BreakpointsChangedEvent implements IBreakpointsUpdatedEvent {
|
|
||||||
public BreakpointUpdatedEvent(IBreakpointDMContext context) {
|
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static private class BreakpointRemovedEvent extends BreakpointsChangedEvent implements IBreakpointsRemovedEvent {
|
|
||||||
public BreakpointRemovedEvent(IBreakpointDMContext context) {
|
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
// IBreakpointDMContext
|
|
||||||
// Used to hold the back-end breakpoint references. The reference can then
|
|
||||||
// be used to get the actual DsfMIBreakpoint.
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
@Immutable
|
|
||||||
private static final class MIBreakpointDMContext extends AbstractDMContext implements IBreakpointDMContext {
|
|
||||||
|
|
||||||
// The breakpoint reference
|
|
||||||
private final int fReference;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param session the DsfSession for this service
|
|
||||||
* @param parents the parent contexts
|
|
||||||
* @param reference the DsfMIBreakpoint reference
|
|
||||||
*/
|
|
||||||
public MIBreakpointDMContext(DsfSession session, IDMContext[] parents, int reference) {
|
|
||||||
super(session.getId(), parents);
|
|
||||||
fReference = reference;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.dsf.debug.service.IBreakpoints.IDsfBreakpointDMContext#getReference()
|
|
||||||
*/
|
|
||||||
public int getReference() {
|
|
||||||
return fReference;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.dsf.datamodel.AbstractDMContext#equals(java.lang.Object)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
return baseEquals(obj) && (fReference == ((MIBreakpointDMContext) obj).fReference);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.dsf.datamodel.AbstractDMContext#hashCode()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return baseHashCode() + fReference;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see java.lang.Object#toString()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return baseToString() + ".reference(" + fReference + ")"; //$NON-NLS-1$//$NON-NLS-2$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
// AbstractDsfService
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The service constructor
|
|
||||||
*
|
|
||||||
* @param session The debugging session
|
|
||||||
*/
|
|
||||||
public GDBBreakpoints_7_0(DsfSession session) {
|
public GDBBreakpoints_7_0(DsfSession session) {
|
||||||
super(session);
|
super(session);
|
||||||
}
|
}
|
||||||
|
@ -189,231 +64,40 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Asynchronous service initialization
|
|
||||||
*/
|
|
||||||
private void doInitialize(final RequestMonitor rm) {
|
private void doInitialize(final RequestMonitor rm) {
|
||||||
|
|
||||||
// Get the services references
|
// Get the services references
|
||||||
fConnection = getServicesTracker().getService(ICommandControl.class);
|
fConnection = getServicesTracker().getService(ICommandControl.class);
|
||||||
|
|
||||||
// Register this service
|
// Register this service
|
||||||
register(new String[] { IBreakpoints.class.getName(),
|
register(new String[] { IBreakpoints.class.getName(),
|
||||||
|
MIBreakpoints.class.getName(),
|
||||||
GDBBreakpoints_7_0.class.getName() },
|
GDBBreakpoints_7_0.class.getName() },
|
||||||
new Hashtable<String, String>());
|
new Hashtable<String, String>());
|
||||||
|
|
||||||
rm.done();
|
rm.done();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.dsf.service.AbstractDsfService#shutdown(org.eclipse.cdt.dsf.concurrent.RequestMonitor)
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void shutdown(final RequestMonitor rm) {
|
public void shutdown(RequestMonitor requestMonitor) {
|
||||||
unregister();
|
unregister();
|
||||||
rm.done();
|
super.shutdown(requestMonitor);
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.dsf.service.AbstractDsfService#getBundleContext()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected BundleContext getBundleContext() {
|
|
||||||
return GdbPlugin.getBundleContext();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.dsf.debug.service.IBreakpoints#getBreakpoints(org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext, org.eclipse.cdt.dsf.concurrent.DataRequestMonitor)
|
|
||||||
*/
|
|
||||||
public void getBreakpoints(final IBreakpointsTargetDMContext context, final DataRequestMonitor<IBreakpointDMContext[]> drm)
|
|
||||||
{
|
|
||||||
// Validate the context
|
|
||||||
if (context == null) {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_EXECUTION_CONTEXT, null));
|
|
||||||
drm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select the breakpoints context map
|
|
||||||
// If it doesn't exist then no breakpoint was ever inserted for this breakpoint space.
|
|
||||||
// In that case, return an empty list.
|
|
||||||
final Map<Integer, MIBreakpointDMData> breakpointContext = fBreakpoints.get(context);
|
|
||||||
if (breakpointContext == null) {
|
|
||||||
drm.setData(new IBreakpointDMContext[0]);
|
|
||||||
drm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Execute the command
|
|
||||||
fConnection.queueCommand(new MIBreakList(context),
|
|
||||||
new DataRequestMonitor<MIBreakListInfo>(getExecutor(), drm) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
// Refresh the breakpoints map and format the result
|
|
||||||
breakpointContext.clear();
|
|
||||||
MIBreakpoint[] breakpoints = getData().getMIBreakpoints();
|
|
||||||
IBreakpointDMContext[] result = new IBreakpointDMContext[breakpoints.length];
|
|
||||||
for (int i = 0; i < breakpoints.length; i++) {
|
|
||||||
MIBreakpointDMData breakpoint = new MIBreakpointDMData(breakpoints[i]);
|
|
||||||
int reference = breakpoint.getReference();
|
|
||||||
result[i] = new MIBreakpointDMContext(getSession(), new IDMContext[] { context }, reference);
|
|
||||||
breakpointContext.put(reference, breakpoint);
|
|
||||||
}
|
|
||||||
drm.setData(result);
|
|
||||||
drm.done();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.dsf.debug.service.IBreakpoints#getBreakpointDMData(org.eclipse.cdt.dsf.debug.service.IBreakpoints.IDsfBreakpointDMContext, org.eclipse.cdt.dsf.concurrent.DataRequestMonitor)
|
|
||||||
*/
|
|
||||||
public void getBreakpointDMData(IBreakpointDMContext dmc, DataRequestMonitor<IBreakpointDMData> drm)
|
|
||||||
{
|
|
||||||
// Validate the breakpoint context
|
|
||||||
if (dmc == null) {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
|
||||||
drm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the breakpoint type
|
|
||||||
MIBreakpointDMContext breakpoint;
|
|
||||||
if (dmc instanceof MIBreakpointDMContext) {
|
|
||||||
breakpoint = (MIBreakpointDMContext) dmc;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_TYPE, null));
|
|
||||||
drm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the target context
|
|
||||||
IBreakpointsTargetDMContext context = DMContexts.getAncestorOfType(breakpoint, IBreakpointsTargetDMContext.class);
|
|
||||||
if (context == null) {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_EXECUTION_CONTEXT, null));
|
|
||||||
drm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select the breakpoints context map
|
|
||||||
Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
|
||||||
if (contextBreakpoints == null) {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
|
||||||
drm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No need to go to the back-end for this one
|
|
||||||
IBreakpointDMData breakpointCopy = new MIBreakpointDMData(contextBreakpoints.get(breakpoint.getReference()));
|
|
||||||
drm.setData(breakpointCopy);
|
|
||||||
drm.done();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.dsf.debug.service.IBreakpoints#insertBreakpoint(org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext, java.util.Map, org.eclipse.cdt.dsf.concurrent.DataRequestMonitor)
|
|
||||||
*/
|
|
||||||
public void insertBreakpoint(IBreakpointsTargetDMContext context, Map<String, Object> attributes, DataRequestMonitor<IBreakpointDMContext> drm) {
|
|
||||||
|
|
||||||
// Validate the context
|
|
||||||
if (context == null) {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_EXECUTION_CONTEXT, null));
|
|
||||||
drm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select the breakpoints context map. If it doesn't exist, create it.
|
|
||||||
Map<Integer, MIBreakpointDMData> breakpointContext = fBreakpoints.get(context);
|
|
||||||
if (breakpointContext == null) {
|
|
||||||
breakpointContext = new HashMap<Integer, MIBreakpointDMData>();
|
|
||||||
fBreakpoints.put(context, breakpointContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the breakpoint type
|
|
||||||
String type = (String) attributes.get(MIBreakpoints.BREAKPOINT_TYPE);
|
|
||||||
if (type == null) {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_TYPE, null));
|
|
||||||
drm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// And go...
|
|
||||||
if (type.equals(MIBreakpoints.BREAKPOINT)) {
|
|
||||||
addBreakpoint(context, attributes, drm);
|
|
||||||
}
|
|
||||||
else if (type.equals(MIBreakpoints.WATCHPOINT)) {
|
|
||||||
addWatchpoint(context, attributes, drm);
|
|
||||||
}
|
|
||||||
else if (type.equals(MIBreakpoints.TRACEPOINT)) {
|
|
||||||
addTracepoint(context, attributes, drm);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_TYPE, null));
|
|
||||||
drm.done();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param map
|
* Add a breakpoint of type BREAKPOINT.
|
||||||
* @param key
|
* With GDB 7.0, we can create a breakpoint that is disabled. This avoids having to disable it as
|
||||||
* @param defaultValue
|
* a separate command. It is also much better because in non-stop, we don't risk habing a thread
|
||||||
* @return
|
* hitting the breakpoint between creation and disablement.
|
||||||
*/
|
|
||||||
public Object getProperty(Map<String, Object> map, String key, Object defaultValue) {
|
|
||||||
Object value = map.get(key);
|
|
||||||
return (value != null) ? value : defaultValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param attributes
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private String formatLocation(Map<String, Object> attributes) {
|
|
||||||
|
|
||||||
// Unlikely default location
|
|
||||||
String location = (String) getProperty(attributes, MIBreakpoints.ADDRESS, NULL_STRING);
|
|
||||||
|
|
||||||
// Get the relevant parameters
|
|
||||||
String fileName = (String) getProperty(attributes, MIBreakpoints.FILE_NAME, NULL_STRING);
|
|
||||||
Integer lineNumber = (Integer) getProperty(attributes, MIBreakpoints.LINE_NUMBER, -1);
|
|
||||||
String function = (String) getProperty(attributes, MIBreakpoints.FUNCTION, NULL_STRING);
|
|
||||||
|
|
||||||
// Fix for Bug264721
|
|
||||||
if (fileName.contains(" ")) { //$NON-NLS-1$
|
|
||||||
fileName = "\"" + fileName + "\""; //$NON-NLS-1$//$NON-NLS-2$
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fileName.equals(NULL_STRING)) {
|
|
||||||
if (lineNumber != -1) {
|
|
||||||
location = fileName + ":" + lineNumber; //$NON-NLS-1$
|
|
||||||
} else {
|
|
||||||
location = fileName + ":" + function; //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
} else if (!function.equals(NULL_STRING)) {
|
|
||||||
// function location without source
|
|
||||||
location = function;
|
|
||||||
} else if (location.length() > 0) {
|
|
||||||
// address location
|
|
||||||
if (Character.isDigit(location.charAt(0))) {
|
|
||||||
// numeric address needs '*' prefix
|
|
||||||
location = '*' + location;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return location;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a breakpoint of type BREAKPOINT
|
|
||||||
*
|
*
|
||||||
* @param context
|
* @param context
|
||||||
* @param breakpoint
|
* @param breakpoint
|
||||||
* @param drm
|
* @param drm
|
||||||
*/
|
*/
|
||||||
private void addBreakpoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm)
|
@Override
|
||||||
|
protected void addBreakpoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm)
|
||||||
{
|
{
|
||||||
// Select the context breakpoints map
|
// Select the context breakpoints map
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
||||||
drm.done();
|
drm.done();
|
||||||
|
@ -460,7 +144,7 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
contextBreakpoints.put(reference, newBreakpoint);
|
contextBreakpoints.put(reference, newBreakpoint);
|
||||||
|
|
||||||
// Format the return value
|
// Format the return value
|
||||||
MIBreakpointDMContext dmc = new MIBreakpointDMContext(getSession(), new IDMContext[] { context }, reference);
|
MIBreakpointDMContext dmc = new MIBreakpointDMContext(GDBBreakpoints_7_0.this, new IDMContext[] { context }, reference);
|
||||||
drm.setData(dmc);
|
drm.setData(dmc);
|
||||||
|
|
||||||
// Flag the event
|
// Flag the event
|
||||||
|
@ -488,10 +172,11 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
* @param breakpoint
|
* @param breakpoint
|
||||||
* @param drm
|
* @param drm
|
||||||
*/
|
*/
|
||||||
private void addTracepoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm)
|
@Override
|
||||||
|
protected void addTracepoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm)
|
||||||
{
|
{
|
||||||
// Select the context breakpoints map
|
// Select the context breakpoints map
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
||||||
drm.done();
|
drm.done();
|
||||||
|
@ -537,7 +222,7 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
contextBreakpoints.put(reference, newBreakpoint);
|
contextBreakpoints.put(reference, newBreakpoint);
|
||||||
|
|
||||||
// Format the return value
|
// Format the return value
|
||||||
MIBreakpointDMContext dmc = new MIBreakpointDMContext(getSession(), new IDMContext[] { context }, reference);
|
MIBreakpointDMContext dmc = new MIBreakpointDMContext(GDBBreakpoints_7_0.this, new IDMContext[] { context }, reference);
|
||||||
drm.setData(dmc);
|
drm.setData(dmc);
|
||||||
|
|
||||||
// Flag the event
|
// Flag the event
|
||||||
|
@ -562,214 +247,20 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a breakpoint of type WATCHPOINT
|
|
||||||
*
|
|
||||||
* @param context
|
|
||||||
* @param watchpoint
|
|
||||||
* @param drm
|
|
||||||
*/
|
|
||||||
private void addWatchpoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm)
|
|
||||||
{
|
|
||||||
// Pick the context breakpoints map
|
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
|
||||||
if (contextBreakpoints == null) {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
|
||||||
drm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extract the relevant parameters (providing default values to avoid potential NPEs)
|
|
||||||
String expression = (String) getProperty(attributes, MIBreakpoints.EXPRESSION, NULL_STRING);
|
|
||||||
boolean isRead = (Boolean) getProperty(attributes, MIBreakpoints.READ, false);
|
|
||||||
boolean isWrite = (Boolean) getProperty(attributes, MIBreakpoints.WRITE, false);
|
|
||||||
|
|
||||||
// The DataRequestMonitor for the add request
|
|
||||||
DataRequestMonitor<MIBreakInsertInfo> addWatchpointDRM =
|
|
||||||
new DataRequestMonitor<MIBreakInsertInfo>(getExecutor(), drm) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
|
|
||||||
// With MI, an invalid location won't generate an error
|
|
||||||
if (getData().getMIBreakpoints().length == 0) {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, WATCHPOINT_INSERTION_FAILURE, null));
|
|
||||||
drm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a breakpoint object and store it in the map
|
|
||||||
final MIBreakpointDMData newBreakpoint = new MIBreakpointDMData(getData().getMIBreakpoints()[0]);
|
|
||||||
int reference = newBreakpoint.getNumber();
|
|
||||||
if (reference == -1) {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, WATCHPOINT_INSERTION_FAILURE, null));
|
|
||||||
drm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
contextBreakpoints.put(reference, newBreakpoint);
|
|
||||||
|
|
||||||
// Format the return value
|
|
||||||
MIBreakpointDMContext dmc = new MIBreakpointDMContext(getSession(), new IDMContext[] { context }, reference);
|
|
||||||
drm.setData(dmc);
|
|
||||||
|
|
||||||
// Flag the event
|
|
||||||
getSession().dispatchEvent(new BreakpointAddedEvent(dmc), getProperties());
|
|
||||||
|
|
||||||
// Condition, ignore count and state can not be specified at watchpoint creation time.
|
|
||||||
// Therefore, we have to update the watchpoint if any of these is present
|
|
||||||
Map<String,Object> delta = new HashMap<String,Object>();
|
|
||||||
delta.put(MIBreakpoints.CONDITION, getProperty(attributes, MIBreakpoints.CONDITION, NULL_STRING));
|
|
||||||
delta.put(MIBreakpoints.IGNORE_COUNT, getProperty(attributes, MIBreakpoints.IGNORE_COUNT, 0 ));
|
|
||||||
delta.put(MIBreakpoints.IS_ENABLED, getProperty(attributes, MIBreakpoints.IS_ENABLED, true));
|
|
||||||
modifyBreakpoint(dmc, delta, drm, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void handleError() {
|
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, WATCHPOINT_INSERTION_FAILURE, null));
|
|
||||||
drm.done();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Execute the command
|
|
||||||
fConnection.queueCommand(new MIBreakWatch(context, isRead, isWrite, expression), addWatchpointDRM);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
// removeBreakpoint
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.dsf.debug.service.IBreakpoints#removeBreakpoint(org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointDMContext, org.eclipse.cdt.dsf.concurrent.RequestMonitor)
|
|
||||||
*/
|
|
||||||
public void removeBreakpoint(final IBreakpointDMContext dmc, final RequestMonitor rm) {
|
|
||||||
|
|
||||||
// Validate the breakpoint context
|
|
||||||
if (dmc == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the breakpoint type
|
|
||||||
MIBreakpointDMContext breakpointCtx;
|
|
||||||
if (dmc instanceof MIBreakpointDMContext) {
|
|
||||||
breakpointCtx = (MIBreakpointDMContext) dmc;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_TYPE, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the target context
|
|
||||||
IBreakpointsTargetDMContext context = DMContexts.getAncestorOfType(dmc, IBreakpointsTargetDMContext.class);
|
|
||||||
if (context == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_EXECUTION_CONTEXT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pick the context breakpoints map
|
|
||||||
final Map<Integer,MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
|
||||||
if (contextBreakpoints == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the breakpoint
|
|
||||||
final int reference = breakpointCtx.getReference();
|
|
||||||
MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
|
||||||
if (breakpoint == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Queue the command
|
|
||||||
fConnection.queueCommand(
|
|
||||||
new MIBreakDelete(context, new int[] { reference }),
|
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
getSession().dispatchEvent(new BreakpointRemovedEvent(dmc), getProperties());
|
|
||||||
contextBreakpoints.remove(reference);
|
|
||||||
rm.done();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// updateBreakpoint
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.dsf.debug.service.IBreakpoints#updateBreakpoint(org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointDMContext, java.util.Map, org.eclipse.cdt.dsf.concurrent.RequestMonitor)
|
|
||||||
*/
|
|
||||||
public void updateBreakpoint(IBreakpointDMContext dmc, Map<String, Object> properties, RequestMonitor rm)
|
|
||||||
{
|
|
||||||
// Validate the breakpoint context
|
|
||||||
if (dmc == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the breakpoint type
|
|
||||||
MIBreakpointDMContext breakpointCtx;
|
|
||||||
if (dmc instanceof MIBreakpointDMContext) {
|
|
||||||
breakpointCtx = (MIBreakpointDMContext) dmc;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_TYPE, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the context
|
|
||||||
IBreakpointsTargetDMContext context = DMContexts.getAncestorOfType(dmc, IBreakpointsTargetDMContext.class);
|
|
||||||
if (context == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_EXECUTION_CONTEXT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pick the context breakpoints map
|
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
|
||||||
if (contextBreakpoints == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the breakpoint
|
|
||||||
final int reference = breakpointCtx.getReference();
|
|
||||||
MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
|
||||||
if (breakpoint == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
modifyBreakpoint(breakpointCtx, properties, rm, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param dmc
|
* @param dmc
|
||||||
* @param properties
|
* @param properties
|
||||||
* @param rm
|
* @param rm
|
||||||
* @param generateUpdateEvent
|
* @param generateUpdateEvent
|
||||||
*/
|
*/
|
||||||
private void modifyBreakpoint(final MIBreakpointDMContext breakpointCtx, Map<String, Object> attributes,
|
@Override
|
||||||
final RequestMonitor rm, final boolean generateUpdateEvent)
|
protected void modifyBreakpoint(final IBreakpointDMContext dmc, final Map<String, Object> attributes, final RequestMonitor rm, final boolean generateUpdateEvent)
|
||||||
{
|
{
|
||||||
// Use a working copy of the attributes since we are going to tamper happily with them
|
|
||||||
Map<String, Object> properties = new HashMap<String, Object>(attributes);
|
|
||||||
|
|
||||||
// Retrieve the breakpoint parameters
|
// Retrieve the breakpoint parameters
|
||||||
// At this point, we know their are OK so there is no need to re-validate
|
// At this point, we know their are OK so there is no need to re-validate
|
||||||
|
MIBreakpointDMContext breakpointCtx = (MIBreakpointDMContext) dmc;
|
||||||
IBreakpointsTargetDMContext context = DMContexts.getAncestorOfType(breakpointCtx, IBreakpointsTargetDMContext.class);
|
IBreakpointsTargetDMContext context = DMContexts.getAncestorOfType(breakpointCtx, IBreakpointsTargetDMContext.class);
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
final int reference = breakpointCtx.getReference();
|
final int reference = breakpointCtx.getReference();
|
||||||
MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
||||||
|
|
||||||
|
@ -777,66 +268,22 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
int numberOfChanges = 0;
|
int numberOfChanges = 0;
|
||||||
final CountingRequestMonitor countingRm = new CountingRequestMonitor(getExecutor(), rm) {
|
final CountingRequestMonitor countingRm = new CountingRequestMonitor(getExecutor(), rm) {
|
||||||
@Override
|
@Override
|
||||||
protected void handleSuccess() {
|
protected void handleCompleted() {
|
||||||
if (generateUpdateEvent)
|
GDBBreakpoints_7_0.super.modifyBreakpoint(dmc, attributes, rm, generateUpdateEvent);
|
||||||
getSession().dispatchEvent(new BreakpointUpdatedEvent(breakpointCtx), getProperties());
|
|
||||||
rm.done();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Determine if the breakpoint condition changed
|
|
||||||
String conditionAttribute = MIBreakpoints.CONDITION;
|
|
||||||
if (properties.containsKey(conditionAttribute)) {
|
|
||||||
String oldValue = breakpoint.getCondition();
|
|
||||||
String newValue = (String) properties.get(conditionAttribute);
|
|
||||||
if (newValue == null) newValue = NULL_STRING;
|
|
||||||
if (!oldValue.equals(newValue)) {
|
|
||||||
changeCondition(context, reference, newValue, countingRm);
|
|
||||||
numberOfChanges++;
|
|
||||||
}
|
|
||||||
properties.remove(conditionAttribute);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if the breakpoint ignore count changed
|
|
||||||
String ignoreCountAttribute = MIBreakpoints.IGNORE_COUNT;
|
|
||||||
if (properties.containsKey(ignoreCountAttribute)) {
|
|
||||||
Integer oldValue = breakpoint.getIgnoreCount();
|
|
||||||
Integer newValue = (Integer) properties.get(ignoreCountAttribute);
|
|
||||||
if (newValue == null) newValue = 0;
|
|
||||||
if (!oldValue.equals(newValue)) {
|
|
||||||
changeIgnoreCount(context, reference, newValue, countingRm);
|
|
||||||
numberOfChanges++;
|
|
||||||
}
|
|
||||||
properties.remove(ignoreCountAttribute);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if the tracepoint pass count changed
|
// Determine if the tracepoint pass count changed
|
||||||
String passCountAttribute = MIBreakpoints.PASS_COUNT;
|
String passCountAttribute = MIBreakpoints.PASS_COUNT;
|
||||||
if (properties.containsKey(passCountAttribute)) {
|
if (attributes.containsKey(passCountAttribute)) {
|
||||||
Integer oldValue = breakpoint.getPassCount();
|
Integer oldValue = breakpoint.getPassCount();
|
||||||
Integer newValue = (Integer) properties.get(passCountAttribute);
|
Integer newValue = (Integer) attributes.get(passCountAttribute);
|
||||||
if (newValue == null) newValue = 0;
|
if (newValue == null) newValue = 0;
|
||||||
if (!oldValue.equals(newValue)) {
|
if (!oldValue.equals(newValue)) {
|
||||||
changePassCount(context, reference, newValue, countingRm);
|
changePassCount(context, reference, newValue, countingRm);
|
||||||
numberOfChanges++;
|
numberOfChanges++;
|
||||||
}
|
}
|
||||||
properties.remove(passCountAttribute);
|
attributes.remove(passCountAttribute);
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if the breakpoint state changed
|
|
||||||
String enableAttribute = MIBreakpoints.IS_ENABLED;
|
|
||||||
if (properties.containsKey(enableAttribute)) {
|
|
||||||
Boolean oldValue = breakpoint.isEnabled();
|
|
||||||
Boolean newValue = (Boolean) properties.get(enableAttribute);
|
|
||||||
if (newValue == null) newValue = false;
|
|
||||||
if (!oldValue.equals(newValue)) {
|
|
||||||
numberOfChanges++;
|
|
||||||
if (newValue)
|
|
||||||
enableBreakpoint(context, reference, countingRm);
|
|
||||||
else
|
|
||||||
disableBreakpoint(context, reference, countingRm);
|
|
||||||
}
|
|
||||||
properties.remove(enableAttribute);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// // Determine if the breakpoint state changed
|
// // Determine if the breakpoint state changed
|
||||||
|
@ -867,69 +314,6 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
// }
|
// }
|
||||||
// return actions;
|
// return actions;
|
||||||
// }
|
// }
|
||||||
/**
|
|
||||||
* Update the breakpoint condition
|
|
||||||
*
|
|
||||||
* @param context
|
|
||||||
* @param dmc
|
|
||||||
* @param condition
|
|
||||||
* @param rm
|
|
||||||
*/
|
|
||||||
private void changeCondition(final IBreakpointsTargetDMContext context,
|
|
||||||
final int reference, final String condition, final RequestMonitor rm)
|
|
||||||
{
|
|
||||||
// Pick the context breakpoints map
|
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
|
||||||
if (contextBreakpoints == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Queue the command
|
|
||||||
fConnection.queueCommand(
|
|
||||||
new MIBreakCondition(context, reference, condition),
|
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
|
||||||
if (breakpoint == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
breakpoint.setCondition(condition);
|
|
||||||
rm.done();
|
|
||||||
}
|
|
||||||
|
|
||||||
// In case of error (new condition could not be installed for whatever reason),
|
|
||||||
// GDB "offers" different behaviours depending on its version: it can either keep
|
|
||||||
// the original condition (the right thing to do) or keep the invalid condition.
|
|
||||||
// Our sole option is to remove the condition in case of error and rely on the
|
|
||||||
// upper layer to re-install the right condition.
|
|
||||||
@Override
|
|
||||||
protected void handleError() {
|
|
||||||
MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
|
||||||
if (breakpoint == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Remove invalid condition from the back-end breakpoint
|
|
||||||
breakpoint.setCondition(NULL_STRING);
|
|
||||||
fConnection.queueCommand(
|
|
||||||
new MIBreakCondition(context, reference, NULL_STRING),
|
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
|
|
||||||
@Override
|
|
||||||
// The report the initial problem
|
|
||||||
protected void handleCompleted() {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, INVALID_CONDITION, null));
|
|
||||||
rm.done();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// private void changeActions(final IBreakpointsTargetDMContext context,
|
// private void changeActions(final IBreakpointsTargetDMContext context,
|
||||||
// final int reference, final IBreakpointAction[] actions, final RequestMonitor rm)
|
// final int reference, final IBreakpointAction[] actions, final RequestMonitor rm)
|
||||||
|
@ -972,18 +356,15 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the breakpoint ignoreCount
|
* Update the breakpoint ignoreCount.
|
||||||
*
|
* IgnoreCount is not supported by tracepoints
|
||||||
* @param context
|
|
||||||
* @param reference
|
|
||||||
* @param ignoreCount
|
|
||||||
* @param rm
|
|
||||||
*/
|
*/
|
||||||
private void changeIgnoreCount(IBreakpointsTargetDMContext context,
|
@Override
|
||||||
|
protected void changeIgnoreCount(IBreakpointsTargetDMContext context,
|
||||||
final int reference, final int ignoreCount, final RequestMonitor rm)
|
final int reference, final int ignoreCount, final RequestMonitor rm)
|
||||||
{
|
{
|
||||||
// Pick the context breakpoints map
|
// Pick the context breakpoints map
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
||||||
rm.done();
|
rm.done();
|
||||||
|
@ -991,29 +372,14 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
}
|
}
|
||||||
|
|
||||||
final MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
final MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
||||||
if (breakpoint.getBreakpointType().equals(MIBreakpoints.TRACEPOINT)) {
|
if (breakpoint == null || breakpoint.getBreakpointType().equals(MIBreakpoints.TRACEPOINT)) {
|
||||||
// Ingorecount is not supported for tracepoints
|
// Ignorecount is not supported for tracepoints
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, INVALID_BREAKPOINT_TYPE, null));
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, INVALID_BREAKPOINT_TYPE, null));
|
||||||
rm.done();
|
rm.done();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Queue the command
|
super.changeIgnoreCount(context, reference, ignoreCount, rm);
|
||||||
fConnection.queueCommand(
|
|
||||||
new MIBreakAfter(context, reference, ignoreCount),
|
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
|
||||||
if (breakpoint == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
breakpoint.setIgnoreCount(ignoreCount);
|
|
||||||
rm.done();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1024,11 +390,11 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
* @param ignoreCount
|
* @param ignoreCount
|
||||||
* @param rm
|
* @param rm
|
||||||
*/
|
*/
|
||||||
private void changePassCount(IBreakpointsTargetDMContext context,
|
protected void changePassCount(IBreakpointsTargetDMContext context,
|
||||||
final int reference, final int ignoreCount, final RequestMonitor rm)
|
final int reference, final int ignoreCount, final RequestMonitor rm)
|
||||||
{
|
{
|
||||||
// Pick the context breakpoints map
|
// Pick the context breakpoints map
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
||||||
rm.done();
|
rm.done();
|
||||||
|
@ -1036,7 +402,7 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
}
|
}
|
||||||
|
|
||||||
final MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
final MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
||||||
if (breakpoint.getBreakpointType().equals(MIBreakpoints.TRACEPOINT) == false) {
|
if (breakpoint == null || breakpoint.getBreakpointType().equals(MIBreakpoints.TRACEPOINT) == false) {
|
||||||
// Passcount is just for tracepoints
|
// Passcount is just for tracepoints
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, INVALID_BREAKPOINT_TYPE, null));
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, INVALID_BREAKPOINT_TYPE, null));
|
||||||
rm.done();
|
rm.done();
|
||||||
|
@ -1049,86 +415,9 @@ public class GDBBreakpoints_7_0 extends AbstractDsfService implements IBreakpoin
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
|
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
|
||||||
@Override
|
@Override
|
||||||
protected void handleSuccess() {
|
protected void handleSuccess() {
|
||||||
if (breakpoint == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
breakpoint.setPassCount(ignoreCount);
|
breakpoint.setPassCount(ignoreCount);
|
||||||
rm.done();
|
rm.done();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Enable the breakpoint
|
|
||||||
*
|
|
||||||
* @param context
|
|
||||||
* @param reference
|
|
||||||
* @param rm
|
|
||||||
*/
|
|
||||||
private void enableBreakpoint(IBreakpointsTargetDMContext context,
|
|
||||||
final int reference, final RequestMonitor rm)
|
|
||||||
{
|
|
||||||
// Pick the context breakpoints map
|
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
|
||||||
if (contextBreakpoints == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Queue the command
|
|
||||||
fConnection.queueCommand(
|
|
||||||
new MIBreakEnable(context, new int[] { reference }),
|
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
|
||||||
if (breakpoint == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
breakpoint.setEnabled(true);
|
|
||||||
rm.done();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disable the breakpoint
|
|
||||||
*
|
|
||||||
* @param context
|
|
||||||
* @param dmc
|
|
||||||
* @param rm
|
|
||||||
*/
|
|
||||||
private void disableBreakpoint(IBreakpointsTargetDMContext context,
|
|
||||||
final int reference, final RequestMonitor rm)
|
|
||||||
{
|
|
||||||
// Pick the context breakpoints map
|
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
|
||||||
if (contextBreakpoints == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Queue the command
|
|
||||||
fConnection.queueCommand(
|
|
||||||
new MIBreakDisable(context, new int[] { reference }),
|
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
|
|
||||||
@Override
|
|
||||||
protected void handleSuccess() {
|
|
||||||
MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
|
||||||
if (breakpoint == null) {
|
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
|
||||||
rm.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
breakpoint.setEnabled(false);
|
|
||||||
rm.done();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2007, 2008 Ericsson and others.
|
* Copyright (c) 2007, 2010 Ericsson and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -95,15 +95,49 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
private Map<IBreakpointsTargetDMContext, Map<Integer, MIBreakpointDMData>> fBreakpoints =
|
private Map<IBreakpointsTargetDMContext, Map<Integer, MIBreakpointDMData>> fBreakpoints =
|
||||||
new HashMap<IBreakpointsTargetDMContext, Map<Integer, MIBreakpointDMData>>();
|
new HashMap<IBreakpointsTargetDMContext, Map<Integer, MIBreakpointDMData>>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a map of existing breakpoints for the specified context
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
|
*/
|
||||||
|
protected Map<Integer, MIBreakpointDMData> getBreakpointMap(IBreakpointsTargetDMContext ctx) {
|
||||||
|
return fBreakpoints.get(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an empty breakpoint map and store it with the specific context.
|
||||||
|
*
|
||||||
|
* @return The newly created empty map.
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
|
*/
|
||||||
|
protected Map<Integer, MIBreakpointDMData> createNewBreakpointMap(IBreakpointsTargetDMContext ctx) {
|
||||||
|
Map<Integer, MIBreakpointDMData> map = new HashMap<Integer, MIBreakpointDMData>();
|
||||||
|
fBreakpoints.put(ctx, map);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
// Error messages
|
// Error messages
|
||||||
final String NULL_STRING = ""; //$NON-NLS-1$
|
/** @since 3.0 */
|
||||||
final String UNKNOWN_EXECUTION_CONTEXT = "Unknown execution context"; //$NON-NLS-1$
|
public final static String NULL_STRING = ""; //$NON-NLS-1$
|
||||||
final String UNKNOWN_BREAKPOINT_CONTEXT = "Unknown breakpoint context"; //$NON-NLS-1$
|
/** @since 3.0 */
|
||||||
final String UNKNOWN_BREAKPOINT_TYPE = "Unknown breakpoint type"; //$NON-NLS-1$
|
public final static String UNKNOWN_EXECUTION_CONTEXT = "Unknown execution context"; //$NON-NLS-1$
|
||||||
final String UNKNOWN_BREAKPOINT = "Unknown breakpoint"; //$NON-NLS-1$
|
/** @since 3.0 */
|
||||||
final String BREAKPOINT_INSERTION_FAILURE = "Breakpoint insertion failure"; //$NON-NLS-1$
|
public final static String UNKNOWN_BREAKPOINT_CONTEXT = "Unknown breakpoint context"; //$NON-NLS-1$
|
||||||
final String WATCHPOINT_INSERTION_FAILURE = "Watchpoint insertion failure"; //$NON-NLS-1$
|
/** @since 3.0 */
|
||||||
final String INVALID_CONDITION = "Invalid condition"; //$NON-NLS-1$
|
public final static String UNKNOWN_BREAKPOINT_TYPE = "Unknown breakpoint type"; //$NON-NLS-1$
|
||||||
|
/** @since 3.0 */
|
||||||
|
public final static String UNKNOWN_BREAKPOINT = "Unknown breakpoint"; //$NON-NLS-1$
|
||||||
|
/** @since 3.0 */
|
||||||
|
public final static String BREAKPOINT_INSERTION_FAILURE = "Breakpoint insertion failure"; //$NON-NLS-1$
|
||||||
|
/** @since 3.0 */
|
||||||
|
public final static String WATCHPOINT_INSERTION_FAILURE = "Watchpoint insertion failure"; //$NON-NLS-1$
|
||||||
|
/** @since 3.0 */
|
||||||
|
public final static String INVALID_CONDITION = "Invalid condition"; //$NON-NLS-1$
|
||||||
|
/** @since 3.0 */
|
||||||
|
public final static String TRACEPOINT_INSERTION_FAILURE = "Tracepoint insertion failure"; //$NON-NLS-1$
|
||||||
|
/** @since 3.0 */
|
||||||
|
public final static String INVALID_BREAKPOINT_TYPE = "Invalid breakpoint type"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -271,7 +305,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
// remove it from our breakpoints map.
|
// remove it from our breakpoints map.
|
||||||
IBreakpointsTargetDMContext bpContext = DMContexts.getAncestorOfType(e.getDMContext(), IBreakpointsTargetDMContext.class);
|
IBreakpointsTargetDMContext bpContext = DMContexts.getAncestorOfType(e.getDMContext(), IBreakpointsTargetDMContext.class);
|
||||||
if (bpContext != null) {
|
if (bpContext != null) {
|
||||||
Map<Integer, MIBreakpointDMData> contextBps = fBreakpoints.get(bpContext);
|
Map<Integer, MIBreakpointDMData> contextBps = getBreakpointMap(bpContext);
|
||||||
if (contextBps != null) {
|
if (contextBps != null) {
|
||||||
contextBps.remove(e.getNumber());
|
contextBps.remove(e.getNumber());
|
||||||
}
|
}
|
||||||
|
@ -310,7 +344,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
// Select the breakpoints context map
|
// Select the breakpoints context map
|
||||||
// If it doesn't exist then no breakpoint was ever inserted for this breakpoint space.
|
// If it doesn't exist then no breakpoint was ever inserted for this breakpoint space.
|
||||||
// In that case, return an empty list.
|
// In that case, return an empty list.
|
||||||
final Map<Integer, MIBreakpointDMData> breakpointContext = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> breakpointContext = getBreakpointMap(context);
|
||||||
if (breakpointContext == null) {
|
if (breakpointContext == null) {
|
||||||
drm.setData(new IBreakpointDMContext[0]);
|
drm.setData(new IBreakpointDMContext[0]);
|
||||||
drm.done();
|
drm.done();
|
||||||
|
@ -374,7 +408,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select the breakpoints context map
|
// Select the breakpoints context map
|
||||||
Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
||||||
drm.done();
|
drm.done();
|
||||||
|
@ -404,10 +438,9 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select the breakpoints context map. If it doesn't exist, create it.
|
// Select the breakpoints context map. If it doesn't exist, create it.
|
||||||
Map<Integer, MIBreakpointDMData> breakpointContext = fBreakpoints.get(context);
|
Map<Integer, MIBreakpointDMData> breakpointContext = getBreakpointMap(context);
|
||||||
if (breakpointContext == null) {
|
if (breakpointContext == null) {
|
||||||
breakpointContext = new HashMap<Integer, MIBreakpointDMData>();
|
breakpointContext = createNewBreakpointMap(context);
|
||||||
fBreakpoints.put(context, breakpointContext);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate the breakpoint type
|
// Validate the breakpoint type
|
||||||
|
@ -425,6 +458,9 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
else if (type.equals(WATCHPOINT)) {
|
else if (type.equals(WATCHPOINT)) {
|
||||||
addWatchpoint(context, attributes, drm);
|
addWatchpoint(context, attributes, drm);
|
||||||
}
|
}
|
||||||
|
else if (type.equals(MIBreakpoints.TRACEPOINT)) {
|
||||||
|
addTracepoint(context, attributes, drm);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_TYPE, null));
|
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_TYPE, null));
|
||||||
drm.done();
|
drm.done();
|
||||||
|
@ -444,8 +480,9 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
/**
|
/**
|
||||||
* @param attributes
|
* @param attributes
|
||||||
* @return
|
* @return
|
||||||
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
private String formatLocation(Map<String, Object> attributes) {
|
protected String formatLocation(Map<String, Object> attributes) {
|
||||||
|
|
||||||
// Unlikely default location
|
// Unlikely default location
|
||||||
String location = (String) getProperty(attributes, ADDRESS, NULL_STRING);
|
String location = (String) getProperty(attributes, ADDRESS, NULL_STRING);
|
||||||
|
@ -486,11 +523,13 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
* @param context
|
* @param context
|
||||||
* @param breakpoint
|
* @param breakpoint
|
||||||
* @param drm
|
* @param drm
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
private void addBreakpoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm)
|
protected void addBreakpoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm)
|
||||||
{
|
{
|
||||||
// Select the context breakpoints map
|
// Select the context breakpoints map
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
||||||
drm.done();
|
drm.done();
|
||||||
|
@ -561,17 +600,34 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
new MIBreakInsert(context, isTemporary, isHardware, condition, ignoreCount, location, tid), addBreakpointDRM);
|
new MIBreakInsert(context, isTemporary, isHardware, condition, ignoreCount, location, tid), addBreakpointDRM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a tracepoint. Currently not supported in this version, but only in our GDB 7.0 version.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* @param attributes
|
||||||
|
* @param drm
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
|
*/
|
||||||
|
protected void addTracepoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm) {
|
||||||
|
// Not supported
|
||||||
|
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_TYPE, null));
|
||||||
|
drm.done();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a breakpoint of type WATCHPOINT
|
* Add a breakpoint of type WATCHPOINT
|
||||||
*
|
*
|
||||||
* @param context
|
* @param context
|
||||||
* @param watchpoint
|
* @param watchpoint
|
||||||
* @param drm
|
* @param drm
|
||||||
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
private void addWatchpoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm)
|
protected void addWatchpoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm)
|
||||||
{
|
{
|
||||||
// Pick the context breakpoints map
|
// Pick the context breakpoints map
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
drm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
||||||
drm.done();
|
drm.done();
|
||||||
|
@ -669,7 +725,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pick the context breakpoints map
|
// Pick the context breakpoints map
|
||||||
final Map<Integer,MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer,MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
||||||
rm.done();
|
rm.done();
|
||||||
|
@ -736,7 +792,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pick the context breakpoints map
|
// Pick the context breakpoints map
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT, null));
|
||||||
rm.done();
|
rm.done();
|
||||||
|
@ -760,8 +816,10 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
* @param properties
|
* @param properties
|
||||||
* @param rm
|
* @param rm
|
||||||
* @param generateUpdateEvent
|
* @param generateUpdateEvent
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
private void modifyBreakpoint(final IBreakpointDMContext dmc, Map<String, Object> attributes, final RequestMonitor rm, final boolean generateUpdateEvent)
|
protected void modifyBreakpoint(final IBreakpointDMContext dmc, Map<String, Object> attributes, final RequestMonitor rm, final boolean generateUpdateEvent)
|
||||||
{
|
{
|
||||||
// Use a working copy of the attributes since we are going to tamper happily with them
|
// Use a working copy of the attributes since we are going to tamper happily with them
|
||||||
Map<String, Object> properties = new HashMap<String, Object>(attributes);
|
Map<String, Object> properties = new HashMap<String, Object>(attributes);
|
||||||
|
@ -770,7 +828,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
// At this point, we know their are OK so there is no need to re-validate
|
// At this point, we know their are OK so there is no need to re-validate
|
||||||
MIBreakpointDMContext breakpointCtx = (MIBreakpointDMContext) dmc;
|
MIBreakpointDMContext breakpointCtx = (MIBreakpointDMContext) dmc;
|
||||||
IBreakpointsTargetDMContext context = DMContexts.getAncestorOfType(dmc, IBreakpointsTargetDMContext.class);
|
IBreakpointsTargetDMContext context = DMContexts.getAncestorOfType(dmc, IBreakpointsTargetDMContext.class);
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
final int reference = breakpointCtx.getReference();
|
final int reference = breakpointCtx.getReference();
|
||||||
MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
MIBreakpointDMData breakpoint = contextBreakpoints.get(reference);
|
||||||
|
|
||||||
|
@ -838,12 +896,14 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
* @param dmc
|
* @param dmc
|
||||||
* @param condition
|
* @param condition
|
||||||
* @param rm
|
* @param rm
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
private void changeCondition(final IBreakpointsTargetDMContext context,
|
protected void changeCondition(final IBreakpointsTargetDMContext context,
|
||||||
final int reference, final String condition, final RequestMonitor rm)
|
final int reference, final String condition, final RequestMonitor rm)
|
||||||
{
|
{
|
||||||
// Pick the context breakpoints map
|
// Pick the context breakpoints map
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
||||||
rm.done();
|
rm.done();
|
||||||
|
@ -903,12 +963,14 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
* @param reference
|
* @param reference
|
||||||
* @param ignoreCount
|
* @param ignoreCount
|
||||||
* @param rm
|
* @param rm
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
private void changeIgnoreCount(IBreakpointsTargetDMContext context,
|
protected void changeIgnoreCount(IBreakpointsTargetDMContext context,
|
||||||
final int reference, final int ignoreCount, final RequestMonitor rm)
|
final int reference, final int ignoreCount, final RequestMonitor rm)
|
||||||
{
|
{
|
||||||
// Pick the context breakpoints map
|
// Pick the context breakpoints map
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
||||||
rm.done();
|
rm.done();
|
||||||
|
@ -939,12 +1001,14 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
* @param context
|
* @param context
|
||||||
* @param reference
|
* @param reference
|
||||||
* @param rm
|
* @param rm
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
private void enableBreakpoint(IBreakpointsTargetDMContext context,
|
protected void enableBreakpoint(IBreakpointsTargetDMContext context,
|
||||||
final int reference, final RequestMonitor rm)
|
final int reference, final RequestMonitor rm)
|
||||||
{
|
{
|
||||||
// Pick the context breakpoints map
|
// Pick the context breakpoints map
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
||||||
rm.done();
|
rm.done();
|
||||||
|
@ -975,12 +1039,14 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
|
||||||
* @param context
|
* @param context
|
||||||
* @param dmc
|
* @param dmc
|
||||||
* @param rm
|
* @param rm
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
private void disableBreakpoint(IBreakpointsTargetDMContext context,
|
protected void disableBreakpoint(IBreakpointsTargetDMContext context,
|
||||||
final int reference, final RequestMonitor rm)
|
final int reference, final RequestMonitor rm)
|
||||||
{
|
{
|
||||||
// Pick the context breakpoints map
|
// Pick the context breakpoints map
|
||||||
final Map<Integer, MIBreakpointDMData> contextBreakpoints = fBreakpoints.get(context);
|
final Map<Integer, MIBreakpointDMData> contextBreakpoints = getBreakpointMap(context);
|
||||||
if (contextBreakpoints == null) {
|
if (contextBreakpoints == null) {
|
||||||
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_CONTEXT, null));
|
||||||
rm.done();
|
rm.done();
|
||||||
|
|
|
@ -50,7 +50,6 @@ public class MIBreakInsertInfo extends MIInfo {
|
||||||
} else if (var.equals("bkpt")) { //$NON-NLS-1$
|
} else if (var.equals("bkpt")) { //$NON-NLS-1$
|
||||||
if (val instanceof MITuple) {
|
if (val instanceof MITuple) {
|
||||||
bpt = new MIBreakpoint((MITuple)val);
|
bpt = new MIBreakpoint((MITuple)val);
|
||||||
bpt.setEnabled(true);
|
|
||||||
}
|
}
|
||||||
} else if (var.equals("hw-awpt")) { //$NON-NLS-1$
|
} else if (var.equals("hw-awpt")) { //$NON-NLS-1$
|
||||||
if (val instanceof MITuple) {
|
if (val instanceof MITuple) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue