mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-11 02:05:39 +02:00
Implementation of deferred breakpoints.
This commit is contained in:
parent
dab5b46aed
commit
c4517804fd
3 changed files with 208 additions and 4 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2003-08-29 Mikhail Khodjaiants
|
||||||
|
Implementation of deferred breakpoints.
|
||||||
|
* CDebugTarget.java
|
||||||
|
* CThread.java
|
||||||
|
|
||||||
2003-08-29 Mikhail Khodjaiants
|
2003-08-29 Mikhail Khodjaiants
|
||||||
Moving shared library features from mi to CDI.
|
Moving shared library features from mi to CDI.
|
||||||
Added new launch configuration constants to ICDTLaunchConfigurationConstants.
|
Added new launch configuration constants to ICDTLaunchConfigurationConstants.
|
||||||
|
|
|
@ -22,6 +22,7 @@ import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
import org.eclipse.cdt.debug.core.CDebugModel;
|
import org.eclipse.cdt.debug.core.CDebugModel;
|
||||||
import org.eclipse.cdt.debug.core.CDebugUtils;
|
import org.eclipse.cdt.debug.core.CDebugUtils;
|
||||||
import org.eclipse.cdt.debug.core.ICBreakpointManager;
|
import org.eclipse.cdt.debug.core.ICBreakpointManager;
|
||||||
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
import org.eclipse.cdt.debug.core.ICMemoryManager;
|
import org.eclipse.cdt.debug.core.ICMemoryManager;
|
||||||
import org.eclipse.cdt.debug.core.ICRegisterManager;
|
import org.eclipse.cdt.debug.core.ICRegisterManager;
|
||||||
import org.eclipse.cdt.debug.core.ICSharedLibraryManager;
|
import org.eclipse.cdt.debug.core.ICSharedLibraryManager;
|
||||||
|
@ -36,6 +37,7 @@ import org.eclipse.cdt.debug.core.cdi.ICDIErrorInfo;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIExpressionManager;
|
import org.eclipse.cdt.debug.core.cdi.ICDIExpressionManager;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDILocation;
|
import org.eclipse.cdt.debug.core.cdi.ICDILocation;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDISessionObject;
|
import org.eclipse.cdt.debug.core.cdi.ICDISessionObject;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.ICDISharedLibraryEvent;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDISignalReceived;
|
import org.eclipse.cdt.debug.core.cdi.ICDISignalReceived;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIWatchpointScope;
|
import org.eclipse.cdt.debug.core.cdi.ICDIWatchpointScope;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIWatchpointTrigger;
|
import org.eclipse.cdt.debug.core.cdi.ICDIWatchpointTrigger;
|
||||||
|
@ -54,6 +56,7 @@ import org.eclipse.cdt.debug.core.cdi.model.ICDILocationBreakpoint;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDISharedLibrary;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDISharedLibrary;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDISignal;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDISignal;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIThread;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIThread;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIWatchpoint;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIWatchpoint;
|
||||||
|
@ -124,6 +127,28 @@ public class CDebugTarget extends CDebugElement
|
||||||
ILaunchListener,
|
ILaunchListener,
|
||||||
IExpressionListener
|
IExpressionListener
|
||||||
{
|
{
|
||||||
|
public class RunningInfo
|
||||||
|
{
|
||||||
|
private int fType = 0;
|
||||||
|
private int fStackDepth;
|
||||||
|
|
||||||
|
public RunningInfo( int type, int stackDepth )
|
||||||
|
{
|
||||||
|
fType = type;
|
||||||
|
fStackDepth = stackDepth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getType()
|
||||||
|
{
|
||||||
|
return fType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getStackDepth()
|
||||||
|
{
|
||||||
|
return fStackDepth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The type of this target.
|
* The type of this target.
|
||||||
*/
|
*/
|
||||||
|
@ -257,6 +282,8 @@ public class CDebugTarget extends CDebugElement
|
||||||
*/
|
*/
|
||||||
private boolean fSetBreakpoints = true;
|
private boolean fSetBreakpoints = true;
|
||||||
|
|
||||||
|
private RunningInfo fRunningInfo = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for CDebugTarget.
|
* Constructor for CDebugTarget.
|
||||||
* @param target
|
* @param target
|
||||||
|
@ -988,7 +1015,14 @@ public class CDebugTarget extends CDebugElement
|
||||||
}
|
}
|
||||||
else if ( event instanceof ICDISuspendedEvent )
|
else if ( event instanceof ICDISuspendedEvent )
|
||||||
{
|
{
|
||||||
if ( source instanceof ICDITarget || source instanceof ICDIThread )
|
boolean pass = true;
|
||||||
|
if ( source instanceof ICDITarget &&
|
||||||
|
((ICDISuspendedEvent)event).getReason() instanceof ICDISharedLibraryEvent &&
|
||||||
|
applyDeferredBreakpoints() )
|
||||||
|
{
|
||||||
|
pass = handleInternalSuspendedEvent( (ICDISuspendedEvent)event );
|
||||||
|
}
|
||||||
|
if ( pass && (source instanceof ICDITarget || source instanceof ICDIThread) )
|
||||||
{
|
{
|
||||||
handleSuspendedEvent( (ICDISuspendedEvent)event );
|
handleSuspendedEvent( (ICDISuspendedEvent)event );
|
||||||
}
|
}
|
||||||
|
@ -1369,6 +1403,7 @@ public class CDebugTarget extends CDebugElement
|
||||||
setCurrentStateId( IState.SUSPENDED );
|
setCurrentStateId( IState.SUSPENDED );
|
||||||
ICDISessionObject reason = event.getReason();
|
ICDISessionObject reason = event.getReason();
|
||||||
setCurrentStateInfo( reason );
|
setCurrentStateInfo( reason );
|
||||||
|
setRunningInfo( null );
|
||||||
List newThreads = refreshThreads();
|
List newThreads = refreshThreads();
|
||||||
if ( event.getSource() instanceof ICDITarget )
|
if ( event.getSource() instanceof ICDITarget )
|
||||||
{
|
{
|
||||||
|
@ -1411,6 +1446,107 @@ public class CDebugTarget extends CDebugElement
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean handleInternalSuspendedEvent( ICDISuspendedEvent event )
|
||||||
|
{
|
||||||
|
setRetryBreakpoints( true );
|
||||||
|
setBreakpoints();
|
||||||
|
RunningInfo info = getRunningInfo();
|
||||||
|
if ( info != null )
|
||||||
|
{
|
||||||
|
switch( info.getType() )
|
||||||
|
{
|
||||||
|
case ICDIResumedEvent.CONTINUE:
|
||||||
|
return internalResume();
|
||||||
|
case ICDIResumedEvent.STEP_INTO:
|
||||||
|
return internalStepInto( info.getStackDepth() );
|
||||||
|
case ICDIResumedEvent.STEP_OVER:
|
||||||
|
return internalStepOver( info.getStackDepth() );
|
||||||
|
case ICDIResumedEvent.STEP_RETURN:
|
||||||
|
return internalStepReturn( info.getStackDepth() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return internalResume();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean internalResume()
|
||||||
|
{
|
||||||
|
boolean result = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
getCDITarget().resume();
|
||||||
|
}
|
||||||
|
catch( CDIException e )
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean internalStepInto( int oldDepth )
|
||||||
|
{
|
||||||
|
return internalStepOver( oldDepth );
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean internalStepOver( int oldDepth )
|
||||||
|
{
|
||||||
|
boolean result = true;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CThread thread = (CThread)getCurrentThread();
|
||||||
|
if ( thread != null )
|
||||||
|
{
|
||||||
|
int depth = thread.getStackDepth();
|
||||||
|
if ( oldDepth < depth )
|
||||||
|
{
|
||||||
|
ICDIStackFrame[] frames = thread.getCDIStackFrames( depth - oldDepth - 1, depth - oldDepth - 1 );
|
||||||
|
if ( frames.length == 1 )
|
||||||
|
{
|
||||||
|
thread.getCDIThread().setCurrentStackFrame( frames[0] );
|
||||||
|
getCDITarget().stepReturn();
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( CDIException e )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
catch( DebugException e )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean internalStepReturn( int oldDepth )
|
||||||
|
{
|
||||||
|
boolean result = true;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CThread thread = (CThread)getCurrentThread();
|
||||||
|
if ( thread != null )
|
||||||
|
{
|
||||||
|
int depth = thread.getStackDepth();
|
||||||
|
if ( oldDepth < depth )
|
||||||
|
{
|
||||||
|
ICDIStackFrame[] frames = thread.getCDIStackFrames( depth - oldDepth, depth - oldDepth );
|
||||||
|
if ( frames.length == 1 )
|
||||||
|
{
|
||||||
|
thread.getCDIThread().setCurrentStackFrame( frames[0] );
|
||||||
|
getCDITarget().stepReturn();
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( CDIException e )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
catch( DebugException e )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
private void handleResumedEvent( ICDIResumedEvent event )
|
private void handleResumedEvent( ICDIResumedEvent event )
|
||||||
{
|
{
|
||||||
setSuspended( false );
|
setSuspended( false );
|
||||||
|
@ -1436,6 +1572,8 @@ public class CDebugTarget extends CDebugElement
|
||||||
detail = DebugEvent.STEP_RETURN;
|
detail = DebugEvent.STEP_RETURN;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if ( getRunningInfo() == null )
|
||||||
|
setRunningInfo( event.getType() );
|
||||||
fireResumeEvent( detail );
|
fireResumeEvent( detail );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2609,4 +2747,48 @@ public class CDebugTarget extends CDebugElement
|
||||||
CCorePlugin.getWorkspace().removeResourceChangeListener( listener );
|
CCorePlugin.getWorkspace().removeResourceChangeListener( listener );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected RunningInfo getRunningInfo()
|
||||||
|
{
|
||||||
|
return fRunningInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setRunningInfo( RunningInfo info )
|
||||||
|
{
|
||||||
|
fRunningInfo = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setRunningInfo( int type )
|
||||||
|
{
|
||||||
|
RunningInfo info = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CThread thread = (CThread)getCurrentThread();
|
||||||
|
if ( thread != null )
|
||||||
|
{
|
||||||
|
int depth = thread.getLastStackDepth();
|
||||||
|
if ( depth > 0 )
|
||||||
|
{
|
||||||
|
info = new RunningInfo( type, depth );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( DebugException e )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
setRunningInfo( info );
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean applyDeferredBreakpoints()
|
||||||
|
{
|
||||||
|
boolean result = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
result = getLaunch().getLaunchConfiguration().getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_DEFERRED_BREAKPOINTS, false );
|
||||||
|
}
|
||||||
|
catch( CoreException e )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,10 +10,12 @@ import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIConfiguration;
|
import org.eclipse.cdt.debug.core.cdi.ICDIConfiguration;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIEndSteppingRange;
|
import org.eclipse.cdt.debug.core.cdi.ICDIEndSteppingRange;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDISessionObject;
|
import org.eclipse.cdt.debug.core.cdi.ICDISessionObject;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.ICDISharedLibraryEvent;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDISignalReceived;
|
import org.eclipse.cdt.debug.core.cdi.ICDISignalReceived;
|
||||||
import org.eclipse.cdt.debug.core.cdi.event.ICDIChangedEvent;
|
import org.eclipse.cdt.debug.core.cdi.event.ICDIChangedEvent;
|
||||||
import org.eclipse.cdt.debug.core.cdi.event.ICDIDestroyedEvent;
|
import org.eclipse.cdt.debug.core.cdi.event.ICDIDestroyedEvent;
|
||||||
|
@ -36,6 +38,7 @@ import org.eclipse.cdt.debug.core.model.IRunToLine;
|
||||||
import org.eclipse.cdt.debug.core.model.IState;
|
import org.eclipse.cdt.debug.core.model.IState;
|
||||||
import org.eclipse.cdt.debug.core.model.ISwitchToFrame;
|
import org.eclipse.cdt.debug.core.model.ISwitchToFrame;
|
||||||
import org.eclipse.cdt.debug.core.sourcelookup.ISourceMode;
|
import org.eclipse.cdt.debug.core.sourcelookup.ISourceMode;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IAdaptable;
|
import org.eclipse.core.runtime.IAdaptable;
|
||||||
import org.eclipse.debug.core.DebugEvent;
|
import org.eclipse.debug.core.DebugEvent;
|
||||||
import org.eclipse.debug.core.DebugException;
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
@ -425,9 +428,10 @@ public class CThread extends CDebugElement
|
||||||
if ( event instanceof ICDISuspendedEvent )
|
if ( event instanceof ICDISuspendedEvent )
|
||||||
{
|
{
|
||||||
if ( ( source instanceof ICDIThread && getCDIThread().equals( (ICDIThread)source ) ) ||
|
if ( ( source instanceof ICDIThread && getCDIThread().equals( (ICDIThread)source ) ) ||
|
||||||
source instanceof ICDITarget )
|
source instanceof ICDITarget )
|
||||||
{
|
{
|
||||||
handleSuspendedEvent( (ICDISuspendedEvent)event );
|
if ( !(((ICDISuspendedEvent)event).getReason() instanceof ICDISharedLibraryEvent && applyDeferredBreakpoints()) )
|
||||||
|
handleSuspendedEvent( (ICDISuspendedEvent)event );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( event instanceof ICDIResumedEvent )
|
else if ( event instanceof ICDIResumedEvent )
|
||||||
|
@ -1097,7 +1101,7 @@ public class CThread extends CDebugElement
|
||||||
fLastStackDepth = depth;
|
fLastStackDepth = depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getLastStackDepth()
|
protected int getLastStackDepth()
|
||||||
{
|
{
|
||||||
return fLastStackDepth;
|
return fLastStackDepth;
|
||||||
}
|
}
|
||||||
|
@ -1141,4 +1145,17 @@ public class CThread extends CDebugElement
|
||||||
((IResumeWithoutSignal)getDebugTarget()).resumeWithoutSignal();
|
((IResumeWithoutSignal)getDebugTarget()).resumeWithoutSignal();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean applyDeferredBreakpoints()
|
||||||
|
{
|
||||||
|
boolean result = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
result = getLaunch().getLaunchConfiguration().getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_DEFERRED_BREAKPOINTS, false );
|
||||||
|
}
|
||||||
|
catch( CoreException e )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue