diff options
8 files changed, 129 insertions, 12 deletions
diff --git a/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/ICDIEventBreakpointHit.java b/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/ICDIEventBreakpointHit.java new file mode 100644 index 00000000000..6d800f81616 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/ICDIEventBreakpointHit.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2010 Freescale Semiconductor and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Freescale Semiconductor - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.debug.core.cdi; + +/** + * Represents an information provided by the session when the program is + * stopped by an event breakpoint + * @since 7.0 + */ +public interface ICDIEventBreakpointHit extends ICDISessionObject { + /** + * Return the type of event breakpoint, as reported by the debugger backend + * (e.g., gdb) when it reports the target suspended + */ + String getEventBreakpointType(); +} diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java index 6b7ecc06c73..2396e6974a8 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java @@ -35,6 +35,7 @@ import org.eclipse.cdt.debug.core.cdi.ICDIAddressLocation; import org.eclipse.cdt.debug.core.cdi.ICDIBreakpointHit; import org.eclipse.cdt.debug.core.cdi.ICDIEndSteppingRange; import org.eclipse.cdt.debug.core.cdi.ICDIErrorInfo; +import org.eclipse.cdt.debug.core.cdi.ICDIEventBreakpointHit; import org.eclipse.cdt.debug.core.cdi.ICDIFunctionLocation; import org.eclipse.cdt.debug.core.cdi.ICDILineLocation; import org.eclipse.cdt.debug.core.cdi.ICDILocation; @@ -1164,6 +1165,9 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv else if ( reason instanceof ICDISharedLibraryEvent ) { handleSuspendedBySolibEvent( (ICDISharedLibraryEvent)reason ); } + else if ( reason instanceof ICDIEventBreakpointHit ) { + handleEventBreakpointHit( (ICDIEventBreakpointHit)reason ); + } else { // reason is not specified fireSuspendEvent( DebugEvent.UNSPECIFIED ); } @@ -1207,6 +1211,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv fireSuspendEvent( DebugEvent.BREAKPOINT ); } + private void handleEventBreakpointHit( ICDIEventBreakpointHit breakpointHit ) { + fireSuspendEvent( DebugEvent.BREAKPOINT ); + } + private void handleWatchpointTrigger( ICDIWatchpointTrigger wt ) { fireSuspendEvent( DebugEvent.BREAKPOINT ); } diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/EventBreakpointHit.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/EventBreakpointHit.java new file mode 100644 index 00000000000..584aea7b474 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/EventBreakpointHit.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2010 Freescale Semiconductor and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Freescale Semiconductor - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.debug.mi.core.cdi; + +import org.eclipse.cdt.debug.core.cdi.ICDIEventBreakpointHit; +import org.eclipse.cdt.debug.mi.core.event.MICatchpointHitEvent; + +/** + * @since 6.1 + */ +public class EventBreakpointHit extends SessionObject implements ICDIEventBreakpointHit { + + MICatchpointHitEvent fMiEvent; + + public EventBreakpointHit(Session session, MICatchpointHitEvent miEvent) { + super(session); + fMiEvent = miEvent; + } + + public String getEventBreakpointType() { + return fMiEvent.getCatchpointType(); + } +} diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/event/SuspendedEvent.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/event/SuspendedEvent.java index 9deb409de15..1476be4ece6 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/event/SuspendedEvent.java +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/event/SuspendedEvent.java @@ -16,6 +16,7 @@ import org.eclipse.cdt.debug.core.cdi.model.ICDIObject; import org.eclipse.cdt.debug.mi.core.cdi.BreakpointHit; import org.eclipse.cdt.debug.mi.core.cdi.EndSteppingRange; import org.eclipse.cdt.debug.mi.core.cdi.ErrorInfo; +import org.eclipse.cdt.debug.mi.core.cdi.EventBreakpointHit; import org.eclipse.cdt.debug.mi.core.cdi.FunctionFinished; import org.eclipse.cdt.debug.mi.core.cdi.Session; import org.eclipse.cdt.debug.mi.core.cdi.SharedLibraryEvent; @@ -24,6 +25,7 @@ import org.eclipse.cdt.debug.mi.core.cdi.WatchpointScope; import org.eclipse.cdt.debug.mi.core.cdi.WatchpointTrigger; import org.eclipse.cdt.debug.mi.core.cdi.model.Target; import org.eclipse.cdt.debug.mi.core.event.MIBreakpointHitEvent; +import org.eclipse.cdt.debug.mi.core.event.MICatchpointHitEvent; import org.eclipse.cdt.debug.mi.core.event.MIErrorEvent; import org.eclipse.cdt.debug.mi.core.event.MIEvent; import org.eclipse.cdt.debug.mi.core.event.MIFunctionFinishedEvent; @@ -66,6 +68,8 @@ public class SuspendedEvent implements ICDISuspendedEvent { return new ErrorInfo(session, (MIErrorEvent)event); } else if (event instanceof MISharedLibEvent) { return new SharedLibraryEvent(session); + } else if (event instanceof MICatchpointHitEvent) { + return new EventBreakpointHit(session, (MICatchpointHitEvent)event); } return session; } diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/RxThread.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/RxThread.java index 8edffa637b1..11385ce9b6b 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/RxThread.java +++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/RxThread.java @@ -32,6 +32,7 @@ import org.eclipse.cdt.debug.mi.core.command.MIExecStepInstruction; import org.eclipse.cdt.debug.mi.core.command.MIExecUntil; import org.eclipse.cdt.debug.mi.core.command.MIInterpreterExecConsole; import org.eclipse.cdt.debug.mi.core.event.MIBreakpointHitEvent; +import org.eclipse.cdt.debug.mi.core.event.MICatchpointHitEvent; import org.eclipse.cdt.debug.mi.core.event.MIErrorEvent; import org.eclipse.cdt.debug.mi.core.event.MIEvent; import org.eclipse.cdt.debug.mi.core.event.MIFunctionFinishedEvent; @@ -304,13 +305,13 @@ public class RxThread extends Thread { } } - // GDB does not have reason when stopping on shared, hopefully - // this will be fix in newer version meanwhile, we will use a hack - // to cope. On most platform we can detect by looking at the - // console stream for phrase: - // ~"Stopped due to shared library event\n" + // GDB does not provide reason when stopping on a shared library + // event or because of a catchpoint. Hopefully this will be + // fixed in a future version. Meanwhile, we will use a hack to + // cope. On most platform we can detect by looking at the + // console stream for phrase. // - // Althought it is a _real_ bad idea to do this, we do not have + // Although it is a _real_ bad idea to do this, we do not have // any other alternatives. if (list.isEmpty()) { String[] logs = getStreamRecords(); @@ -320,6 +321,19 @@ public class RxThread extends Thread { MIEvent e = new MISharedLibEvent(session, exec); list.add(e); } + else if (logs[i].startsWith("Catchpoint ")) { //$NON-NLS-1$ + // Example: "Catchpoint 1 (exception caught)" + session.getMIInferior().setSuspended(); + String log = logs[i]; + String catchpointType = "???"; //$NON-NLS-1$ + int startIndex = log.lastIndexOf('('); + int stopIndex = log.lastIndexOf(')'); + if ((startIndex >= 0) && (stopIndex >= 0) && (stopIndex > startIndex)) { + catchpointType = log.substring(startIndex+1, stopIndex); + } + MIEvent e = new MICatchpointHitEvent(session, exec, catchpointType); + list.add(e); + } } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/event/MICatchpointHitEvent.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/event/MICatchpointHitEvent.java new file mode 100644 index 00000000000..c63d2dafa37 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/event/MICatchpointHitEvent.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2010 Freescale Semiconductor and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Freescale Semiconductor - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.debug.mi.core.event; + +import org.eclipse.cdt.debug.mi.core.MISession; +import org.eclipse.cdt.debug.mi.core.output.MIExecAsyncOutput; + +/** + * @since 6.1 + */ +public class MICatchpointHitEvent extends MIStoppedEvent { + + private String fCatchpointType; + + public MICatchpointHitEvent(MISession source, MIExecAsyncOutput async, String catchpointType) { + super(source, async); + fCatchpointType = catchpointType; + } + + public String getCatchpointType() { + return fCatchpointType; + } +} diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugModelPresentation.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugModelPresentation.java index 093e050a68f..5dfdf61c217 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugModelPresentation.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugModelPresentation.java @@ -24,6 +24,7 @@ import org.eclipse.cdt.core.resources.FileStorage; import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.CDebugUtils; import org.eclipse.cdt.debug.core.cdi.ICDIBreakpointHit; +import org.eclipse.cdt.debug.core.cdi.ICDIEventBreakpointHit; import org.eclipse.cdt.debug.core.cdi.ICDIExitInfo; import org.eclipse.cdt.debug.core.cdi.ICDISharedLibraryEvent; import org.eclipse.cdt.debug.core.cdi.ICDISignalExitInfo; @@ -705,22 +706,25 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode ICDebugElement element = (ICDebugElement)thread.getAdapter( ICDebugElement.class ); if ( element != null ) { Object info = element.getCurrentStateInfo(); - if ( info != null && info instanceof ICDISignalReceived ) { + if ( info instanceof ICDISignalReceived ) { ICDISignal signal = ((ICDISignalReceived)info).getSignal(); reason = MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.13" ), new String[]{ signal.getName(), signal.getDescription() } ); //$NON-NLS-1$ } - else if ( info != null && info instanceof ICDIWatchpointTrigger ) { + else if ( info instanceof ICDIWatchpointTrigger ) { reason = MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.14" ), new String[]{ ((ICDIWatchpointTrigger)info).getOldValue(), ((ICDIWatchpointTrigger)info).getNewValue() } ); //$NON-NLS-1$ } - else if ( info != null && info instanceof ICDIWatchpointScope ) { + else if ( info instanceof ICDIWatchpointScope ) { reason = CDebugUIMessages.getString( "CDTDebugModelPresentation.15" ); //$NON-NLS-1$ } - else if ( info != null && info instanceof ICDIBreakpointHit ) { + else if ( info instanceof ICDIBreakpointHit ) { reason = CDebugUIMessages.getString( "CDTDebugModelPresentation.16" ); //$NON-NLS-1$ } - else if ( info != null && info instanceof ICDISharedLibraryEvent ) { + else if ( info instanceof ICDISharedLibraryEvent ) { reason = CDebugUIMessages.getString( "CDTDebugModelPresentation.17" ); //$NON-NLS-1$ } + else if ( info instanceof ICDIEventBreakpointHit ) { + reason = MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.20" ), new String[]{ ((ICDIEventBreakpointHit)info).getEventBreakpointType() } ); //$NON-NLS-1$ + } } return MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.18" ), new String[] { thread.getName(), reason } ); //$NON-NLS-1$ } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugUIMessages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugUIMessages.properties index d2daff37156..037260f3cab 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugUIMessages.properties +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugUIMessages.properties @@ -25,6 +25,7 @@ CDTDebugModelPresentation.9=Thread [{0}] (Terminated) CDTDebugModelPresentation.4=<Error. {0}> CDTDebugModelPresentation.10=Thread [{0}] (Stepping) CDTDebugModelPresentation.11=Thread [{0}] (Running) +CDTDebugModelPresentation.12=signal CDTDebugModelPresentation.13=: Signal ''{0}'' received. Description: {1}. CDTDebugModelPresentation.14=: Watchpoint triggered. Old value: ''{0}''. New value: ''{1}''. CDTDebugModelPresentation.15=: Watchpoint is out of scope. @@ -32,7 +33,7 @@ CDTDebugModelPresentation.16=: Breakpoint hit. CDTDebugModelPresentation.17=: Shared library event. CDTDebugModelPresentation.18=Thread [{0}] (Suspended{1}) CDTDebugModelPresentation.19=Thread [{0}] -CDTDebugModelPresentation.12=signal +CDTDebugModelPresentation.20=: Event breakpoint hit [{0}]. CDTDebugModelPresentation.21=<symbol is not available> CDTDebugModelPresentation.22=(disabled) CDTDebugModelPresentation.23=Infinity |