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>
|
<classpath>
|
||||||
<classpathentry kind="src" path="src/"/>
|
<classpathentry kind="src" path="src/"/>
|
||||||
<classpathentry kind="src" path="/org.eclipse.core.resources"/>
|
<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.runtime"/>
|
||||||
<classpathentry kind="src" path="/org.eclipse.core.boot"/>
|
<classpathentry kind="src" path="/org.eclipse.core.boot"/>
|
||||||
<classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
|
<classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
|
||||||
|
|
|
@ -1,31 +1,32 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<projectDescription>
|
<projectDescription>
|
||||||
<name>org.eclipse.cdt.debug.core</name>
|
<name>org.eclipse.cdt.debug.core</name>
|
||||||
<comment></comment>
|
<comment></comment>
|
||||||
<projects>
|
<projects>
|
||||||
<project>org.eclipse.core.boot</project>
|
<project>org.eclipse.core.boot</project>
|
||||||
<project>org.eclipse.core.resources</project>
|
<project>org.eclipse.core.resources</project>
|
||||||
<project>org.eclipse.core.runtime</project>
|
<project>org.eclipse.core.runtime</project>
|
||||||
</projects>
|
<project>org.eclipse.debug.core</project>
|
||||||
<buildSpec>
|
</projects>
|
||||||
<buildCommand>
|
<buildSpec>
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
<buildCommand>
|
||||||
<arguments>
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
</arguments>
|
<arguments>
|
||||||
</buildCommand>
|
</arguments>
|
||||||
<buildCommand>
|
</buildCommand>
|
||||||
<name>org.eclipse.pde.ManifestBuilder</name>
|
<buildCommand>
|
||||||
<arguments>
|
<name>org.eclipse.pde.ManifestBuilder</name>
|
||||||
</arguments>
|
<arguments>
|
||||||
</buildCommand>
|
</arguments>
|
||||||
<buildCommand>
|
</buildCommand>
|
||||||
<name>org.eclipse.pde.SchemaBuilder</name>
|
<buildCommand>
|
||||||
<arguments>
|
<name>org.eclipse.pde.SchemaBuilder</name>
|
||||||
</arguments>
|
<arguments>
|
||||||
</buildCommand>
|
</arguments>
|
||||||
</buildSpec>
|
</buildCommand>
|
||||||
<natures>
|
</buildSpec>
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
<natures>
|
||||||
<nature>org.eclipse.pde.PluginNature</nature>
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
</natures>
|
<nature>org.eclipse.pde.PluginNature</nature>
|
||||||
</projectDescription>
|
</natures>
|
||||||
|
</projectDescription>
|
||||||
|
|
|
@ -9,13 +9,21 @@ package org.eclipse.cdt.debug.core;
|
||||||
import org.eclipse.core.resources.IWorkspace;
|
import org.eclipse.core.resources.IWorkspace;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
import org.eclipse.core.runtime.IPluginDescriptor;
|
import org.eclipse.core.runtime.IPluginDescriptor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Plugin;
|
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.
|
* The main plugin class to be used in the desktop.
|
||||||
*/
|
*/
|
||||||
public class CDebugCorePlugin extends Plugin
|
public class CDebugCorePlugin extends Plugin
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Status code indicating an unexpected internal error.
|
||||||
|
*/
|
||||||
|
public static final int INTERNAL_ERROR = 1000;
|
||||||
|
|
||||||
//The shared instance.
|
//The shared instance.
|
||||||
private static CDebugCorePlugin plugin;
|
private static CDebugCorePlugin plugin;
|
||||||
|
|
||||||
|
@ -30,6 +38,8 @@ public class CDebugCorePlugin extends Plugin
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the shared instance.
|
* Returns the shared instance.
|
||||||
|
*
|
||||||
|
* @return the shared instance
|
||||||
*/
|
*/
|
||||||
public static CDebugCorePlugin getDefault()
|
public static CDebugCorePlugin getDefault()
|
||||||
{
|
{
|
||||||
|
@ -38,9 +48,60 @@ public class CDebugCorePlugin extends Plugin
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the workspace instance.
|
* Returns the workspace instance.
|
||||||
|
*
|
||||||
|
* @return the workspace instance
|
||||||
*/
|
*/
|
||||||
public static IWorkspace getWorkspace()
|
public static IWorkspace getWorkspace()
|
||||||
{
|
{
|
||||||
return ResourcesPlugin.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:
|
* @throws CDIException if this method fails. Reasons include:
|
||||||
*/
|
*/
|
||||||
ICSharedLibrary[] getSharedLibraries() throws CDIException;
|
ICSharedLibrary[] getSharedLibraries() throws CDIException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the threads contained in this target.
|
* Returns the threads contained in this target.
|
||||||
* An empty collection is returned if this target contains no
|
* 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