mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Added the implementation of the UI adapters.
This commit is contained in:
parent
385d59ed68
commit
aa3d2c911c
15 changed files with 1952 additions and 32 deletions
|
@ -2,6 +2,7 @@
|
|||
<classpath>
|
||||
<classpathentry kind="src" path="src/"/>
|
||||
<classpathentry kind="src" path="/org.eclipse.core.resources"/>
|
||||
<classpathentry kind="src" path="/org.eclipse.debug.core"/>
|
||||
<classpathentry kind="src" path="/org.eclipse.core.runtime"/>
|
||||
<classpathentry kind="src" path="/org.eclipse.core.boot"/>
|
||||
<classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
|
||||
|
|
|
@ -1,31 +1,32 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>org.eclipse.cdt.debug.core</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
<project>org.eclipse.core.boot</project>
|
||||
<project>org.eclipse.core.resources</project>
|
||||
<project>org.eclipse.core.runtime</project>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.pde.ManifestBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.pde.SchemaBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
<nature>org.eclipse.pde.PluginNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>org.eclipse.cdt.debug.core</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
<project>org.eclipse.core.boot</project>
|
||||
<project>org.eclipse.core.resources</project>
|
||||
<project>org.eclipse.core.runtime</project>
|
||||
<project>org.eclipse.debug.core</project>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.pde.ManifestBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.pde.SchemaBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
<nature>org.eclipse.pde.PluginNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
|
|
|
@ -9,13 +9,21 @@ package org.eclipse.cdt.debug.core;
|
|||
import org.eclipse.core.resources.IWorkspace;
|
||||
import org.eclipse.core.resources.ResourcesPlugin;
|
||||
import org.eclipse.core.runtime.IPluginDescriptor;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.Plugin;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
import org.eclipse.debug.core.DebugException;
|
||||
|
||||
/**
|
||||
* The main plugin class to be used in the desktop.
|
||||
*/
|
||||
public class CDebugCorePlugin extends Plugin
|
||||
{
|
||||
/**
|
||||
* Status code indicating an unexpected internal error.
|
||||
*/
|
||||
public static final int INTERNAL_ERROR = 1000;
|
||||
|
||||
//The shared instance.
|
||||
private static CDebugCorePlugin plugin;
|
||||
|
||||
|
@ -30,6 +38,8 @@ public class CDebugCorePlugin extends Plugin
|
|||
|
||||
/**
|
||||
* Returns the shared instance.
|
||||
*
|
||||
* @return the shared instance
|
||||
*/
|
||||
public static CDebugCorePlugin getDefault()
|
||||
{
|
||||
|
@ -38,9 +48,60 @@ public class CDebugCorePlugin extends Plugin
|
|||
|
||||
/**
|
||||
* Returns the workspace instance.
|
||||
*
|
||||
* @return the workspace instance
|
||||
*/
|
||||
public static IWorkspace getWorkspace()
|
||||
{
|
||||
return ResourcesPlugin.getWorkspace();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method which returns the unique identifier of this plugin.
|
||||
*
|
||||
* @return the unique identifier of this plugin
|
||||
*/
|
||||
public static String getUniqueIdentifier()
|
||||
{
|
||||
if ( getDefault() == null )
|
||||
{
|
||||
// If the default instance is not yet initialized,
|
||||
// return a static identifier. This identifier must
|
||||
// match the plugin id defined in plugin.xml
|
||||
return "org.eclipse.cdt.debug.core"; //$NON-NLS-1$
|
||||
}
|
||||
return getDefault().getDescriptor().getUniqueIdentifier();
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs the specified throwable with this plug-in's log.
|
||||
*
|
||||
* @param t throwable to log
|
||||
*/
|
||||
public static void log( Throwable t )
|
||||
{
|
||||
Throwable top = t;
|
||||
if ( t instanceof DebugException )
|
||||
{
|
||||
DebugException de = (DebugException)t;
|
||||
IStatus status = de.getStatus();
|
||||
if ( status.getException() != null )
|
||||
{
|
||||
top = status.getException();
|
||||
}
|
||||
}
|
||||
// this message is intentionally not internationalized, as an exception may
|
||||
// be due to the resource bundle itself
|
||||
log( new Status( IStatus.ERROR, getUniqueIdentifier(), INTERNAL_ERROR, "Internal error logged from CDI Debug: ", top ) ); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs the specified status with this plug-in's log.
|
||||
*
|
||||
* @param status status to log
|
||||
*/
|
||||
public static void log( IStatus status )
|
||||
{
|
||||
getDefault().getLog().log( status );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.eclipse.cdt.debug.core;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* Provides utility methods for creating debug sessions, targets and
|
||||
* breakpoints specific to the CDI debug model.
|
||||
*
|
||||
* @since Aug 1, 2002
|
||||
*/
|
||||
public class CDebugModel
|
||||
{
|
||||
/**
|
||||
* Constructor for CDebugModel.
|
||||
*/
|
||||
public CDebugModel()
|
||||
{
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the identifier for the CDI debug model plug-in
|
||||
*
|
||||
* @return plugin identifier
|
||||
*/
|
||||
public static String getPluginIdentifier()
|
||||
{
|
||||
return CDebugCorePlugin.getUniqueIdentifier();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
package org.eclipse.cdt.debug.core;
|
||||
|
||||
import org.eclipse.debug.core.DebugException;
|
||||
import org.eclipse.debug.core.model.IDebugElement;
|
||||
|
||||
/**
|
||||
*
|
||||
* A contiguos segment of memory in an execution context represented
|
||||
* as a table of values.
|
||||
*
|
||||
* @since Jul 31, 2002
|
||||
*/
|
||||
public interface IFormattedMemoryBlock extends IDebugElement
|
||||
{
|
||||
/**
|
||||
* Returns the start address of this memory block.
|
||||
*
|
||||
* @return the start address of this memory block
|
||||
*/
|
||||
long getStartAddress();
|
||||
|
||||
/**
|
||||
* Returns the format of the memory words of this block.
|
||||
*
|
||||
* @return The format of the memory words of this block
|
||||
*/
|
||||
int getFormat();
|
||||
|
||||
/**
|
||||
* Returns the size of each memory word in bytes.
|
||||
*
|
||||
* @return the size of each memory word in bytes
|
||||
*/
|
||||
int getWordSize();
|
||||
|
||||
/**
|
||||
* Returns the number of rows in the output table.
|
||||
*
|
||||
* @return the number of rows in the output table
|
||||
*/
|
||||
int getNumberOfRows();
|
||||
|
||||
/**
|
||||
* Returns the number of columns in the output table.
|
||||
*
|
||||
* @return the number of columns in the output table
|
||||
*/
|
||||
int getNumberOfColumns();
|
||||
|
||||
/**
|
||||
* Returns whether each row should include an ASCII dump.
|
||||
*
|
||||
* @return whether each row should include an ASCII dump
|
||||
*/
|
||||
boolean displayASCII();
|
||||
|
||||
/**
|
||||
* Returns the array of rows.
|
||||
*
|
||||
* @return the array of rows
|
||||
*/
|
||||
IFormattedMemoryBlockRow[] getRows();
|
||||
|
||||
long nextRowAddress();
|
||||
|
||||
long previousRowAddress();
|
||||
|
||||
long nextPageAddress();
|
||||
|
||||
long previousPageAddress();
|
||||
|
||||
void reformat( long startAddress,
|
||||
int format,
|
||||
int wordSize,
|
||||
int numberOfRows,
|
||||
int numberOfColumns ) throws DebugException;
|
||||
|
||||
void reformat( long startAddress,
|
||||
int format,
|
||||
int wordSize,
|
||||
int numberOfRows,
|
||||
int numberOfColumns,
|
||||
char paddingChar ) throws DebugException;
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.eclipse.cdt.debug.core;
|
||||
|
||||
/**
|
||||
*
|
||||
* Represents a row in the output table of formatted memory block.
|
||||
*
|
||||
* @since Jul 31, 2002
|
||||
*/
|
||||
public interface IFormattedMemoryBlockRow
|
||||
{
|
||||
/**
|
||||
* Returns the address of this row.
|
||||
*
|
||||
* @return the address of this row
|
||||
*/
|
||||
long getAddress();
|
||||
|
||||
/**
|
||||
* Returns the array of memory words.
|
||||
*
|
||||
* @return the array of memory words
|
||||
*/
|
||||
String[] getData();
|
||||
|
||||
/**
|
||||
* Returns the ASCII dump for this row.
|
||||
*
|
||||
* @return the ASCII dump for this row
|
||||
*/
|
||||
String getASCII();
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
package org.eclipse.cdt.debug.core;
|
||||
|
||||
import org.eclipse.debug.core.DebugException;
|
||||
|
||||
/**
|
||||
*
|
||||
* Supports the retrieval of formatted blocks of memory.
|
||||
*
|
||||
* @since Jul 31, 2002
|
||||
*/
|
||||
public interface IFormattedMemoryRetrieval
|
||||
{
|
||||
public static final int MEMORY_SIZE_BYTE = 1;
|
||||
public static final int MEMORY_SIZE_HALF_WORD = 2;
|
||||
public static final int MEMORY_SIZE_WORD = 4;
|
||||
public static final int MEMORY_SIZE_DOUBLE_WORD = 8;
|
||||
public static final int MEMORY_SIZE_FLOAT = 8;
|
||||
public static final int MEMORY_SIZE_DOUBLE_FLOAT = 16;
|
||||
|
||||
public static final int MEMORY_FORMAT_HEX = 0;
|
||||
public static final int MEMORY_FORMAT_BINARY = 1;
|
||||
public static final int MEMORY_FORMAT_OCTAL = 2;
|
||||
public static final int MEMORY_FORMAT_SIGNED_DECIMAL = 3;
|
||||
public static final int MEMORY_FORMAT_UNSIGNED_DECIMAL = 4;
|
||||
|
||||
public static final int MEMORY_BYTES_PER_ROW_4 = 4;
|
||||
public static final int MEMORY_BYTES_PER_ROW_8 = 8;
|
||||
public static final int MEMORY_BYTES_PER_ROW_16 = 16;
|
||||
public static final int MEMORY_BYTES_PER_ROW_32 = 32;
|
||||
public static final int MEMORY_BYTES_PER_ROW_64 = 64;
|
||||
public static final int MEMORY_BYTES_PER_ROW_128 = 128;
|
||||
|
||||
int[] getSupportedFormats() throws DebugException;
|
||||
|
||||
IFormattedMemoryBlock getFormattedMemoryBlock( long startAddress,
|
||||
int format,
|
||||
int wordSize,
|
||||
int numberOfRows,
|
||||
int numberOfColumns ) throws DebugException;
|
||||
|
||||
IFormattedMemoryBlock getFormattedMemoryBlock( long startAddress,
|
||||
int format,
|
||||
int wordSize,
|
||||
int numberOfRows,
|
||||
int numberOfColumns,
|
||||
char paddingChar ) throws DebugException;
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.eclipse.cdt.debug.core;
|
||||
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,30 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.eclipse.cdt.debug.core;
|
||||
|
||||
import org.eclipse.debug.core.DebugException;
|
||||
/**
|
||||
* Provides the ability to restart a debug target.
|
||||
*
|
||||
*/
|
||||
public interface IRestart
|
||||
{
|
||||
/**
|
||||
* Returns whether this element can currently be restarted.
|
||||
*
|
||||
* @return whether this element can currently be restarted
|
||||
*/
|
||||
public boolean canRestart();
|
||||
|
||||
/**
|
||||
* Causes this element to restart its execution.
|
||||
*
|
||||
* @exception DebugException on failure. Reasons include:
|
||||
*/
|
||||
public void restart() throws DebugException;
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.eclipse.cdt.debug.core;
|
||||
|
||||
/**
|
||||
*
|
||||
* Represents the current state of debug element.
|
||||
*
|
||||
* @since Aug 6, 2002
|
||||
*/
|
||||
public interface IState
|
||||
{
|
||||
public static final int UNKNOWN = 0;
|
||||
public static final int NOT_RESPONDING = 1;
|
||||
public static final int STARTING = 2;
|
||||
public static final int ATTACHING = 3;
|
||||
public static final int DISCONNECTING = 4;
|
||||
public static final int RUNNING = 5;
|
||||
public static final int STEPPING = 6;
|
||||
public static final int SUSPENDED = 7;
|
||||
public static final int EXITED = 8;
|
||||
public static final int DISCONNECTED = 9;
|
||||
public static final int TERMINATED = 10;
|
||||
public static final int CORE_DUMP_FILE = 11;
|
||||
|
||||
int getCurrentState();
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.eclipse.cdt.debug.core.cdi.model;
|
||||
|
||||
/**
|
||||
*
|
||||
* Represents an argument in the stack frame.
|
||||
*
|
||||
* @since Jul 22, 2002
|
||||
*/
|
||||
public interface ICArgument extends ICVariable
|
||||
{
|
||||
}
|
|
@ -61,7 +61,7 @@ public interface ICTarget extends ICObject
|
|||
* @throws CDIException if this method fails. Reasons include:
|
||||
*/
|
||||
ICSharedLibrary[] getSharedLibraries() throws CDIException;
|
||||
|
||||
|
||||
/**
|
||||
* Returns the threads contained in this target.
|
||||
* An empty collection is returned if this target contains no
|
||||
|
|
|
@ -0,0 +1,246 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.eclipse.cdt.debug.internal.core;
|
||||
|
||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||
import org.eclipse.cdt.debug.core.CDebugModel;
|
||||
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||
import org.eclipse.cdt.debug.core.cdi.ICSession;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.ICTarget;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.PlatformObject;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
import org.eclipse.debug.core.DebugEvent;
|
||||
import org.eclipse.debug.core.DebugException;
|
||||
import org.eclipse.debug.core.DebugPlugin;
|
||||
import org.eclipse.debug.core.ILaunch;
|
||||
import org.eclipse.debug.core.model.IDebugElement;
|
||||
import org.eclipse.debug.core.model.IDebugTarget;
|
||||
|
||||
/**
|
||||
*
|
||||
* Enter type comment.
|
||||
*
|
||||
* @since Aug 1, 2002
|
||||
*/
|
||||
public class CDebugElement extends PlatformObject
|
||||
implements IDebugElement
|
||||
{
|
||||
private CDebugTarget fDebugTarget;
|
||||
|
||||
/**
|
||||
* Constructor for CDebugElement.
|
||||
*/
|
||||
public CDebugElement( CDebugTarget target )
|
||||
{
|
||||
setDebugTarget( target );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
|
||||
*/
|
||||
public String getModelIdentifier()
|
||||
{
|
||||
return CDebugModel.getPluginIdentifier();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
|
||||
*/
|
||||
public IDebugTarget getDebugTarget()
|
||||
{
|
||||
return fDebugTarget;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
|
||||
*/
|
||||
public ILaunch getLaunch()
|
||||
{
|
||||
return getDebugTarget().getLaunch();
|
||||
}
|
||||
|
||||
protected void setDebugTarget( CDebugTarget target )
|
||||
{
|
||||
fDebugTarget = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs the given exception.
|
||||
*
|
||||
* @param e the internal exception
|
||||
*/
|
||||
public void internalError( Exception e )
|
||||
{
|
||||
logError( e );
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method to log errors
|
||||
*
|
||||
*/
|
||||
protected void logError( Exception e )
|
||||
{
|
||||
CDebugCorePlugin.log( e );
|
||||
}
|
||||
|
||||
/**
|
||||
* Fires a debug event
|
||||
*
|
||||
* @param event The debug event to be fired to the listeners
|
||||
* @see org.eclipse.debug.core.DebugEvent
|
||||
*/
|
||||
protected void fireEvent(DebugEvent event)
|
||||
{
|
||||
DebugPlugin.getDefault().fireDebugEventSet( new DebugEvent[] { event } );
|
||||
}
|
||||
|
||||
/**
|
||||
* Fires a debug event marking the creation of this element.
|
||||
*/
|
||||
protected void fireCreationEvent()
|
||||
{
|
||||
fireEvent( new DebugEvent( this, DebugEvent.CREATE ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Fires a debug event marking the RESUME of this element with
|
||||
* the associated detail.
|
||||
*
|
||||
* @param detail The int detail of the event
|
||||
* @see org.eclipse.debug.core.DebugEvent
|
||||
*/
|
||||
public void fireResumeEvent( int detail )
|
||||
{
|
||||
fireEvent( new DebugEvent( this, DebugEvent.RESUME, detail ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Fires a debug event marking the SUSPEND of this element with
|
||||
* the associated detail.
|
||||
*
|
||||
* @param detail The int detail of the event
|
||||
* @see org.eclipse.debug.core.DebugEvent
|
||||
*/
|
||||
public void fireSuspendEvent( int detail )
|
||||
{
|
||||
fireEvent( new DebugEvent( this, DebugEvent.SUSPEND, detail ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Fires a debug event marking the termination of this element.
|
||||
*/
|
||||
protected void fireTerminateEvent()
|
||||
{
|
||||
fireEvent( new DebugEvent( this, DebugEvent.TERMINATE ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Fires a debug event marking the CHANGE of this element
|
||||
* with the specifed detail code.
|
||||
*
|
||||
* @param detail one of <code>STATE</code> or <code>CONTENT</code>
|
||||
*/
|
||||
public void fireChangeEvent( int detail )
|
||||
{
|
||||
fireEvent( new DebugEvent( this, DebugEvent.CHANGE, detail ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the CDI session associated with this element.
|
||||
*
|
||||
* @return the CDI session
|
||||
*/
|
||||
public ICSession getCDISession()
|
||||
{
|
||||
return getCDITarget().getSession();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the underlying CDI target associated with this element.
|
||||
*
|
||||
* @return the underlying CDI target
|
||||
*/
|
||||
public ICTarget getCDITarget()
|
||||
{
|
||||
return (ICTarget)getDebugTarget().getAdapter( ICTarget.class );
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws a new debug exception with a status code of <code>REQUEST_FAILED</code>.
|
||||
*
|
||||
* @param message Failure message
|
||||
* @param e Exception that has occurred (<code>can be null</code>)
|
||||
* @throws DebugException The exception with a status code of <code>REQUEST_FAILED</code>
|
||||
*/
|
||||
public void requestFailed( String message, Exception e ) throws DebugException
|
||||
{
|
||||
requestFailed( message, e, DebugException.REQUEST_FAILED );
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws a new debug exception with a status code of <code>TARGET_REQUEST_FAILED</code>
|
||||
* with the given underlying exception. If the underlying exception is not a JDI
|
||||
* exception, the original exception is thrown.
|
||||
*
|
||||
* @param message Failure message
|
||||
* @param e underlying exception that has occurred
|
||||
* @throws DebugException The exception with a status code of <code>TARGET_REQUEST_FAILED</code>
|
||||
*/
|
||||
public void targetRequestFailed( String message, CDIException e ) throws DebugException
|
||||
{
|
||||
requestFailed( message, e, DebugException.TARGET_REQUEST_FAILED );
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws a new debug exception with the given status code.
|
||||
*
|
||||
* @param message Failure message
|
||||
* @param e Exception that has occurred (<code>can be null</code>)
|
||||
* @param code status code
|
||||
* @throws DebugException a new exception with given status code
|
||||
*/
|
||||
public void requestFailed( String message, Throwable e, int code ) throws DebugException
|
||||
{
|
||||
throwDebugException( message, code, e );
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws a new debug exception with a status code of <code>TARGET_REQUEST_FAILED</code>.
|
||||
*
|
||||
* @param message Failure message
|
||||
* @param e Throwable that has occurred
|
||||
* @throws DebugException The exception with a status code of <code>TARGET_REQUEST_FAILED</code>
|
||||
*/
|
||||
public void targetRequestFailed( String message, Throwable e ) throws DebugException
|
||||
{
|
||||
throwDebugException( message, DebugException.TARGET_REQUEST_FAILED, e );
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws a new debug exception with a status code of <code>NOT_SUPPORTED</code>.
|
||||
*
|
||||
* @param message Failure message
|
||||
* @throws DebugException The exception with a status code of <code>NOT_SUPPORTED</code>.
|
||||
*/
|
||||
public void notSupported(String message) throws DebugException {
|
||||
throwDebugException(message, DebugException.NOT_SUPPORTED, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws a debug exception with the given message, error code, and underlying
|
||||
* exception.
|
||||
*/
|
||||
protected void throwDebugException( String message, int code, Throwable exception ) throws DebugException
|
||||
{
|
||||
throw new DebugException( new Status( IStatus.ERROR,
|
||||
CDebugModel.getPluginIdentifier(),
|
||||
code,
|
||||
message,
|
||||
exception ) );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,985 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
package org.eclipse.cdt.debug.internal.core;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.debug.core.CDebugModel;
|
||||
import org.eclipse.cdt.debug.core.IFormattedMemoryBlock;
|
||||
import org.eclipse.cdt.debug.core.IFormattedMemoryRetrieval;
|
||||
import org.eclipse.cdt.debug.core.IInstructionStep;
|
||||
import org.eclipse.cdt.debug.core.IRestart;
|
||||
import org.eclipse.cdt.debug.core.IState;
|
||||
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||
import org.eclipse.cdt.debug.core.cdi.ICBreakpoint;
|
||||
import org.eclipse.cdt.debug.core.cdi.ICEndSteppingRange;
|
||||
import org.eclipse.cdt.debug.core.cdi.ICSession;
|
||||
import org.eclipse.cdt.debug.core.cdi.ICSessionObject;
|
||||
import org.eclipse.cdt.debug.core.cdi.ICSignal;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICChangedEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICCreatedEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICDisconnectedEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICEventListener;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICExitedEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICLoadedEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICRestartedEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICResumedEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICSteppingEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICSuspendedEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICTerminatedEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.ICObject;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.ICTarget;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.ICThread;
|
||||
import org.eclipse.core.resources.IMarkerDelta;
|
||||
import org.eclipse.debug.core.DebugEvent;
|
||||
import org.eclipse.debug.core.DebugException;
|
||||
import org.eclipse.debug.core.DebugPlugin;
|
||||
import org.eclipse.debug.core.IBreakpointManager;
|
||||
import org.eclipse.debug.core.ILaunch;
|
||||
import org.eclipse.debug.core.ILaunchListener;
|
||||
import org.eclipse.debug.core.model.IBreakpoint;
|
||||
import org.eclipse.debug.core.model.IDebugTarget;
|
||||
import org.eclipse.debug.core.model.IMemoryBlock;
|
||||
import org.eclipse.debug.core.model.IProcess;
|
||||
import org.eclipse.debug.core.model.IThread;
|
||||
|
||||
/**
|
||||
*
|
||||
* Enter type comment.
|
||||
*
|
||||
* @since Aug 1, 2002
|
||||
*/
|
||||
public class CDebugTarget extends CDebugElement
|
||||
implements IDebugTarget,
|
||||
ICEventListener,
|
||||
IRestart,
|
||||
IInstructionStep,
|
||||
IFormattedMemoryRetrieval,
|
||||
IState,
|
||||
ILaunchListener
|
||||
{
|
||||
/**
|
||||
* Threads contained in this debug target. When a thread
|
||||
* starts it is added to the list. When a thread ends it
|
||||
* is removed from the list.
|
||||
*/
|
||||
private ArrayList fThreads;
|
||||
|
||||
/**
|
||||
* Associated system process, or <code>null</code> if not available.
|
||||
*/
|
||||
private IProcess fProcess;
|
||||
|
||||
/**
|
||||
* Underlying CDI target.
|
||||
*/
|
||||
private ICTarget fCDITarget;
|
||||
|
||||
/**
|
||||
* The name of this target.
|
||||
*/
|
||||
private String fName;
|
||||
|
||||
/**
|
||||
* Whether this target is suspended.
|
||||
*/
|
||||
private boolean fSuspended = true;
|
||||
|
||||
/**
|
||||
* Whether terminated
|
||||
*/
|
||||
private boolean fTerminated;
|
||||
|
||||
/**
|
||||
* Whether in the process of terminating
|
||||
*/
|
||||
private boolean fTerminating;
|
||||
|
||||
/**
|
||||
* Whether disconnected
|
||||
*/
|
||||
private boolean fDisconnected;
|
||||
|
||||
/**
|
||||
* Whether the target should be resumed on startup
|
||||
*/
|
||||
private boolean fResumeOnStartup = false;
|
||||
|
||||
/**
|
||||
* The launch this target is contained in
|
||||
*/
|
||||
private ILaunch fLaunch;
|
||||
|
||||
/**
|
||||
* Whether terminate is supported.
|
||||
*/
|
||||
private boolean fSupportsTerminate;
|
||||
|
||||
/**
|
||||
* Whether disconnect is supported.
|
||||
*/
|
||||
private boolean fSupportsDisconnect;
|
||||
|
||||
/**
|
||||
* Constructor for CDebugTarget.
|
||||
* @param target
|
||||
*/
|
||||
public CDebugTarget( ILaunch launch,
|
||||
ICTarget cdiTarget,
|
||||
String name,
|
||||
IProcess process,
|
||||
boolean resume )
|
||||
{
|
||||
super( null );
|
||||
setLaunch( launch );
|
||||
setDebugTarget( this );
|
||||
setName( name );
|
||||
setProcess( process );
|
||||
setCDITarget( cdiTarget );
|
||||
setThreadList( new ArrayList( 5 ) );
|
||||
initialize();
|
||||
DebugPlugin.getDefault().getLaunchManager().addLaunchListener( this );
|
||||
getCDISession().getEventManager().addEventListener( this );
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize state from the underlying debug session.
|
||||
*
|
||||
*/
|
||||
protected void initialize()
|
||||
{
|
||||
initializeState();
|
||||
initializeBreakpoints();
|
||||
getLaunch().addDebugTarget( this );
|
||||
fireCreationEvent();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds all of the pre-existing threads to this debug target.
|
||||
*/
|
||||
protected void initializeState()
|
||||
{
|
||||
ICThread[] threads = new ICThread[0];
|
||||
try
|
||||
{
|
||||
threads = getCDITarget().getThreads();
|
||||
}
|
||||
catch( CDIException e )
|
||||
{
|
||||
internalError( e );
|
||||
}
|
||||
for ( int i = 0; i < threads.length; ++i )
|
||||
createRunningThread( threads[i] );
|
||||
|
||||
if ( isResumeOnStartup() )
|
||||
{
|
||||
setSuspended( false );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Installs all C/C++ breakpoints that currently exist in
|
||||
* the breakpoint manager.
|
||||
*
|
||||
*/
|
||||
protected void initializeBreakpoints()
|
||||
{
|
||||
IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager();
|
||||
manager.addBreakpointListener( this );
|
||||
IBreakpoint[] bps = (IBreakpoint[])manager.getBreakpoints( CDebugModel.getPluginIdentifier() );
|
||||
for ( int i = 0; i < bps.length; i++ )
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IDebugTarget#getProcess()
|
||||
*/
|
||||
public IProcess getProcess()
|
||||
{
|
||||
return fProcess;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the process associated with this debug target,
|
||||
* possibly <code>null</code>. Set on creation.
|
||||
*
|
||||
* @param process the system process associated with the
|
||||
* underlying CDI target, or <code>null</code> if no process is
|
||||
* associated with this debug target (for example, a core dump debugging).
|
||||
*/
|
||||
protected void setProcess( IProcess process )
|
||||
{
|
||||
fProcess = process;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IDebugTarget#getThreads()
|
||||
*/
|
||||
public IThread[] getThreads()
|
||||
{
|
||||
List threads = getThreadList();
|
||||
return (IThread[])threads.toArray( new IThread[threads.size()] );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IDebugTarget#hasThreads()
|
||||
*/
|
||||
public boolean hasThreads() throws DebugException
|
||||
{
|
||||
return getThreadList().size() > 0;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IDebugTarget#getName()
|
||||
*/
|
||||
public String getName() throws DebugException
|
||||
{
|
||||
return fName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the name of this debug target.
|
||||
*
|
||||
* @param name the name of this debug target
|
||||
*/
|
||||
protected void setName( String name )
|
||||
{
|
||||
fName = name;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IDebugTarget#supportsBreakpoint(IBreakpoint)
|
||||
*/
|
||||
public boolean supportsBreakpoint( IBreakpoint breakpoint )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.ILaunchListener#launchRemoved(ILaunch)
|
||||
*/
|
||||
public void launchRemoved( ILaunch launch )
|
||||
{
|
||||
if ( !isAvailable() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( launch.equals( getLaunch() ) )
|
||||
{
|
||||
// This target has been deregistered, but it hasn't successfully terminated.
|
||||
// Update internal state to reflect that it is disconnected
|
||||
disconnected();
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.ILaunchListener#launchAdded(ILaunch)
|
||||
*/
|
||||
public void launchAdded( ILaunch launch )
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.ILaunchListener#launchChanged(ILaunch)
|
||||
*/
|
||||
public void launchChanged( ILaunch launch )
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ITerminate#canTerminate()
|
||||
*/
|
||||
public boolean canTerminate()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ITerminate#isTerminated()
|
||||
*/
|
||||
public boolean isTerminated()
|
||||
{
|
||||
return fTerminated;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ITerminate#terminate()
|
||||
*/
|
||||
public void terminate() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether this debug target is terminated
|
||||
*
|
||||
* @param terminated <code>true</code> if this debug
|
||||
* target is terminated, otherwise <code>false</code>
|
||||
*/
|
||||
protected void setTerminated( boolean terminated )
|
||||
{
|
||||
fTerminated = terminated;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ISuspendResume#canResume()
|
||||
*/
|
||||
public boolean canResume()
|
||||
{
|
||||
return isSuspended() && isAvailable();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
|
||||
*/
|
||||
public boolean canSuspend()
|
||||
{
|
||||
if ( !isSuspended() && isAvailable() )
|
||||
{
|
||||
// only allow suspend if no threads are currently suspended
|
||||
IThread[] threads = getThreads();
|
||||
for ( int i = 0; i < threads.length; i++ )
|
||||
{
|
||||
if ( threads[i].isSuspended() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
|
||||
*/
|
||||
public boolean isSuspended()
|
||||
{
|
||||
return fSuspended;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ISuspendResume#resume()
|
||||
*/
|
||||
public void resume() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ISuspendResume#suspend()
|
||||
*/
|
||||
public void suspend() throws DebugException
|
||||
{
|
||||
if ( isSuspended() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
setSuspended( true );
|
||||
fireSuspendEvent( DebugEvent.CLIENT_REQUEST );
|
||||
getCDITarget().suspend();
|
||||
suspendThreads();
|
||||
}
|
||||
catch( CDIException e )
|
||||
{
|
||||
setSuspended( false );
|
||||
fireResumeEvent( DebugEvent.CLIENT_REQUEST );
|
||||
targetRequestFailed( MessageFormat.format( "{0} occurred suspending target.", new String[] { e.toString()} ), e );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies threads that they have been suspended.
|
||||
*
|
||||
*/
|
||||
protected void suspendThreads()
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.IBreakpointListener#breakpointAdded(IBreakpoint)
|
||||
*/
|
||||
public void breakpointAdded( IBreakpoint breakpoint )
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.IBreakpointListener#breakpointRemoved(IBreakpoint, IMarkerDelta)
|
||||
*/
|
||||
public void breakpointRemoved( IBreakpoint breakpoint, IMarkerDelta delta )
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.IBreakpointListener#breakpointChanged(IBreakpoint, IMarkerDelta)
|
||||
*/
|
||||
public void breakpointChanged( IBreakpoint breakpoint, IMarkerDelta delta )
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IDisconnect#canDisconnect()
|
||||
*/
|
||||
public boolean canDisconnect()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IDisconnect#disconnect()
|
||||
*/
|
||||
public void disconnect() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IDisconnect#isDisconnected()
|
||||
*/
|
||||
public boolean isDisconnected()
|
||||
{
|
||||
return fDisconnected;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether this debug target is disconnected
|
||||
*
|
||||
* @param disconnected <code>true</code> if this debug
|
||||
* target is disconnected, otherwise <code>false</code>
|
||||
*/
|
||||
protected void setDisconnected( boolean disconnected )
|
||||
{
|
||||
fDisconnected = disconnected;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IMemoryBlockRetrieval#supportsStorageRetrieval()
|
||||
*/
|
||||
public boolean supportsStorageRetrieval()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IMemoryBlockRetrieval#getMemoryBlock(long, long)
|
||||
*/
|
||||
public IMemoryBlock getMemoryBlock( long startAddress, long length ) throws DebugException
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
|
||||
*/
|
||||
public ILaunch getLaunch()
|
||||
{
|
||||
return fLaunch;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the launch this target is contained in
|
||||
*
|
||||
* @param launch the launch this target is contained in
|
||||
*/
|
||||
private void setLaunch( ILaunch launch )
|
||||
{
|
||||
fLaunch = launch;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of threads contained in this debug target.
|
||||
*
|
||||
* @return list of threads
|
||||
*/
|
||||
protected ArrayList getThreadList()
|
||||
{
|
||||
return fThreads;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the list of threads contained in this debug target.
|
||||
* Set to an empty collection on creation. Threads are
|
||||
* added and removed as they start and end. On termination
|
||||
* this collection is set to the immutable singleton empty list.
|
||||
*
|
||||
* @param threads empty list
|
||||
*/
|
||||
private void setThreadList( ArrayList threads )
|
||||
{
|
||||
fThreads = threads;
|
||||
}
|
||||
|
||||
private void setCDITarget( ICTarget cdiTarget )
|
||||
{
|
||||
fCDITarget = cdiTarget;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see IAdaptable#getAdapter(Class)
|
||||
*/
|
||||
public Object getAdapter( Class adapter )
|
||||
{
|
||||
if ( adapter.equals( IDebugTarget.class ) )
|
||||
return this;
|
||||
if ( adapter.equals( ICTarget.class ) )
|
||||
return fCDITarget;
|
||||
return super.getAdapter( adapter );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.cdi.event.ICEventListener#handleDebugEvent(ICEvent)
|
||||
*/
|
||||
public void handleDebugEvent( ICEvent event )
|
||||
{
|
||||
ICObject source = event.getSource();
|
||||
if ( source.getCDITarget().equals( this ) )
|
||||
{
|
||||
if ( event instanceof ICCreatedEvent )
|
||||
{
|
||||
if ( source instanceof ICThread )
|
||||
{
|
||||
handleThreadCreatedEvent( (ICCreatedEvent)event );
|
||||
}
|
||||
}
|
||||
else if ( event instanceof ICSuspendedEvent )
|
||||
{
|
||||
if ( source instanceof ICTarget )
|
||||
{
|
||||
handleSuspendedEvent( (ICSuspendedEvent)event );
|
||||
}
|
||||
}
|
||||
else if ( event instanceof ICResumedEvent )
|
||||
{
|
||||
if ( source instanceof ICTarget )
|
||||
{
|
||||
handleResumedEvent( (ICResumedEvent)event );
|
||||
}
|
||||
}
|
||||
else if ( event instanceof ICExitedEvent )
|
||||
{
|
||||
if ( source instanceof ICTarget )
|
||||
{
|
||||
handleExitedEvent( (ICExitedEvent)event );
|
||||
}
|
||||
}
|
||||
else if ( event instanceof ICTerminatedEvent )
|
||||
{
|
||||
if ( source instanceof ICTarget )
|
||||
{
|
||||
handleTerminatedEvent( (ICTerminatedEvent)event );
|
||||
}
|
||||
else if ( source instanceof ICThread )
|
||||
{
|
||||
handleThreadTerminatedEvent( (ICTerminatedEvent)event );
|
||||
}
|
||||
}
|
||||
else if ( event instanceof ICDisconnectedEvent )
|
||||
{
|
||||
if ( source instanceof ICTarget )
|
||||
{
|
||||
handleDisconnectedEvent( (ICDisconnectedEvent)event );
|
||||
}
|
||||
}
|
||||
else if ( event instanceof ICChangedEvent )
|
||||
{
|
||||
if ( source instanceof ICTarget )
|
||||
{
|
||||
handleChangedEvent( (ICChangedEvent)event );
|
||||
}
|
||||
}
|
||||
else if ( event instanceof ICLoadedEvent )
|
||||
{
|
||||
if ( source instanceof ICTarget )
|
||||
{
|
||||
handleLoadedEvent( (ICLoadedEvent)event );
|
||||
}
|
||||
}
|
||||
else if ( event instanceof ICRestartedEvent )
|
||||
{
|
||||
if ( source instanceof ICTarget )
|
||||
{
|
||||
handleRestartedEvent( (ICRestartedEvent)event );
|
||||
}
|
||||
}
|
||||
else if ( event instanceof ICSteppingEvent )
|
||||
{
|
||||
if ( source instanceof ICTarget )
|
||||
{
|
||||
handleSteppingEvent( (ICSteppingEvent)event );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.IRestart#canRestart()
|
||||
*/
|
||||
public boolean canRestart()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.IRestart#restart()
|
||||
*/
|
||||
public void restart() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.IInstructionStep#canStepIntoInstruction()
|
||||
*/
|
||||
public boolean canStepIntoInstruction()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.IInstructionStep#canStepOverInstruction()
|
||||
*/
|
||||
public boolean canStepOverInstruction()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.IInstructionStep#stepIntoInstruction()
|
||||
*/
|
||||
public void stepIntoInstruction() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.IInstructionStep#stepOverInstruction()
|
||||
*/
|
||||
public void stepOverInstruction() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.IFormattedMemoryRetrieval#getFormattedMemoryBlock(long, int, int, int, int, char)
|
||||
*/
|
||||
public IFormattedMemoryBlock getFormattedMemoryBlock( long startAddress,
|
||||
int format,
|
||||
int wordSize,
|
||||
int numberOfRows,
|
||||
int numberOfColumns,
|
||||
char paddingChar ) throws DebugException
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.IFormattedMemoryRetrieval#getFormattedMemoryBlock(long, int, int, int, int)
|
||||
*/
|
||||
public IFormattedMemoryBlock getFormattedMemoryBlock( long startAddress,
|
||||
int format,
|
||||
int wordSize,
|
||||
int numberOfRows,
|
||||
int numberOfColumns ) throws DebugException
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.IFormattedMemoryRetrieval#getSupportedFormats()
|
||||
*/
|
||||
public int[] getSupportedFormats() throws DebugException
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether this target is available to handle client
|
||||
* requests.
|
||||
*
|
||||
* @return whether this target is available to handle client requests
|
||||
*/
|
||||
public boolean isAvailable()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether this target is suspended.
|
||||
*
|
||||
* @param suspended whether this target is suspended
|
||||
*/
|
||||
private void setSuspended( boolean suspended )
|
||||
{
|
||||
fSuspended = suspended;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether this target is in the process of terminating.
|
||||
*
|
||||
* @return whether this target is terminating
|
||||
*/
|
||||
protected boolean isTerminating()
|
||||
{
|
||||
return fTerminating;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether this target is in the process of terminating.
|
||||
*
|
||||
* @param terminating whether this target is terminating
|
||||
*/
|
||||
protected void setTerminating( boolean terminating )
|
||||
{
|
||||
fTerminating = terminating;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the state of this target to be terminated,
|
||||
* if not already terminated.
|
||||
*/
|
||||
protected void terminated()
|
||||
{
|
||||
setTerminating( false );
|
||||
if ( !isTerminated() )
|
||||
{
|
||||
setTerminated( true );
|
||||
setDisconnected( true );
|
||||
cleanup();
|
||||
fireTerminateEvent();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the state of this target for disconnection
|
||||
* from the VM.
|
||||
*/
|
||||
protected void disconnected()
|
||||
{
|
||||
if ( !isDisconnected() )
|
||||
{
|
||||
setDisconnected( true );
|
||||
cleanup();
|
||||
fireTerminateEvent();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleans up the internal state of this debug target as a result
|
||||
* of a session ending.
|
||||
*
|
||||
*/
|
||||
protected void cleanup()
|
||||
{
|
||||
removeAllThreads();
|
||||
getCDISession().getEventManager().removeEventListener( this );
|
||||
DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener( this );
|
||||
DebugPlugin.getDefault().getLaunchManager().removeLaunchListener( this );
|
||||
removeAllBreakpoints();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes all threads from this target's collection
|
||||
* of threads, firing a terminate event for each.
|
||||
*
|
||||
*/
|
||||
protected void removeAllThreads()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes all breakpoints from this target.
|
||||
*
|
||||
*/
|
||||
protected void removeAllBreakpoints()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates, adds and returns a thread for the given underlying
|
||||
* CDI thread. A creation event is fired for the thread.
|
||||
* Returns <code>null</code> if during the creation of the thread
|
||||
* this target is set to the disconnected state.
|
||||
*
|
||||
* @param thread the underlying CDI thread
|
||||
* @return model thread
|
||||
*/
|
||||
protected CThread createThread( ICThread cdiThread )
|
||||
{
|
||||
CThread thread = null;
|
||||
thread = new CThread( this, cdiThread );
|
||||
if ( isDisconnected() )
|
||||
{
|
||||
return null;
|
||||
}
|
||||
getThreadList().add( thread );
|
||||
thread.fireCreationEvent();
|
||||
return thread;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new thread from the given CDI thread and initializes
|
||||
* its state to "Running".
|
||||
*
|
||||
* @see CDebugTarget#createThread(ICThread)
|
||||
*/
|
||||
protected CThread createRunningThread( ICThread cdiThread )
|
||||
{
|
||||
CThread thread = null;
|
||||
thread = new CThread( this, cdiThread );
|
||||
if ( isDisconnected() )
|
||||
{
|
||||
return null;
|
||||
}
|
||||
thread.setRunning( true );
|
||||
getThreadList().add( thread );
|
||||
thread.fireCreationEvent();
|
||||
return thread;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether this target should be resumed on startup.
|
||||
*
|
||||
* @param resume whether this target should be resumed on startup
|
||||
*/
|
||||
private void setResumeOnStartup( boolean resume )
|
||||
{
|
||||
fResumeOnStartup = resume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether this target should be resumed on startup.
|
||||
*
|
||||
* @return whether this target should be resumed on startup
|
||||
*/
|
||||
protected boolean isResumeOnStartup()
|
||||
{
|
||||
return fResumeOnStartup;
|
||||
}
|
||||
|
||||
private void handleSuspendedEvent( ICSuspendedEvent event )
|
||||
{
|
||||
setSuspended( true );
|
||||
ICSessionObject reason = event.getReason();
|
||||
if ( reason instanceof ICEndSteppingRange )
|
||||
{
|
||||
handleEndSteppingRange( (ICEndSteppingRange)reason );
|
||||
}
|
||||
else if ( reason instanceof ICBreakpoint )
|
||||
{
|
||||
handleBreakpointHit( (ICBreakpoint)reason );
|
||||
}
|
||||
else if ( reason instanceof ICSignal )
|
||||
{
|
||||
handleSuspendedBySignal( (ICSignal)reason );
|
||||
}
|
||||
}
|
||||
|
||||
private void handleResumedEvent( ICResumedEvent event )
|
||||
{
|
||||
setSuspended( false );
|
||||
fireResumeEvent( DebugEvent.UNSPECIFIED );
|
||||
}
|
||||
|
||||
private void handleEndSteppingRange( ICEndSteppingRange endSteppingRange )
|
||||
{
|
||||
fireSuspendEvent( DebugEvent.UNSPECIFIED );
|
||||
}
|
||||
|
||||
private void handleBreakpointHit( ICBreakpoint breakpoint )
|
||||
{
|
||||
fireSuspendEvent( DebugEvent.BREAKPOINT );
|
||||
}
|
||||
|
||||
private void handleSuspendedBySignal( ICSignal signal )
|
||||
{
|
||||
fireSuspendEvent( DebugEvent.UNSPECIFIED );
|
||||
}
|
||||
|
||||
private void handleExitedEvent( ICExitedEvent event )
|
||||
{
|
||||
fireChangeEvent( DebugEvent.STATE );
|
||||
}
|
||||
|
||||
private void handleTerminatedEvent( ICTerminatedEvent event )
|
||||
{
|
||||
terminated();
|
||||
}
|
||||
|
||||
private void handleDisconnectedEvent( ICDisconnectedEvent event )
|
||||
{
|
||||
disconnected();
|
||||
}
|
||||
|
||||
private void handleChangedEvent( ICChangedEvent event )
|
||||
{
|
||||
}
|
||||
|
||||
private void handleLoadedEvent( ICLoadedEvent event )
|
||||
{
|
||||
}
|
||||
|
||||
private void handleRestartedEvent( ICRestartedEvent event )
|
||||
{
|
||||
}
|
||||
|
||||
private void handleSteppingEvent( ICSteppingEvent event )
|
||||
{
|
||||
}
|
||||
|
||||
private void handleThreadCreatedEvent( ICCreatedEvent event )
|
||||
{
|
||||
ICThread cdiThread = (ICThread)event.getSource();
|
||||
CThread thread= findThread( cdiThread );
|
||||
if ( thread == null )
|
||||
{
|
||||
createThread( cdiThread );
|
||||
}
|
||||
else
|
||||
{
|
||||
thread.disposeStackFrames();
|
||||
thread.fireChangeEvent( DebugEvent.CONTENT );
|
||||
}
|
||||
}
|
||||
|
||||
private void handleThreadTerminatedEvent( ICTerminatedEvent event )
|
||||
{
|
||||
ICThread cdiThread = (ICThread)event.getSource();
|
||||
CThread thread = findThread( cdiThread );
|
||||
if ( thread != null)
|
||||
{
|
||||
getThreadList().remove( thread );
|
||||
thread.terminated();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds and returns the model thread for the associated CDI thread,
|
||||
* or <code>null</code> if not found.
|
||||
*
|
||||
* @param the underlying CDI thread
|
||||
* @return the associated model thread
|
||||
*/
|
||||
public CThread findThread( ICThread cdiThread )
|
||||
{
|
||||
List threads = getThreadList();
|
||||
for ( int i = 0; i < threads.size(); i++ )
|
||||
{
|
||||
CThread t = (CThread)threads.get( i );
|
||||
if ( t.getCDIThread().equals( cdiThread ) )
|
||||
return t;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.IState#getCurrentState()
|
||||
*/
|
||||
public int getCurrentState()
|
||||
{
|
||||
return IState.UNKNOWN;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,283 @@
|
|||
/*
|
||||
*(c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.eclipse.cdt.debug.internal.core;
|
||||
|
||||
import org.eclipse.cdt.debug.core.IState;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICEventListener;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.ICThread;
|
||||
import org.eclipse.debug.core.DebugException;
|
||||
import org.eclipse.debug.core.model.IBreakpoint;
|
||||
import org.eclipse.debug.core.model.IStackFrame;
|
||||
import org.eclipse.debug.core.model.IThread;
|
||||
|
||||
/**
|
||||
*
|
||||
* A thread in a C/C++ debug target.
|
||||
*
|
||||
* @since Aug 2, 2002
|
||||
*/
|
||||
public class CThread extends CDebugElement
|
||||
implements IThread,
|
||||
IState,
|
||||
ICEventListener
|
||||
{
|
||||
/**
|
||||
* Underlying CDI target.
|
||||
*/
|
||||
private ICThread fCDIThread;
|
||||
|
||||
/**
|
||||
* Constructor for CThread.
|
||||
* @param target
|
||||
*/
|
||||
public CThread( CDebugTarget target, ICThread cdiThread )
|
||||
{
|
||||
super( target );
|
||||
setCDIThread( cdiThread );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IThread#getStackFrames()
|
||||
*/
|
||||
public IStackFrame[] getStackFrames() throws DebugException
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IThread#hasStackFrames()
|
||||
*/
|
||||
public boolean hasStackFrames() throws DebugException
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IThread#getPriority()
|
||||
*/
|
||||
public int getPriority() throws DebugException
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IThread#getTopStackFrame()
|
||||
*/
|
||||
public IStackFrame getTopStackFrame() throws DebugException
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IThread#getName()
|
||||
*/
|
||||
public String getName() throws DebugException
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IThread#getBreakpoints()
|
||||
*/
|
||||
public IBreakpoint[] getBreakpoints()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.cdi.event.ICEventListener#handleDebugEvent(ICEvent)
|
||||
*/
|
||||
public void handleDebugEvent( ICEvent event )
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ISuspendResume#canResume()
|
||||
*/
|
||||
public boolean canResume()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
|
||||
*/
|
||||
public boolean canSuspend()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
|
||||
*/
|
||||
public boolean isSuspended()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ISuspendResume#resume()
|
||||
*/
|
||||
public void resume() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ISuspendResume#suspend()
|
||||
*/
|
||||
public void suspend() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IStep#canStepInto()
|
||||
*/
|
||||
public boolean canStepInto()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IStep#canStepOver()
|
||||
*/
|
||||
public boolean canStepOver()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IStep#canStepReturn()
|
||||
*/
|
||||
public boolean canStepReturn()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IStep#isStepping()
|
||||
*/
|
||||
public boolean isStepping()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IStep#stepInto()
|
||||
*/
|
||||
public void stepInto() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IStep#stepOver()
|
||||
*/
|
||||
public void stepOver() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.IStep#stepReturn()
|
||||
*/
|
||||
public void stepReturn() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ITerminate#canTerminate()
|
||||
*/
|
||||
public boolean canTerminate()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ITerminate#isTerminated()
|
||||
*/
|
||||
public boolean isTerminated()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.debug.core.model.ITerminate#terminate()
|
||||
*/
|
||||
public void terminate() throws DebugException
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the underlying CDI thread that this model object is
|
||||
* a proxy to.
|
||||
*
|
||||
* @param thread the underlying CDI thread
|
||||
*/
|
||||
protected void setCDIThread( ICThread cdiThread )
|
||||
{
|
||||
fCDIThread = cdiThread;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the underlying CDI thread that this model object is
|
||||
* a proxy to.
|
||||
*
|
||||
* @return the underlying CDI thread
|
||||
*/
|
||||
protected ICThread getCDIThread()
|
||||
{
|
||||
return fCDIThread;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether this thread is currently executing.
|
||||
*
|
||||
* @param running whether this thread is executing
|
||||
*/
|
||||
protected void setRunning( boolean running )
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether this thread is terminated
|
||||
*
|
||||
* @param terminated whether this thread is terminated
|
||||
*/
|
||||
protected void setTerminated( boolean terminated )
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Disposes stack frames, to be completely re-computed on
|
||||
* the next suspend event. This method should be called before
|
||||
* this thread is resumed when stack frames are not to be re-used
|
||||
* on the next suspend.
|
||||
*
|
||||
*/
|
||||
protected synchronized void disposeStackFrames()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Notification this thread has terminated - update state
|
||||
* and fire a terminate event.
|
||||
*/
|
||||
protected void terminated()
|
||||
{
|
||||
setTerminated( true );
|
||||
setRunning( false );
|
||||
fireTerminateEvent();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.IState#getCurrentState()
|
||||
*/
|
||||
public int getCurrentState()
|
||||
{
|
||||
return IState.UNKNOWN;
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue