mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-09 18:56:02 +02:00
Support for the instruction stepping mode.
This commit is contained in:
parent
437c6840b1
commit
64e6bbf48d
7 changed files with 175 additions and 137 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
2004-05-13 Mikhail Khodjaiants
|
||||||
|
Support for the instruction stepping mode.
|
||||||
|
* ICDebugTarget.java
|
||||||
|
* ISteppingModeTarget.java: new
|
||||||
|
* ITargetProperties.java: new
|
||||||
|
* IInstructionstep.java: deleted
|
||||||
|
* CDebugTarget.java
|
||||||
|
* CThread.java
|
||||||
|
|
||||||
2004-05-06 Mikhail Khodjaiants
|
2004-05-06 Mikhail Khodjaiants
|
||||||
Implementation of mixed disassembly mode.
|
Implementation of mixed disassembly mode.
|
||||||
* IAsmSourceLine.java: new
|
* IAsmSourceLine.java: new
|
||||||
|
|
|
@ -29,7 +29,9 @@ public interface ICDebugTarget extends IDebugTarget,
|
||||||
IState,
|
IState,
|
||||||
ISwitchToThread,
|
ISwitchToThread,
|
||||||
ICDebugElement,
|
ICDebugElement,
|
||||||
IBreakpointTarget {
|
IBreakpointTarget,
|
||||||
|
ISteppingModeTarget,
|
||||||
|
ITargetProperties {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the shared libraries loaded in this debug target. An
|
* Returns the shared libraries loaded in this debug target. An
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
/*
|
|
||||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.eclipse.cdt.debug.core.model;
|
|
||||||
import org.eclipse.debug.core.DebugException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides the ability to step into and over machine instruction
|
|
||||||
* at the current execution location.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public interface IInstructionStep
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Returns whether this element can currently perform a step
|
|
||||||
* into the instruction.
|
|
||||||
*
|
|
||||||
* @return whether this element can currently perform a step
|
|
||||||
* into the instruction
|
|
||||||
*/
|
|
||||||
boolean canStepIntoInstruction();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether this element can currently perform a step
|
|
||||||
* over the instruction (nexti command).
|
|
||||||
*
|
|
||||||
* @return whether this element can currently perform a step
|
|
||||||
* over the instruction
|
|
||||||
*/
|
|
||||||
boolean canStepOverInstruction();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Steps into the current instruction.
|
|
||||||
*
|
|
||||||
* @exception DebugException on failure. Reasons include:<ul>
|
|
||||||
* </ul>
|
|
||||||
*/
|
|
||||||
void stepIntoInstruction() throws DebugException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Steps over the current instruction.
|
|
||||||
*
|
|
||||||
* @exception DebugException on failure. Reasons include:<ul>
|
|
||||||
* </ul>
|
|
||||||
*/
|
|
||||||
void stepOverInstruction() throws DebugException;
|
|
||||||
}
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.core.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Support for the instruction stepping mode for a debug target.
|
||||||
|
*/
|
||||||
|
public interface ISteppingModeTarget {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether this debug target supports instruction stepping.
|
||||||
|
*
|
||||||
|
* @return whether this debug target supports instruction stepping
|
||||||
|
*/
|
||||||
|
boolean supportsInstructionStepping();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether the instruction stepping are enabled in this debug target.
|
||||||
|
*
|
||||||
|
* @param enabled whether the instruction stepping are enabled in this debug target
|
||||||
|
*/
|
||||||
|
void enableInstructionStepping( boolean enabled );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the instruction stepping are currently enabled in this
|
||||||
|
* debug target.
|
||||||
|
*
|
||||||
|
* @return whether the instruction stepping are currently enabled in this
|
||||||
|
* debug target
|
||||||
|
*/
|
||||||
|
boolean isInstructionSteppingEnabled();
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.core.model;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.Preferences;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to the properties of a debug target.
|
||||||
|
*/
|
||||||
|
public interface ITargetProperties {
|
||||||
|
|
||||||
|
public static final String PREF_INSTRUCTION_STEPPING_MODE = "instruction_stepping_mode"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a property change listener to this target.
|
||||||
|
* Has no affect if the identical listener is already registered.
|
||||||
|
*
|
||||||
|
* @param listener a property change listener
|
||||||
|
*/
|
||||||
|
void addPropertyChangeListener( Preferences.IPropertyChangeListener listener );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the given listener from this target.
|
||||||
|
* Has no affect if the listener is not registered.
|
||||||
|
*
|
||||||
|
* @param listener a property change listener
|
||||||
|
*/
|
||||||
|
void removePropertyChangeListener( Preferences.IPropertyChangeListener listener );
|
||||||
|
}
|
|
@ -91,7 +91,9 @@ import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.MultiStatus;
|
import org.eclipse.core.runtime.MultiStatus;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.core.runtime.Preferences;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
|
||||||
import org.eclipse.debug.core.DebugEvent;
|
import org.eclipse.debug.core.DebugEvent;
|
||||||
import org.eclipse.debug.core.DebugException;
|
import org.eclipse.debug.core.DebugException;
|
||||||
import org.eclipse.debug.core.DebugPlugin;
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
@ -279,6 +281,11 @@ public class CDebugTarget extends CDebugElement
|
||||||
|
|
||||||
private RunningInfo fRunningInfo = null;
|
private RunningInfo fRunningInfo = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The target's preference set.
|
||||||
|
*/
|
||||||
|
private Preferences fPreferences = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for CDebugTarget.
|
* Constructor for CDebugTarget.
|
||||||
* @param target
|
* @param target
|
||||||
|
@ -300,6 +307,7 @@ public class CDebugTarget extends CDebugElement
|
||||||
setName( name );
|
setName( name );
|
||||||
setProcess( debuggeeProcess );
|
setProcess( debuggeeProcess );
|
||||||
setCDITarget( cdiTarget );
|
setCDITarget( cdiTarget );
|
||||||
|
initializePreferences();
|
||||||
setExecFile( file );
|
setExecFile( file );
|
||||||
setConfiguration( cdiTarget.getSession().getConfiguration() );
|
setConfiguration( cdiTarget.getSession().getConfiguration() );
|
||||||
setThreadList( new ArrayList( 5 ) );
|
setThreadList( new ArrayList( 5 ) );
|
||||||
|
@ -1249,6 +1257,7 @@ public class CDebugTarget extends CDebugElement
|
||||||
disposeSourceManager();
|
disposeSourceManager();
|
||||||
disposeBreakpointManager();
|
disposeBreakpointManager();
|
||||||
removeAllExpressions();
|
removeAllExpressions();
|
||||||
|
disposePreferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2470,4 +2479,50 @@ public class CDebugTarget extends CDebugElement
|
||||||
public boolean isTargetBreakpoint( ICBreakpoint breakpoint ) {
|
public boolean isTargetBreakpoint( ICBreakpoint breakpoint ) {
|
||||||
return ( getBreakpointManager() != null ) ? getBreakpointManager().isTargetBreakpoint( breakpoint ) : false;
|
return ( getBreakpointManager() != null ) ? getBreakpointManager().isTargetBreakpoint( breakpoint ) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.ISteppingModeTarget#enableInstructionStepping(boolean)
|
||||||
|
*/
|
||||||
|
public void enableInstructionStepping( boolean enabled ) {
|
||||||
|
fPreferences.setValue( PREF_INSTRUCTION_STEPPING_MODE, enabled );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.ISteppingModeTarget#isInstructionSteppingEnabled()
|
||||||
|
*/
|
||||||
|
public boolean isInstructionSteppingEnabled() {
|
||||||
|
return fPreferences.getBoolean( PREF_INSTRUCTION_STEPPING_MODE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.ISteppingModeTarget#supportsInstructionStepping()
|
||||||
|
*/
|
||||||
|
public boolean supportsInstructionStepping() {
|
||||||
|
return getConfiguration().supportsInstructionStepping();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initializePreferences() {
|
||||||
|
fPreferences = new Preferences();
|
||||||
|
fPreferences.setDefault( PREF_INSTRUCTION_STEPPING_MODE, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void disposePreferences() {
|
||||||
|
fPreferences = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.ITargetProperties#addPropertyChangeListener(org.eclipse.core.runtime.Preferences.IPropertyChangeListener)
|
||||||
|
*/
|
||||||
|
public void addPropertyChangeListener( IPropertyChangeListener listener ) {
|
||||||
|
if ( fPreferences!= null )
|
||||||
|
fPreferences.addPropertyChangeListener( listener );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.ITargetProperties#removePropertyChangeListener(org.eclipse.core.runtime.Preferences.IPropertyChangeListener)
|
||||||
|
*/
|
||||||
|
public void removePropertyChangeListener( IPropertyChangeListener listener ) {
|
||||||
|
if ( fPreferences!= null )
|
||||||
|
fPreferences.removePropertyChangeListener( listener );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
import org.eclipse.cdt.debug.core.CDebugUtils;
|
import org.eclipse.cdt.debug.core.CDebugUtils;
|
||||||
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;
|
||||||
|
@ -31,7 +32,6 @@ 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.model.ICDebugElementErrorStatus;
|
import org.eclipse.cdt.debug.core.model.ICDebugElementErrorStatus;
|
||||||
import org.eclipse.cdt.debug.core.model.IDummyStackFrame;
|
import org.eclipse.cdt.debug.core.model.IDummyStackFrame;
|
||||||
import org.eclipse.cdt.debug.core.model.IInstructionStep;
|
|
||||||
import org.eclipse.cdt.debug.core.model.IRestart;
|
import org.eclipse.cdt.debug.core.model.IRestart;
|
||||||
import org.eclipse.cdt.debug.core.model.IResumeWithoutSignal;
|
import org.eclipse.cdt.debug.core.model.IResumeWithoutSignal;
|
||||||
import org.eclipse.cdt.debug.core.model.IRunToLine;
|
import org.eclipse.cdt.debug.core.model.IRunToLine;
|
||||||
|
@ -45,7 +45,6 @@ import org.eclipse.debug.core.DebugPlugin;
|
||||||
import org.eclipse.debug.core.model.IBreakpoint;
|
import org.eclipse.debug.core.model.IBreakpoint;
|
||||||
import org.eclipse.debug.core.model.IStackFrame;
|
import org.eclipse.debug.core.model.IStackFrame;
|
||||||
import org.eclipse.debug.core.model.IThread;
|
import org.eclipse.debug.core.model.IThread;
|
||||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -57,7 +56,6 @@ public class CThread extends CDebugElement
|
||||||
implements IThread,
|
implements IThread,
|
||||||
IState,
|
IState,
|
||||||
IRestart,
|
IRestart,
|
||||||
IInstructionStep,
|
|
||||||
IResumeWithoutSignal,
|
IResumeWithoutSignal,
|
||||||
ISwitchToFrame,
|
ISwitchToFrame,
|
||||||
ICDIEventListener
|
ICDIEventListener
|
||||||
|
@ -608,69 +606,62 @@ public class CThread extends CDebugElement
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.debug.core.model.IStep#stepInto()
|
* @see org.eclipse.debug.core.model.IStep#stepInto()
|
||||||
*/
|
*/
|
||||||
public void stepInto() throws DebugException
|
public void stepInto() throws DebugException {
|
||||||
{
|
|
||||||
if ( !canStepInto() )
|
if ( !canStepInto() )
|
||||||
return;
|
return;
|
||||||
try
|
try {
|
||||||
{
|
if ( !isInstructionsteppingEnabled() ) {
|
||||||
if ( getRealSourceMode() == ISourceMode.MODE_SOURCE )
|
|
||||||
{
|
|
||||||
getCDIThread().stepInto();
|
getCDIThread().stepInto();
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
getCDIThread().stepIntoInstruction();
|
getCDIThread().stepIntoInstruction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( CDIException e )
|
catch( CDIException e ) {
|
||||||
{
|
|
||||||
targetRequestFailed( e.getMessage(), e );
|
targetRequestFailed( e.getMessage(), e );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
* @see org.eclipse.debug.core.model.IStep#stepOver()
|
* @see org.eclipse.debug.core.model.IStep#stepOver()
|
||||||
*/
|
*/
|
||||||
public void stepOver() throws DebugException
|
public void stepOver() throws DebugException {
|
||||||
{
|
|
||||||
if ( !canStepOver() )
|
if ( !canStepOver() )
|
||||||
return;
|
return;
|
||||||
try
|
try {
|
||||||
{
|
if ( !isInstructionsteppingEnabled() ) {
|
||||||
if ( getRealSourceMode() == ISourceMode.MODE_SOURCE )
|
|
||||||
{
|
|
||||||
getCDIThread().stepOver();
|
getCDIThread().stepOver();
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
getCDIThread().stepOverInstruction();
|
getCDIThread().stepOverInstruction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( CDIException e )
|
catch( CDIException e ) {
|
||||||
{
|
|
||||||
targetRequestFailed( e.getMessage(), e );
|
targetRequestFailed( e.getMessage(), e );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
* @see org.eclipse.debug.core.model.IStep#stepReturn()
|
* @see org.eclipse.debug.core.model.IStep#stepReturn()
|
||||||
*/
|
*/
|
||||||
public void stepReturn() throws DebugException
|
public void stepReturn() throws DebugException {
|
||||||
{
|
|
||||||
if ( !canStepReturn() )
|
if ( !canStepReturn() )
|
||||||
return;
|
return;
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
getCDIThread().stepReturn();
|
getCDIThread().stepReturn();
|
||||||
}
|
}
|
||||||
catch( CDIException e )
|
catch( CDIException e ) {
|
||||||
{
|
|
||||||
targetRequestFailed( e.getMessage(), e );
|
targetRequestFailed( e.getMessage(), e );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
* @see org.eclipse.debug.core.model.ITerminate#canTerminate()
|
* @see org.eclipse.debug.core.model.ITerminate#canTerminate()
|
||||||
*/
|
*/
|
||||||
public boolean canTerminate()
|
public boolean canTerminate()
|
||||||
|
@ -838,56 +829,6 @@ public class CThread extends CDebugElement
|
||||||
fCurrentStateInfo = info;
|
fCurrentStateInfo = info;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.debug.core.IInstructionStep#canStepIntoInstruction()
|
|
||||||
*/
|
|
||||||
public boolean canStepIntoInstruction()
|
|
||||||
{
|
|
||||||
return canStepInto();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.debug.core.IInstructionStep#canStepOverInstruction()
|
|
||||||
*/
|
|
||||||
public boolean canStepOverInstruction()
|
|
||||||
{
|
|
||||||
return canStepOver();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.debug.core.IInstructionStep#stepIntoInstruction()
|
|
||||||
*/
|
|
||||||
public void stepIntoInstruction() throws DebugException
|
|
||||||
{
|
|
||||||
if ( !canStepIntoInstruction() )
|
|
||||||
return;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
getCDIThread().stepIntoInstruction();
|
|
||||||
}
|
|
||||||
catch( CDIException e )
|
|
||||||
{
|
|
||||||
targetRequestFailed( e.getMessage(), e );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.debug.core.IInstructionStep#stepOverInstruction()
|
|
||||||
*/
|
|
||||||
public void stepOverInstruction() throws DebugException
|
|
||||||
{
|
|
||||||
if ( !canStepOverInstruction() )
|
|
||||||
return;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
getCDIThread().stepOverInstruction();
|
|
||||||
}
|
|
||||||
catch( CDIException e )
|
|
||||||
{
|
|
||||||
targetRequestFailed( e.getMessage(), e );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void handleSuspendedEvent( ICDISuspendedEvent event )
|
private void handleSuspendedEvent( ICDISuspendedEvent event )
|
||||||
{
|
{
|
||||||
setRunning( false );
|
setRunning( false );
|
||||||
|
@ -1220,4 +1161,8 @@ public class CThread extends CDebugElement
|
||||||
setCurrentStateId( state );
|
setCurrentStateId( state );
|
||||||
setCurrentStateInfo( null );
|
setCurrentStateInfo( null );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isInstructionsteppingEnabled() {
|
||||||
|
return ((CDebugTarget)getDebugTarget()).isInstructionSteppingEnabled();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue