diff --git a/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/model/ICDIDisposable.java b/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/model/ICDIDisposable.java
new file mode 100644
index 00000000000..a51ba6fb906
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/model/ICDIDisposable.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008 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.model;
+
+/**
+ * Some CDI interfaces have a dispose method, but a number of others don't (and
+ * should). E.g., ICDIVariable does, but ICDIStackFrame doesn't. This interface
+ * was created to introduce a dispose capability to CDI objects that call for it
+ * without breaking existing interfaces.
+ *
+ * CDT uses instanceof to check whether a CDI object supports this interface and
+ * if so calls the dispose method when it has no further need for the object. This
+ * does not apply to all CDI object; just ones for which it makes sense. The list
+ * is subject to grow:
+ *
+ * - {@link ICDITarget}
+ *
- {@link ICDIStackFrame}
+ *
- {@link ICDIThread}
+ *
+ */
+public interface ICDIDisposable {
+ /**
+ * Called when the object is no longer needed by CDT.
+ */
+ public void dispose();
+}
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 e8dfd5594ce..4b8eb43c4cf 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
@@ -56,6 +56,7 @@ import org.eclipse.cdt.debug.core.cdi.event.ICDIRestartedEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIResumedEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDISuspendedEvent;
import org.eclipse.cdt.debug.core.cdi.model.ICDIAddressFactoryManagement;
+import org.eclipse.cdt.debug.core.cdi.model.ICDIDisposable;
import org.eclipse.cdt.debug.core.cdi.model.ICDIGlobalVariableDescriptor;
import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
import org.eclipse.cdt.debug.core.cdi.model.ICDISharedLibrary;
@@ -320,9 +321,14 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
* Adds all of the pre-existing threads to this debug target.
*/
protected void initializeThreads( List debugEvents ) {
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget == null) {
+ return;
+ }
+
ICDIThread[] cdiThreads = new ICDIThread[0];
try {
- cdiThreads = getCDITarget().getThreads();
+ cdiThreads = cdiTarget.getThreads();
}
catch( CDIException e ) {
// ignore
@@ -332,7 +338,7 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
CThread thread = createThread( cdiThreads[i] );
debugEvents.add( thread.createCreateEvent() );
try {
- if ( cdiThreads[i].equals( getCDITarget().getCurrentThread() ) && thread.isSuspended() ) {
+ if ( cdiThreads[i].equals( cdiTarget.getCurrentThread() ) && thread.isSuspended() ) {
// Use BREAKPOINT as a detail to force perspective switch
suspendEvent = thread.createSuspendEvent( DebugEvent.BREAKPOINT );
}
@@ -379,9 +385,14 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
}
protected void initializeModuleManager() {
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget == null) {
+ return;
+ }
+
ICDISharedLibrary[] slibs = new ICDISharedLibrary[0];
try {
- slibs = getCDITarget().getSharedLibraries();
+ slibs = cdiTarget.getSharedLibraries();
}
catch( CDIException e ) {
DebugPlugin.log( e );
@@ -517,7 +528,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
final CDebugElementState newState = CDebugElementState.TERMINATING;
changeState( newState );
try {
- getCDITarget().terminate();
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ cdiTarget.terminate();
+ }
}
catch( CDIException e ) {
if ( getState() == newState ) {
@@ -569,7 +583,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
final CDebugElementState newState = CDebugElementState.RESUMING;
changeState( newState );
try {
- getCDITarget().resume( false );
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ cdiTarget.resume( false );
+ }
}
catch( CDIException e ) {
if ( getState() == newState ) {
@@ -588,7 +605,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
final CDebugElementState newState = CDebugElementState.SUSPENDING;
changeState( newState );
try {
- getCDITarget().suspend();
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ cdiTarget.suspend();
+ }
}
catch( CDIException e ) {
if ( getState() == newState ) {
@@ -611,7 +631,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
CThread thread = (CThread)it.next();
ICDIThread suspensionThread = null;
try {
- suspensionThread = getCDITarget().getCurrentThread();
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ suspensionThread = cdiTarget.getCurrentThread();
+ }
}
catch( CDIException e ) {
// ignore
@@ -631,8 +654,11 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
ICDIThread[] cdiThreads = new ICDIThread[0];
ICDIThread currentCDIThread = null;
try {
- cdiThreads = getCDITarget().getThreads();
- currentCDIThread = getCDITarget().getCurrentThread();
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ cdiThreads = cdiTarget.getThreads();
+ currentCDIThread = cdiTarget.getCurrentThread();
+ }
}
catch( CDIException e ) {
}
@@ -727,7 +753,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
final CDebugElementState newState = CDebugElementState.DISCONNECTING;
changeState( newState );
try {
- getCDITarget().disconnect();
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ cdiTarget.disconnect();
+ }
}
catch( CDIException e ) {
if ( getState() == newState ) {
@@ -848,10 +877,11 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
for( int i = 0; i < events.length; i++ ) {
ICDIEvent event = events[i];
ICDIObject source = event.getSource();
+ final ICDITarget cdiTarget = getCDITarget();
if ( source == null && event instanceof ICDIDestroyedEvent ) {
handleTerminatedEvent( (ICDIDestroyedEvent)event );
}
- else if ( source != null && source.getTarget().equals( getCDITarget() ) ) {
+ else if ( source != null && cdiTarget != null && source.getTarget().equals( cdiTarget ) ) {
if ( event instanceof ICDICreatedEvent ) {
if ( source instanceof ICDIThread ) {
handleThreadCreatedEvent( (ICDICreatedEvent)event );
@@ -922,6 +952,11 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
if ( !canRestart() ) {
return;
}
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget == null) {
+ return;
+ }
+
try {
ILaunchConfiguration launchConfig = getLaunch().getLaunchConfiguration();
if ( launchConfig.getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_DEFAULT ) ) {
@@ -930,10 +965,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
// See if the expression is a numeric address
try {
IAddress address = getAddressFactory().createAddress(mainSymbol);
- location = getCDITarget().createAddressLocation( address.getValue() );
+ location = cdiTarget.createAddressLocation( address.getValue() );
} catch (NumberFormatException nfexc) {
// OK, expression is not a simple, absolute numeric value; keep trucking and try to resolve as expression
- location = getCDITarget().createFunctionLocation( "", mainSymbol ); //$NON-NLS-1$
+ location = cdiTarget.createFunctionLocation( "", mainSymbol ); //$NON-NLS-1$
}
setInternalTemporaryBreakpoint( location );
@@ -946,7 +981,7 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
final CDebugElementState newState = CDebugElementState.RESTARTING;
changeState( newState );
try {
- getCDITarget().restart();
+ cdiTarget.restart();
}
catch( CDIException e ) {
if ( getState() == newState ) {
@@ -1031,6 +1066,12 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
disposeBreakpointManager();
removeAllExpressions();
disposePreferences();
+
+ ICDITarget cdiTarget = getCDITarget();
+ setCDITarget(null);
+ if (cdiTarget instanceof ICDIDisposable) {
+ ((ICDIDisposable)cdiTarget).dispose();
+ }
}
/**
@@ -1308,12 +1349,16 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
public void setInternalTemporaryBreakpoint( ICDILocation location ) throws DebugException {
try {
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget == null) {
+ return;
+ }
if (location instanceof ICDIFunctionLocation) {
- getCDITarget().setFunctionBreakpoint( ICBreakpointType.TEMPORARY, (ICDIFunctionLocation)location, null, false );
+ cdiTarget.setFunctionBreakpoint( ICBreakpointType.TEMPORARY, (ICDIFunctionLocation)location, null, false );
} else if (location instanceof ICDILineLocation) {
- getCDITarget().setLineBreakpoint( ICBreakpointType.TEMPORARY, (ICDILineLocation)location, null, false );
+ cdiTarget.setLineBreakpoint( ICBreakpointType.TEMPORARY, (ICDILineLocation)location, null, false );
} else if (location instanceof ICDIAddressLocation) {
- getCDITarget().setAddressBreakpoint( ICBreakpointType.TEMPORARY, (ICDIAddressLocation)location, null, false );
+ cdiTarget.setAddressBreakpoint( ICBreakpointType.TEMPORARY, (ICDIAddressLocation)location, null, false );
} else {
// ???
targetRequestFailed("not_a_location", null); //$NON-NLS-1$
@@ -1481,7 +1526,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
final CDebugElementState newState = CDebugElementState.RESUMING;
changeState( newState );
try {
- getCDITarget().resume( false );
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ cdiTarget.resume( false );
+ }
}
catch( CDIException e ) {
if ( getState() == newState ) {
@@ -1685,8 +1733,9 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
public IAddressFactory getAddressFactory() {
if ( fAddressFactory == null ) {
// Ask CDI plug-in for the default AddressFactory.
- if (fCDITarget instanceof ICDIAddressFactoryManagement) {
- fAddressFactory = ((ICDIAddressFactoryManagement) fCDITarget).getAddressFactory();
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget instanceof ICDIAddressFactoryManagement) {
+ fAddressFactory = ((ICDIAddressFactoryManagement) cdiTarget).getAddressFactory();
}
// And if that doesn't work, use the one from the file.
if ( fAddressFactory == null ){
@@ -1733,7 +1782,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
public ICGlobalVariable createGlobalVariable( IGlobalVariableDescriptor info ) throws DebugException {
ICDIVariableDescriptor vo = null;
try {
- vo = getCDITarget().getGlobalVariableDescriptors( info.getPath().lastSegment(), null, info.getName() );
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ vo = cdiTarget.getGlobalVariableDescriptors( info.getPath().lastSegment(), null, info.getName() );
+ }
}
catch( CDIException e ) {
throw new DebugException( new Status( IStatus.ERROR, CDIDebugModel.getPluginIdentifier(), DebugException.TARGET_REQUEST_FAILED, e.getMessage(), null ) );
@@ -1749,7 +1801,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
ArrayList list = new ArrayList( containers.length );
getSourceLookupPath( list, containers );
try {
- getCDITarget().setSourcePaths( (String[])list.toArray( new String[list.size()] ) );
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ cdiTarget.setSourcePaths( (String[])list.toArray( new String[list.size()] ) );
+ }
}
catch( CDIException e ) {
CDebugCorePlugin.log( e );
@@ -1835,7 +1890,8 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
setInternalTemporaryBreakpoint( location );
}
catch( CoreException e ) {
- boolean isTerminated = getCDITarget().isTerminated();
+ final ICDITarget cdiTarget = getCDITarget();
+ boolean isTerminated = cdiTarget != null && cdiTarget.isTerminated();
if ( isTerminated ) {
String message = MessageFormat.format( CoreModelMessages.getString( "CDebugTarget.0" ), new String[]{ stopExpression } ); //$NON-NLS-1$
MultiStatus status = new MultiStatus( CDebugCorePlugin.getUniqueIdentifier(), IStatus.OK, message, null );
@@ -1851,21 +1907,30 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
}
protected void stopAtSymbol( String stopSymbol ) throws DebugException {
- ICDILocation location = getCDITarget().createFunctionLocation( "", stopSymbol ); //$NON-NLS-1$
- stopAtLocation(location, stopSymbol);
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ ICDILocation location = cdiTarget.createFunctionLocation( "", stopSymbol ); //$NON-NLS-1$
+ stopAtLocation(location, stopSymbol);
+ }
}
protected void stopAtAddress( IAddress address ) throws DebugException {
- ICDIAddressLocation location = getCDITarget().createAddressLocation(address.getValue());
- stopAtLocation(location, address.toHexAddressString());
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ ICDIAddressLocation location = cdiTarget.createAddressLocation(address.getValue());
+ stopAtLocation(location, address.toHexAddressString());
+ }
}
protected void stopInMain() throws DebugException {
String mainSymbol = new String( ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_SYMBOL_DEFAULT );
try {
- mainSymbol = getLaunch().getLaunchConfiguration().getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_SYMBOL_DEFAULT );
- ICDILocation location = getCDITarget().createFunctionLocation( "", mainSymbol ); //$NON-NLS-1$
- setInternalTemporaryBreakpoint( location );
+ final ICDITarget cdiTarget = getCDITarget();
+ if (cdiTarget != null) {
+ mainSymbol = getLaunch().getLaunchConfiguration().getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_SYMBOL_DEFAULT );
+ ICDILocation location = cdiTarget.createFunctionLocation( "", mainSymbol ); //$NON-NLS-1$
+ setInternalTemporaryBreakpoint( location );
+ }
}
catch( CoreException e ) {
String message = MessageFormat.format( CoreModelMessages.getString( "CDebugTarget.2" ), new String[]{ mainSymbol, e.getStatus().getMessage() } ); //$NON-NLS-1$
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java
index 838a8c138c2..22b6d9fa877 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java
@@ -26,6 +26,7 @@ import org.eclipse.cdt.debug.core.cdi.ICDILocation;
import org.eclipse.cdt.debug.core.cdi.ICDILocator;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener;
+import org.eclipse.cdt.debug.core.cdi.model.ICDIDisposable;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteMoveInstructionPointer;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteResume;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression;
@@ -197,8 +198,10 @@ public class CStackFrame extends CDebugElement implements ICStackFrame, IRestart
ISourceLocator locator = ((CDebugTarget)getDebugTarget()).getSourceLocator();
if ( locator != null && locator instanceof IAdaptable && ((IAdaptable)locator).getAdapter( ICSourceLocator.class ) != null )
return ((ICSourceLocator)((IAdaptable)locator).getAdapter( ICSourceLocator.class )).getLineNumber( this );
- if ( getCDIStackFrame() != null && getCDIStackFrame().getLocator() != null )
- return getCDIStackFrame().getLocator().getLineNumber();
+
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ if ( cdiFrame != null && cdiFrame.getLocator() != null )
+ return cdiFrame.getLocator().getLineNumber();
}
return -1;
}
@@ -221,7 +224,12 @@ public class CStackFrame extends CDebugElement implements ICStackFrame, IRestart
* @see org.eclipse.debug.core.model.IStackFrame#getName()
*/
public String getName() throws DebugException {
- ICDILocator locator = getCDIStackFrame().getLocator();
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ if (cdiFrame == null) {
+ return ""; //$NON-NLS-1$
+ }
+
+ ICDILocator locator = cdiFrame.getLocator();
String func = ""; //$NON-NLS-1$
String file = ""; //$NON-NLS-1$
String line = ""; //$NON-NLS-1$
@@ -515,6 +523,12 @@ public class CStackFrame extends CDebugElement implements ICStackFrame, IRestart
getCDISession().getEventManager().removeEventListener( this );
disposeAllVariables();
disposeExpressions();
+
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ setCDIStackFrame(null);
+ if (cdiFrame instanceof ICDIDisposable) {
+ ((ICDIDisposable)cdiFrame).dispose();
+ }
}
/**
@@ -524,7 +538,10 @@ public class CStackFrame extends CDebugElement implements ICStackFrame, IRestart
protected List getCDILocalVariableObjects() throws DebugException {
List list = new ArrayList();
try {
- list.addAll( Arrays.asList( getCDIStackFrame().getLocalVariableDescriptors( ) ) );
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ if (cdiFrame != null) {
+ list.addAll( Arrays.asList( cdiFrame.getLocalVariableDescriptors( ) ) );
+ }
}
catch( CDIException e ) {
targetRequestFailed( e.getMessage(), null );
@@ -539,7 +556,10 @@ public class CStackFrame extends CDebugElement implements ICStackFrame, IRestart
protected List getCDIArgumentObjects() throws DebugException {
List list = new ArrayList();
try {
- list.addAll( Arrays.asList( getCDIStackFrame().getArgumentDescriptors() ) );
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ if (cdiFrame != null) {
+ list.addAll( Arrays.asList( cdiFrame.getArgumentDescriptors() ) );
+ }
}
catch( CDIException e ) {
targetRequestFailed( e.getMessage(), null );
@@ -586,35 +606,40 @@ public class CStackFrame extends CDebugElement implements ICStackFrame, IRestart
*/
public IAddress getAddress() {
IAddressFactory factory = ((CDebugTarget)getDebugTarget()).getAddressFactory();
- return factory.createAddress( getCDIStackFrame().getLocator().getAddress() );
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ return cdiFrame != null ? factory.createAddress( cdiFrame.getLocator().getAddress() ) : null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICStackFrame#getFile()
*/
public String getFile() {
- return getCDIStackFrame().getLocator().getFile();
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ return cdiFrame != null ? cdiFrame.getLocator().getFile() : "";
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICStackFrame#getFunction()
*/
public String getFunction() {
- return getCDIStackFrame().getLocator().getFunction();
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ return cdiFrame != null ? cdiFrame.getLocator().getFunction() : "";
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICStackFrame#getLevel()
*/
public int getLevel() {
- return getCDIStackFrame().getLevel();
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ return cdiFrame != null ? cdiFrame.getLevel() : -1;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICStackFrame#getFrameLineNumber()
*/
public int getFrameLineNumber() {
- return getCDIStackFrame().getLocator().getLineNumber();
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ return cdiFrame != null ? cdiFrame.getLocator().getLineNumber() : -1;
}
protected synchronized void preserve() {
@@ -730,7 +755,10 @@ public class CStackFrame extends CDebugElement implements ICStackFrame, IRestart
*/
public String evaluateExpressionToString( String expression ) throws DebugException {
try {
- return getCDITarget().evaluateExpressionToString( getCDIStackFrame(), expression );
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ if (cdiFrame != null) {
+ return getCDITarget().evaluateExpressionToString( cdiFrame, expression );
+ }
}
catch( CDIException e ) {
targetRequestFailed( e.getMessage(), null );
@@ -748,7 +776,10 @@ public class CStackFrame extends CDebugElement implements ICStackFrame, IRestart
protected void doStepReturn() throws DebugException {
try {
- getCDIStackFrame().stepReturn();
+ final ICDIStackFrame cdiFrame = getCDIStackFrame();
+ if (cdiFrame != null) {
+ cdiFrame.stepReturn();
+ }
}
catch( CDIException e ) {
targetRequestFailed( e.getMessage(), null );
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java
index 5312b6a292b..8b7132fa5c2 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CThread.java
@@ -35,6 +35,7 @@ import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener;
import org.eclipse.cdt.debug.core.cdi.event.ICDIResumedEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDISuspendedEvent;
+import org.eclipse.cdt.debug.core.cdi.model.ICDIDisposable;
import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame;
import org.eclipse.cdt.debug.core.cdi.model.ICDITargetConfiguration;
@@ -265,7 +266,10 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
*/
protected ICDIStackFrame[] getCDIStackFrames( int lowFrame, int highFrame ) throws DebugException {
try {
- return getCDIThread().getStackFrames( lowFrame, highFrame );
+ final ICDIThread cdiThread = getCDIThread();
+ if (cdiThread != null) {
+ return cdiThread.getStackFrames( lowFrame, highFrame );
+ }
}
catch( CDIException e ) {
setStatus( ICDebugElementStatus.WARNING, MessageFormat.format( CoreModelMessages.getString( "CThread.0" ), new String[]{ e.getMessage() } ) ); //$NON-NLS-1$
@@ -373,7 +377,8 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
* @see org.eclipse.debug.core.model.IThread#getName()
*/
public String getName() throws DebugException {
- return getCDIThread().toString();
+ final ICDIThread cdiThread = getCDIThread();
+ return cdiThread != null ? cdiThread.toString() : "";
}
/* (non-Javadoc)
@@ -402,7 +407,8 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
for( int i = 0; i < events.length; i++ ) {
ICDIEvent event = events[i];
ICDIObject source = event.getSource();
- if ( source instanceof ICDIThread && source.equals( getCDIThread() ) ) {
+ final ICDIThread cdiThread = getCDIThread();
+ if ( source instanceof ICDIThread && cdiThread != null && source.equals( cdiThread ) ) {
if ( event instanceof ICDISuspendedEvent ) {
handleSuspendedEvent( (ICDISuspendedEvent)event );
}
@@ -467,7 +473,10 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
CDebugElementState oldState = getState();
setState( CDebugElementState.RESUMING );
try {
- getCDIThread().resume( false );
+ final ICDIThread cdiThread = getCDIThread();
+ if (cdiThread != null) {
+ cdiThread.resume( false );
+ }
}
catch( CDIException e ) {
setState( oldState );
@@ -497,7 +506,9 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
try {
final ICDIThread cdiThread = getCDIThread();
- cdiThread.stepUntil( location );
+ if (cdiThread != null) {
+ cdiThread.stepUntil( location );
+ }
}
catch( CDIException e ) {
setState( oldState );
@@ -517,7 +528,10 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
CDebugElementState oldState = getState();
setState( CDebugElementState.SUSPENDING );
try {
- getCDIThread().suspend();
+ final ICDIThread cdiThread = getCDIThread();
+ if (cdiThread != null) {
+ cdiThread.suspend();
+ }
}
catch( CDIException e ) {
setState( oldState );
@@ -577,11 +591,14 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
CDebugElementState oldState = getState();
setState( CDebugElementState.STEPPING );
try {
- if ( !isInstructionsteppingEnabled() ) {
- getCDIThread().stepInto( 1 );
- }
- else {
- getCDIThread().stepIntoInstruction( 1 );
+ final ICDIThread cdiThread = getCDIThread();
+ if (cdiThread != null) {
+ if ( !isInstructionsteppingEnabled() ) {
+ cdiThread.stepInto( 1 );
+ }
+ else {
+ cdiThread.stepIntoInstruction( 1 );
+ }
}
}
catch( CDIException e ) {
@@ -599,11 +616,14 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
CDebugElementState oldState = getState();
setState( CDebugElementState.STEPPING );
try {
- if ( !isInstructionsteppingEnabled() ) {
- getCDIThread().stepOver( 1 );
- }
- else {
- getCDIThread().stepOverInstruction( 1 );
+ final ICDIThread cdiThread = getCDIThread();
+ if (cdiThread != null) {
+ if ( !isInstructionsteppingEnabled() ) {
+ cdiThread.stepOver( 1 );
+ }
+ else {
+ cdiThread.stepOverInstruction( 1 );
+ }
}
}
catch( CDIException e ) {
@@ -828,6 +848,12 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
protected void cleanup() {
getCDISession().getEventManager().removeEventListener( this );
disposeStackFrames();
+
+ final ICDIThread cdiThread = getCDIThread();
+ setCDIThread(null);
+ if (cdiThread instanceof ICDIDisposable) {
+ ((ICDIDisposable)cdiThread).dispose();
+ }
}
private void setRefreshChildren( boolean refresh ) {
@@ -872,7 +898,10 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
protected int getStackDepth() throws DebugException {
int depth = 0;
try {
- depth = getCDIThread().getStackFrameCount();
+ final ICDIThread cdiThread = getCDIThread();
+ if (cdiThread != null) {
+ depth = cdiThread.getStackFrameCount();
+ }
}
catch( CDIException e ) {
setStatus( ICDebugElementStatus.WARNING, MessageFormat.format( CoreModelMessages.getString( "CThread.1" ), new String[]{ e.getMessage() } ) ); //$NON-NLS-1$
@@ -997,7 +1026,8 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
protected void suspendByTarget( ICDISessionObject reason, ICDIThread suspensionThread ) {
setState( CDebugElementState.SUSPENDED );
setCurrentStateInfo( null );
- if ( getCDIThread().equals( suspensionThread ) ) {
+ final ICDIThread cdiThread = getCDIThread();
+ if ( cdiThread != null && cdiThread.equals( suspensionThread ) ) {
setCurrent( true );
setCurrentStateInfo( reason );
if ( reason instanceof ICDIEndSteppingRange ) {
@@ -1022,6 +1052,10 @@ public class CThread extends CDebugElement implements ICThread, IRestart, IResum
private void syncWithBackend() {
ICDIThread cdiThread = getCDIThread();
+ if (cdiThread == null) {
+ return;
+ }
+
ICDIThread currentThread = null;
try {
currentThread = cdiThread.getTarget().getCurrentThread();