1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 01:06:01 +02:00

more work to get CDI up.

This commit is contained in:
Alain Magloire 2002-08-12 03:16:56 +00:00
parent 8c0f56fa80
commit 3029910ef5
37 changed files with 1388 additions and 181 deletions

View file

@ -4,9 +4,15 @@
*/
package org.eclipse.cdt.debug.mi.core;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.eclipse.cdt.debug.core.cdi.ICSession;
import org.eclipse.cdt.debug.mi.core.cdi.CSession;
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
import org.eclipse.cdt.debug.mi.core.command.MITargetAttach;
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.Plugin;
@ -39,4 +45,36 @@ public class MIPlugin extends Plugin {
public MISession createMISession(InputStream in, OutputStream out) {
return new MISession(in, out);
}
public ICSession createCSession(String program) throws IOException {
String[]args = new String[]{"gdb", "--quiet", "-i", "mi", program};
Process gdb = Runtime.getRuntime().exec(args);
MISession session = createMISession(gdb.getInputStream(), gdb.getOutputStream());
return new CSession(session);
}
public ICSession createCSession(String program, String core) throws IOException {
String[]args = new String[]{"gdb", "--quiet", "-i", "mi", program, core};
Process gdb = Runtime.getRuntime().exec(args);
MISession session = createMISession(gdb.getInputStream(), gdb.getOutputStream());
return new CSession(session);
}
public ICSession createCSession(String program, int pid) throws IOException {
String[]args = new String[]{"gdb", "--quiet", "-i", "mi", program};
Process gdb = Runtime.getRuntime().exec(args);
MISession session = createMISession(gdb.getInputStream(), gdb.getOutputStream());
try {
CommandFactory factory = session.getCommandFactory();
MITargetAttach attach = factory.createMITargetAttach(pid);
session.postCommand(attach);
MIInfo info = attach.getMIInfo();
if (info == null) {
throw new IOException("Failed to attach");
}
} catch (MIException e) {
throw new IOException("Failed to attach");
}
return new CSession(session);
}
}

View file

@ -0,0 +1,149 @@
package org.eclipse.cdt.debug.mi.core;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.eclipse.cdt.debug.mi.core.command.CLICommand;
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
import org.eclipse.cdt.debug.mi.core.command.MIExecAbort;
import org.eclipse.cdt.debug.mi.core.command.MIGDBShowExitCode;
import org.eclipse.cdt.debug.mi.core.output.MIGDBShowExitCodeInfo;
/**
* @author alain
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class MIProcess extends Process {
public final static int SUSPENDED = 1;
public final static int RUNNING = 2;
public final static int TERMINATED = 3;
int state = 0;
MISession session;
OutputStream out;
MIProcess(MISession mi) {
session = mi;
out = new OutputStream() {
StringBuffer buf = new StringBuffer();
public void write(int b) throws IOException {
buf.append(b);
if (b == '\n') {
flush();
}
}
public void flush() throws IOException {
CLICommand cmd = new CLICommand(buf.toString()) {
public void setToken(int token) {
// override to do nothing;
}
};
try {
session.postCommand(cmd);
} catch (MIException e) {
throw new IOException("no mi session");
}
}
};
}
/**
* @see java.lang.Process#getOutputStream()
*/
public OutputStream getOutputStream() {
return out;
}
/**
* @see java.lang.Process#getInputStream()
*/
public InputStream getInputStream() {
return session.getTargetStream();
}
/**
* @see java.lang.Process#getErrorStream()
*/
public InputStream getErrorStream() {
// FIXME the same as output??
return session.getTargetStream();
}
/**
* @see java.lang.Process#waitFor()
*/
public int waitFor() throws InterruptedException {
if (!isTerminated()) {
synchronized (this) {
wait();
}
}
return exitValue();
}
/**
* @see java.lang.Process#exitValue()
*/
public int exitValue() {
if (isTerminated()) {
CommandFactory factory = session.getCommandFactory();
MIGDBShowExitCode code = factory.createMIGDBShowExitCode();
try {
session.postCommand(code);
MIGDBShowExitCodeInfo info = code.getMIGDBShowExitCodeInfo();
return info.getCode();
} catch (MIException e) {
return 0;
}
}
throw new IllegalThreadStateException();
}
/**
* @see java.lang.Process#destroy()
*/
public void destroy() {
CommandFactory factory = session.getCommandFactory();
MIExecAbort abort = factory.createMIExecAbort();
CLICommand yes = new CLICommand("yes") {
public void setToken() { }
};
try {
session.postCommand(abort);
session.postCommand(yes);
} catch (MIException e) {
}
// Do not wait for answer.
}
public synchronized boolean isSuspended() {
return state == SUSPENDED;
}
public synchronized boolean isRunning() {
return state == RUNNING;
}
public synchronized boolean isTerminated() {
return state == TERMINATED;
}
public synchronized void setSuspended() {
state = SUSPENDED;
}
public synchronized void setRunning() {
state = RUNNING;
}
public synchronized void setTerminated() {
state = TERMINATED;
notifyAll();
}
}

View file

@ -7,6 +7,8 @@ package org.eclipse.cdt.debug.mi.core;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.Observable;
import org.eclipse.cdt.debug.mi.core.command.Command;
@ -31,9 +33,12 @@ public class MISession extends Observable {
Queue txQueue;
Queue rxQueue;
OutputStream consoleStream = null;
OutputStream targetStream = null;
OutputStream logStream = null;
PipedInputStream miInPipe;
PipedOutputStream miOutPipe;
PipedInputStream targetInPipe;
PipedOutputStream targetOutPipe;
PipedInputStream logInPipe;
PipedOutputStream logOutPipe;
CommandFactory factory;
@ -41,10 +46,7 @@ public class MISession extends Observable {
long cmdTimeout = 10000; // 10 * 1000 (~ 10 secs);
final int STOPPED = 0;
final int RUNNING = 1;
final int SUSPENDED = 1;
int state = STOPPED;
MIProcess process;
/**
* Create the gdb session.
@ -63,48 +65,40 @@ public class MISession extends Observable {
rxThread = new RxThread(this);
txThread.start();
rxThread.start();
}
/**
* Set Console Stream.
*/
public void setConsoleStream(OutputStream console) {
consoleStream = console;
try {
miOutPipe = new PipedOutputStream();
miInPipe = new PipedInputStream(miOutPipe);
targetOutPipe = new PipedOutputStream();
targetInPipe = new PipedInputStream(targetOutPipe);
logOutPipe = new PipedOutputStream();
logInPipe = new PipedInputStream(logOutPipe);
} catch (IOException e) {
}
process = new MIProcess(this);
}
/**
* get Console Stream.
*/
OutputStream getConsoleStream() {
return consoleStream;
public InputStream getMIStream() {
return miInPipe;
}
/**
* Set Target Stream.
*/
public void setTargetStream(OutputStream target) {
targetStream = target;
}
/**
* Get Target Stream.
*/
OutputStream getTargetStream() {
return targetStream;
}
/**
* Set Log Stream
*/
public void setLogStream(OutputStream log) {
logStream = log;
public InputStream getTargetStream() {
return targetInPipe;
}
/**
* Get Log Stream
*/
OutputStream getLogStream() {
return logStream;
public InputStream getLogStream() {
return logInPipe;
}
/**
@ -179,6 +173,10 @@ public class MISession extends Observable {
}
}
public MIProcess getMIProcess() {
return process;
}
public boolean isTerminated() {
return (!txThread.isAlive() || !rxThread.isAlive());
}
@ -188,6 +186,8 @@ public class MISession extends Observable {
*/
public void terminate() {
process.destroy();
// Closing the channel will kill the RxThread.
try {
inChannel.close();
@ -199,7 +199,8 @@ public class MISession extends Observable {
outChannel.close();
} catch (IOException e) {
}
outChannel = null; // This is needed to stop the txThread.
// This is __needed__ to stop the txThread.
outChannel = null;
try {
if (txThread.isAlive()) {
@ -218,53 +219,6 @@ public class MISession extends Observable {
}
}
/**
* The session is in STOPPED state.
* It means the 'run/-exec-run' command was not issued.
* Or the program exited, via a signal or normally.
* It is not the same as gdb/MI *stopped async-class
* gdb/MI stopped means suspended here.
*/
public boolean isStopped() {
return state == STOPPED;
}
/**
* The session is in SUSPENDED state.
* State after hitting a breakpoint or after attach.
*/
public boolean isSuspended() {
return state == SUSPENDED;
}
/**
* The session is in RUNNING state.
*/
public boolean isRunning() {
return state == RUNNING;
}
/**
* Set the state STOPPED.
*/
public void setStopped() {
state = STOPPED;
}
/**
* Set the state SUSPENDED.
*/
public void setSuspended() {
state = SUSPENDED;
}
/**
* Set the state STOPPED.
*/
public void setRunning() {
state = RUNNING;
}
/**
* Notify the observers of new MI OOB events.
*/
@ -273,6 +227,19 @@ public class MISession extends Observable {
super.notifyObservers(arg);
}
OutputStream getConsolePipe() {
return miOutPipe;
}
OutputStream getTargetPipe() {
return targetOutPipe;
}
OutputStream getLogPipe() {
return logOutPipe;
}
Queue getTxQueue() {
return txQueue;
}

View file

@ -17,6 +17,7 @@ import org.eclipse.cdt.debug.mi.core.event.MIBreakpointEvent;
import org.eclipse.cdt.debug.mi.core.event.MIEvent;
import org.eclipse.cdt.debug.mi.core.event.MIExitEvent;
import org.eclipse.cdt.debug.mi.core.event.MIFunctionFinishedEvent;
import org.eclipse.cdt.debug.mi.core.event.MIInferiorExitEvent;
import org.eclipse.cdt.debug.mi.core.event.MISignalEvent;
import org.eclipse.cdt.debug.mi.core.event.MIStepEvent;
import org.eclipse.cdt.debug.mi.core.event.MIWatchpointEvent;
@ -70,12 +71,18 @@ public class RxThread extends Thread {
// discard termination
processMIOutput(buffer.toString());
buffer = new StringBuffer();
} else if (line.startsWith(MITargetStreamOutput.startTag)) {
// Process Target output immediately.
processMIOutput(line + "\n");
} else {
buffer.append(line).append('\n');
}
}
}
} catch (IOException e) {
MIEvent event = new MIExitEvent();
Thread eventTread = new EventThread(session, new MIEvent[]{event});
eventTread.start();
//e.printStackTrace();
}
}
@ -98,9 +105,9 @@ public class RxThread extends Thread {
// Check if the state changed.
String state = rr.getResultClass();
if ("running".equals(state)) {
session.setRunning();
session.getMIProcess().setRunning();
} else if ("exit".equals(state)) {
session.setStopped();
session.getMIProcess().setTerminated();
}
int id = rr.geToken();
@ -149,7 +156,7 @@ public class RxThread extends Thread {
// Change of state.
String state = exec.getAsyncClass();
if ("stopped".equals(state)) {
session.setSuspended();
session.getMIProcess().setSuspended();
}
MIResult[] results = exec.getMIResults();
@ -175,7 +182,7 @@ public class RxThread extends Thread {
void processMIOOBRecord(MIStreamRecord stream) {
if (stream instanceof MIConsoleStreamOutput) {
OutputStream console = session.getConsoleStream();
OutputStream console = session.getConsolePipe();
if (console != null) {
MIConsoleStreamOutput out = (MIConsoleStreamOutput)stream;
String str = out.getString();
@ -188,7 +195,7 @@ public class RxThread extends Thread {
}
}
} else if (stream instanceof MITargetStreamOutput) {
OutputStream target = session.getTargetStream();
OutputStream target = session.getTargetPipe();
if (target != null) {
MITargetStreamOutput out = (MITargetStreamOutput)stream;
String str = out.getString();
@ -201,7 +208,7 @@ public class RxThread extends Thread {
}
}
} else if (stream instanceof MILogStreamOutput) {
OutputStream log = session.getLogStream();
OutputStream log = session.getLogPipe();
if (log != null) {
MILogStreamOutput out = (MILogStreamOutput)stream;
String str = out.getString();
@ -252,45 +259,39 @@ public class RxThread extends Thread {
} else if (rr != null) {
event = new MIBreakpointEvent(rr);
}
session.setSuspended();
} else if ("watchpoint-trigger".equals(reason)) {
if (exec != null) {
event = new MIWatchpointEvent(exec);
} else if (rr != null) {
event = new MIWatchpointEvent(rr);
}
session.setSuspended();
} else if ("end-stepping-range".equals(reason)) {
if (exec != null) {
event = new MIStepEvent(exec);
} else if (rr != null) {
event = new MIStepEvent(rr);
}
session.setSuspended();
} else if ("signal-received".equals(reason)) {
if (exec != null) {
event = new MISignalEvent(exec);
} else if (rr != null) {
event = new MISignalEvent(rr);
}
session.setStopped();
} else if ("location-reached".equals(reason)) {
if (exec != null) {
event = new MISignalEvent(exec);
} else if (rr != null) {
event = new MISignalEvent(rr);
}
session.setSuspended();
} else if ("function-finished".equals(reason)) {
if (exec != null) {
event = new MIFunctionFinishedEvent(exec);
} else if (rr != null) {
event = new MIFunctionFinishedEvent(rr);
}
session.setSuspended();
} else if ("exited-normally".equals(reason)) {
event = new MIExitEvent();
session.setStopped();
session.getMIProcess().setTerminated();
event = new MIInferiorExitEvent();
}
return event;
}

View file

@ -22,6 +22,7 @@ public class TxThread extends Thread {
public TxThread(MISession s) {
super("MI TX Thread");
session = s;
// start at one, zero is special means no token.
token = 1;
}
@ -49,9 +50,13 @@ public class TxThread extends Thread {
OutputStream out = session.getChannelOutputStream();
out.write(str.getBytes());
out.flush();
// Move to the RxQueue
Queue rxQueue = session.getRxQueue();
rxQueue.addCommand(cmd);
// Move to the RxQueue only if we have
// a valid token, this is to permit input(HACK!)
// or commands that do not want to wait for responses.
if (cmd.getToken() > 0) {
Queue rxQueue = session.getRxQueue();
rxQueue.addCommand(cmd);
}
}
}
} catch (IOException e) {

View file

@ -0,0 +1,86 @@
package org.eclipse.cdt.debug.mi.core.cdi;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.model.ICArgument;
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.ICValue;
import org.eclipse.cdt.debug.mi.core.output.MIArg;
/**
* @author alain
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class Argument implements ICArgument {
MIArg arg;
public Argument(MIArg a) {
arg = a;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#getName()
*/
public String getName() throws CDIException {
return arg.getName();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#getValue()
*/
public ICValue getValue() throws CDIException {
return new Value(arg.getValue());
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#hasValueChanged()
*/
public boolean hasValueChanged() throws CDIException {
return false;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#setValue(ICValue)
*/
public void setValue(ICValue value) throws CDIException {
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#setValue(String)
*/
public void setValue(String expression) throws CDIException {
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getCDITarget()
*/
public ICTarget getCDITarget() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getId()
*/
public String getId() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getParent()
*/
public ICObject getParent() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#getTypeName()
*/
public String getTypeName() throws CDIException {
return "";
}
}

View file

@ -1,9 +1,12 @@
package org.eclipse.cdt.debug.mi.core.cdi;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICCatchEvent;
import org.eclipse.cdt.debug.core.cdi.ICCatchpoint;
import org.eclipse.cdt.debug.core.cdi.ICCondition;
import org.eclipse.cdt.debug.core.cdi.ICLocation;
import org.eclipse.cdt.debug.core.cdi.ICLocationBreakpoint;
import org.eclipse.cdt.debug.core.cdi.ICWatchpoint;
import org.eclipse.cdt.debug.core.cdi.model.ICInstruction;
import org.eclipse.cdt.debug.mi.core.output.MIBreakPoint;
@ -15,11 +18,11 @@ import org.eclipse.cdt.debug.mi.core.output.MIBreakPoint;
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class Breakpoint extends SessionObject implements ICLocationBreakpoint {
public class Breakpoint extends SessionObject implements ICLocationBreakpoint,
ICCatchpoint, ICWatchpoint {
ICLocation location;
ICCondition condition;
String threadId = "";
MIBreakPoint miBreakPoint;
BreakpointManager mgr;
@ -60,7 +63,7 @@ public class Breakpoint extends SessionObject implements ICLocationBreakpoint {
* @see org.eclipse.cdt.debug.core.cdi.ICBreakpoint#getThreadId()
*/
public String getThreadId() throws CDIException {
return threadId;
return miBreakPoint.getThreadId();
}
/**
@ -74,14 +77,14 @@ public class Breakpoint extends SessionObject implements ICLocationBreakpoint {
* @see org.eclipse.cdt.debug.core.cdi.ICBreakpoint#isHardware()
*/
public boolean isHardware() {
return miBreakPoint.getType().startsWith("hw");
return miBreakPoint.isHardware();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICBreakpoint#isTemporary()
*/
public boolean isTemporary() {
return miBreakPoint.getDisposition().equals("del");
return miBreakPoint.isTemporary();
}
/**
@ -152,4 +155,32 @@ public class Breakpoint extends SessionObject implements ICLocationBreakpoint {
return location;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICCatchpoint#getEvent()
*/
public ICCatchEvent getEvent() throws CDIException {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICWatchpoint#getWatchExpression()
*/
public String getWatchExpression() throws CDIException {
return miBreakPoint.getWhat();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICWatchpoint#isReadType()
*/
public boolean isReadType() {
return miBreakPoint.isReadWatchpoint();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICWatchpoint#isWriteType()
*/
public boolean isWriteType() {
return miBreakPoint.isAccessWatchpoint();
}
}

View file

@ -19,11 +19,14 @@ import org.eclipse.cdt.debug.core.cdi.ICLocationBreakpoint;
import org.eclipse.cdt.debug.core.cdi.ICWatchpoint;
import org.eclipse.cdt.debug.mi.core.MIException;
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
import org.eclipse.cdt.debug.mi.core.command.MIBreakDelete;
import org.eclipse.cdt.debug.mi.core.command.MIBreakDisable;
import org.eclipse.cdt.debug.mi.core.command.MIBreakEnable;
import org.eclipse.cdt.debug.mi.core.command.MIBreakInsert;
import org.eclipse.cdt.debug.mi.core.command.MIBreakWatch;
import org.eclipse.cdt.debug.mi.core.output.MIBreakInsertInfo;
import org.eclipse.cdt.debug.mi.core.output.MIBreakPoint;
import org.eclipse.cdt.debug.mi.core.output.MIBreakWatchInfo;
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
/**
@ -56,11 +59,35 @@ public class BreakpointManager extends SessionObject implements ICBreakpointMana
* @see org.eclipse.cdt.debug.core.cdi.ICBreakpointManager#deleteBreakpoints(ICBreakpoint[])
*/
public void deleteBreakpoints(ICBreakpoint[] breakpoints) throws CDIException {
int[] numbers = new int[breakpoints.length];
for (int i = 0; i < numbers.length; i++) {
if (breakpoints[i] instanceof Breakpoint
&& breakList.contains(breakpoints[i])) {
numbers[i] = ((Breakpoint)breakpoints[i]).getMIBreakPoint().getNumber();
} else {
//throw new CDIException();
}
}
CSession s = getCSession();
CommandFactory factory = s.getMISession().getCommandFactory();
MIBreakDelete breakDelete = factory.createMIBreakDelete(numbers);
try {
s.getMISession().postCommand(breakDelete);
MIInfo info = breakDelete.getMIInfo();
if (info == null) {
//throw new CDIException();
}
} catch (MIException e) {
// throw new CDIException(e);
}
for (int i = 0; i < breakpoints.length; i++) {
breakList.remove(breakpoints[i]);
}
}
public void enableBreakpoint(ICBreakpoint breakpoint) throws CDIException {
int number = 0;
if (breakpoint instanceof Breakpoint) {
if (breakpoint instanceof Breakpoint && breakList.contains(breakpoint)) {
number = ((Breakpoint)breakpoint).getMIBreakPoint().getNumber();
} else {
//throw new CDIException();
@ -82,7 +109,7 @@ public class BreakpointManager extends SessionObject implements ICBreakpointMana
public void disableBreakpoint(ICBreakpoint breakpoint) throws CDIException {
int number = 0;
if (breakpoint instanceof Breakpoint) {
if (breakpoint instanceof Breakpoint && breakList.contains(breakpoint)) {
number = ((Breakpoint)breakpoint).getMIBreakPoint().getNumber();
} else {
// throw new CDIException();
@ -114,6 +141,7 @@ public class BreakpointManager extends SessionObject implements ICBreakpointMana
*/
public ICCatchpoint setCatchpoint(int type, ICCatchEvent event, String expression,
ICCondition condition) throws CDIException {
// throw new CDIException();
return null;
}
@ -176,6 +204,29 @@ public class BreakpointManager extends SessionObject implements ICBreakpointMana
*/
public ICWatchpoint setWatchpoint(int type, int watchType, String expression,
ICCondition condition) throws CDIException {
return null;
boolean access = (type == ICWatchpoint.WRITE);
boolean read = (type == ICWatchpoint.READ);
CSession s = getCSession();
CommandFactory factory = s.getMISession().getCommandFactory();
MIBreakWatch breakWatch = factory.createMIBreakWatch(access, read, expression);
MIBreakPoint[] points = null;
try {
s.getMISession().postCommand(breakWatch);
MIBreakWatchInfo info = breakWatch.getMIBreakWatchInfo();
if (info == null) {
//throw new CDIException();
}
points = info.getBreakPoints();
if (points == null || points.length == 0) {
//throw new CDIException();
}
} catch (MIException e) {
// throw new CDIException(e);
}
Breakpoint bkpt= new Breakpoint(this, points[0]);
breakList.add(bkpt);
return bkpt;
}
}

View file

@ -108,6 +108,10 @@ public class CSession implements ICSession {
return new ICTarget[]{ctarget};
}
public ICTarget getCTarget() {
return ctarget;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICSession#isTerminated()
*/

View file

@ -9,7 +9,6 @@ import java.io.InputStream;
import java.io.OutputStream;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICSession;
import org.eclipse.cdt.debug.core.cdi.model.ICExpression;
import org.eclipse.cdt.debug.core.cdi.model.ICGlobalVariable;
import org.eclipse.cdt.debug.core.cdi.model.ICMemoryBlock;
@ -18,6 +17,20 @@ import org.eclipse.cdt.debug.core.cdi.model.ICRegisterGroup;
import org.eclipse.cdt.debug.core.cdi.model.ICSharedLibrary;
import org.eclipse.cdt.debug.core.cdi.model.ICTarget;
import org.eclipse.cdt.debug.core.cdi.model.ICThread;
import org.eclipse.cdt.debug.core.cdi.model.ICValue;
import org.eclipse.cdt.debug.mi.core.MIException;
import org.eclipse.cdt.debug.mi.core.MISession;
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
import org.eclipse.cdt.debug.mi.core.command.MIExecContinue;
import org.eclipse.cdt.debug.mi.core.command.MIExecFinish;
import org.eclipse.cdt.debug.mi.core.command.MIExecInterrupt;
import org.eclipse.cdt.debug.mi.core.command.MIExecNext;
import org.eclipse.cdt.debug.mi.core.command.MIExecNextInstruction;
import org.eclipse.cdt.debug.mi.core.command.MIExecRun;
import org.eclipse.cdt.debug.mi.core.command.MIExecStep;
import org.eclipse.cdt.debug.mi.core.command.MIExecStepInstruction;
import org.eclipse.cdt.debug.mi.core.command.MITargetDetach;
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
/**
* @author alain
@ -37,6 +50,18 @@ public class CTarget extends SessionObject implements ICTarget {
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#disconnect()
*/
public void disconnect() throws CDIException {
MISession mi = getCSession().getMISession();
CommandFactory factory = mi.getCommandFactory();
MITargetDetach detach = factory.createMITargetDetach();
try {
mi.postCommand(detach);
MIInfo info = detach.getMIInfo();
if (info == null) {
// throw new CDIException();
}
} catch (MIException e) {
//throw new CDIException(e);
}
}
/**
@ -58,6 +83,18 @@ public class CTarget extends SessionObject implements ICTarget {
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#finish()
*/
public void finish() throws CDIException {
MISession mi = getCSession().getMISession();
CommandFactory factory = mi.getCommandFactory();
MIExecFinish finish = factory.createMIExecFinish();
try {
mi.postCommand(finish);
MIInfo info = finish.getMIInfo();
if (info == null) {
// throw new CDIException();
}
} catch (MIException e) {
//throw new CDIException(e);
}
}
/**
@ -72,27 +109,27 @@ public class CTarget extends SessionObject implements ICTarget {
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#getErrorStream()
*/
public InputStream getErrorStream() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#getGlobalVariables()
*/
public ICGlobalVariable[] getGlobalVariables() throws CDIException {
return null;
return getCSession().getMISession().getMIProcess().getErrorStream();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#getInputStream()
*/
public InputStream getInputStream() {
return null;
return getCSession().getMISession().getMIProcess().getInputStream();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#getOutputStream()
*/
public OutputStream getOutputStream() {
return getCSession().getMISession().getMIProcess().getOutputStream();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#getGlobalVariables()
*/
public ICGlobalVariable[] getGlobalVariables() throws CDIException {
return null;
}
@ -107,7 +144,7 @@ public class CTarget extends SessionObject implements ICTarget {
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#getSharedLibraries()
*/
public ICSharedLibrary[] getSharedLibraries() throws CDIException {
return null;
return new ICSharedLibrary[0];
}
/**
@ -135,76 +172,165 @@ public class CTarget extends SessionObject implements ICTarget {
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#isStepping()
*/
public boolean isStepping() {
return false;
return getCSession().getMISession().getMIProcess().isRunning();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#isSuspended()
*/
public boolean isSuspended() {
return false;
return getCSession().getMISession().getMIProcess().isSuspended();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#isTerminated()
*/
public boolean isTerminated() {
return false;
return getCSession().getMISession().getMIProcess().isTerminated();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#restart()
*/
public void restart() throws CDIException {
MISession mi = getCSession().getMISession();
CommandFactory factory = mi.getCommandFactory();
MIExecRun run = factory.createMIExecRun(new String[0]);
try {
mi.postCommand(run);
MIInfo info = run.getMIInfo();
if (info == null) {
// throw new CDIException();
}
} catch (MIException e) {
//throw new CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#resume()
*/
public void resume() throws CDIException {
MISession mi = getCSession().getMISession();
if (mi.getMIProcess().isSuspended()) {
CommandFactory factory = mi.getCommandFactory();
MIExecContinue cont = factory.createMIExecContinue();
try {
mi.postCommand(cont);
MIInfo info = cont.getMIInfo();
if (info == null) {
// throw new CDIException();
}
} catch (MIException e) {
//throw new CDIException(e);
}
} else {
restart();
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#stepInto()
*/
public void stepInto() throws CDIException {
MISession mi = getCSession().getMISession();
CommandFactory factory = mi.getCommandFactory();
MIExecStep step = factory.createMIExecStep();
try {
mi.postCommand(step);
MIInfo info = step.getMIInfo();
if (info == null) {
// throw new CDIException();
}
} catch (MIException e) {
//throw new CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#stepIntoInstruction()
*/
public void stepIntoInstruction() throws CDIException {
MISession mi = getCSession().getMISession();
CommandFactory factory = mi.getCommandFactory();
MIExecStepInstruction stepi = factory.createMIExecStepInstruction();
try {
mi.postCommand(stepi);
MIInfo info = stepi.getMIInfo();
if (info == null) {
// throw new CDIException();
}
} catch (MIException e) {
//throw new CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#stepOver()
*/
public void stepOver() throws CDIException {
MISession mi = getCSession().getMISession();
CommandFactory factory = mi.getCommandFactory();
MIExecNext next = factory.createMIExecNext();
try {
mi.postCommand(next);
MIInfo info = next.getMIInfo();
if (info == null) {
// throw new CDIException();
}
} catch (MIException e) {
//throw new CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#stepOverInstruction()
*/
public void stepOverInstruction() throws CDIException {
MISession mi = getCSession().getMISession();
CommandFactory factory = mi.getCommandFactory();
MIExecNextInstruction nexti = factory.createMIExecNextInstruction();
try {
mi.postCommand(nexti);
MIInfo info = nexti.getMIInfo();
if (info == null) {
// throw new CDIException();
}
} catch (MIException e) {
//throw new CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#suspend()
*/
public void suspend() throws CDIException {
MISession mi = getCSession().getMISession();
CommandFactory factory = mi.getCommandFactory();
MIExecInterrupt interrupt = factory.createMIExecInterrupt();
try {
mi.postCommand(interrupt);
MIInfo info = interrupt.getMIInfo();
if (info == null) {
// throw new CDIException();
}
} catch (MIException e) {
//throw new CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#terminate()
*/
public void terminate() throws CDIException {
getCSession().getMISession().getMIProcess().destroy();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getCDITarget()
*/
public ICTarget getCDITarget() {
return null;
return this;
}
/**
@ -221,4 +347,20 @@ public class CTarget extends SessionObject implements ICTarget {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#evaluateExpressionToString(String)
*/
public String evaluateExpressionToString(String expressionText)
throws CDIException {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICTarget#evaluateExpressionToValue(String)
*/
public ICValue evaluateExpressionToValue(String expressionText)
throws CDIException {
return null;
}
}

View file

@ -0,0 +1,37 @@
package org.eclipse.cdt.debug.mi.core.cdi;
import org.eclipse.cdt.debug.core.cdi.event.ICEvent;
import org.eclipse.cdt.debug.mi.core.event.MIBreakpointEvent;
import org.eclipse.cdt.debug.mi.core.event.MIEvent;
import org.eclipse.cdt.debug.mi.core.event.MIExitEvent;
import org.eclipse.cdt.debug.mi.core.event.MIFunctionFinishedEvent;
import org.eclipse.cdt.debug.mi.core.event.MIInferiorExitEvent;
import org.eclipse.cdt.debug.mi.core.event.MILocationReachedEvent;
import org.eclipse.cdt.debug.mi.core.event.MISignalEvent;
import org.eclipse.cdt.debug.mi.core.event.MIStepEvent;
import org.eclipse.cdt.debug.mi.core.event.MIWatchpointEvent;
/**
* @author alain
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class EventAdapter {
public static ICEvent getCEvent(final CSession session, final MIEvent miEvent) {
if (miEvent instanceof MIBreakpointEvent) {
return new SuspendedEvent(session, (MIBreakpointEvent)miEvent);
} else if (miEvent instanceof MIInferiorExitEvent) {
} else if (miEvent instanceof MIExitEvent) {
} else if (miEvent instanceof MIFunctionFinishedEvent) {
} else if (miEvent instanceof MILocationReachedEvent) {
} else if (miEvent instanceof MISignalEvent) {
} else if (miEvent instanceof MIStepEvent) {
} else if (miEvent instanceof MIWatchpointEvent) {
}
return null;
}
}

View file

@ -5,9 +5,16 @@
*/
package org.eclipse.cdt.debug.mi.core.cdi;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import org.eclipse.cdt.debug.core.cdi.ICEventManager;
import org.eclipse.cdt.debug.core.cdi.ICSession;
import org.eclipse.cdt.debug.core.cdi.event.ICEventListener;
import org.eclipse.cdt.debug.mi.core.MISession;
import org.eclipse.cdt.debug.mi.core.event.MIEvent;
/**
* @author alain
@ -19,6 +26,21 @@ import org.eclipse.cdt.debug.core.cdi.event.ICEventListener;
*/
public class EventManager extends SessionObject implements ICEventManager {
Map map = Collections.synchronizedMap(new HashMap());
class CDIObserver implements Observer {
ICEventListener listener;
public CDIObserver(ICEventListener l) {
listener = l;
}
public void update(Observable o, Object args) {
MIEvent[] events = (MIEvent[])args;
for (int i = 0; i < events.length; i++) {
// listener.handleDebugEvent(new CEventAdapter(events[i]));
}
}
}
public EventManager(CSession session) {
super(session);
}
@ -27,12 +49,20 @@ public class EventManager extends SessionObject implements ICEventManager {
* @see org.eclipse.cdt.debug.core.cdi.ICEventManager#addEventListener(ICEventListener)
*/
public void addEventListener(ICEventListener listener) {
CDIObserver cdiObserver = new CDIObserver(listener);
map.put(listener, cdiObserver);
MISession session = getCSession().getMISession();
session.addObserver(cdiObserver);
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICEventManager#removeEventListener(ICEventListener)
*/
public void removeEventListener(ICEventListener listener) {
CDIObserver cdiObserver = (CDIObserver)map.remove(listener);
if (cdiObserver != null) {
MISession session = getCSession().getMISession();
session.deleteObserver(cdiObserver);
}
}
}

View file

@ -0,0 +1,54 @@
package org.eclipse.cdt.debug.mi.core.cdi;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.model.ICExpression;
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.ICValue;
/**
* @author alain
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class Expression implements ICExpression {
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICExpression#getExpressionText()
*/
public String getExpressionText() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICExpression#getValue()
*/
public ICValue getValue() throws CDIException {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getCDITarget()
*/
public ICTarget getCDITarget() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getId()
*/
public String getId() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getParent()
*/
public ICObject getParent() {
return null;
}
}

View file

@ -0,0 +1,70 @@
package org.eclipse.cdt.debug.mi.core.cdi;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICLocation;
import org.eclipse.cdt.debug.core.cdi.model.ICInstruction;
/**
* @author alain
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class Location implements ICLocation {
long addr;
String file = "";
String function = "";
int line;
public Location(String f, String fnct, int l, long a) {
file = f;
function = fnct;
line = l;
addr = a;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICLocation#getAddress()
*/
public long getAddress() {
return addr;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICLocation#getFile()
*/
public String getFile() {
return file;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICLocation#getFunction()
*/
public String getFunction() {
return function;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICLocation#getInstructions()
*/
public ICInstruction[] getInstructions() throws CDIException {
return new ICInstruction[0];
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICLocation#getInstructions(int)
*/
public ICInstruction[] getInstructions(int maxCount) throws CDIException {
return new ICInstruction[0];
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICLocation#getLineNumber()
*/
public int getLineNumber() {
return line;
}
}

View file

@ -0,0 +1,107 @@
package org.eclipse.cdt.debug.mi.core.cdi;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICLocation;
import org.eclipse.cdt.debug.core.cdi.model.ICArgument;
import org.eclipse.cdt.debug.core.cdi.model.ICObject;
import org.eclipse.cdt.debug.core.cdi.model.ICStackFrame;
import org.eclipse.cdt.debug.core.cdi.model.ICTarget;
import org.eclipse.cdt.debug.core.cdi.model.ICVariable;
import org.eclipse.cdt.debug.mi.core.MIException;
import org.eclipse.cdt.debug.mi.core.MISession;
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
import org.eclipse.cdt.debug.mi.core.command.MIStackListLocals;
import org.eclipse.cdt.debug.mi.core.output.MIArg;
import org.eclipse.cdt.debug.mi.core.output.MIFrame;
import org.eclipse.cdt.debug.mi.core.output.MIStackListLocalsInfo;
/**
* @author alain
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class StackFrame implements ICStackFrame {
CSession session;
MIFrame frame;
public StackFrame(CSession s, MIFrame f) {
session = s;
frame = f;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICStackFrame#getArguments()
*/
public ICArgument[] getArguments() throws CDIException {
MIArg[] args = frame.getArgs();
ICArgument[] cargs = new ICArgument[args.length];
for (int i = 0; i < cargs.length; i++) {
cargs[i] = new Argument(args[i]);
}
return cargs;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICStackFrame#getLocalVariables()
*/
public ICVariable[] getLocalVariables() throws CDIException {
MIArg[] args = null;
ICVariable[] variables = null;
MISession mi = session.getMISession();
CommandFactory factory = mi.getCommandFactory();
MIStackListLocals locals = factory.createMIStackListLocals(true);
try {
mi.postCommand(locals);
MIStackListLocalsInfo info = locals.getMIStackListLocalsInfo();
if (info == null) {
// throw new CDIException();
}
args = info.getLocals();
} catch (MIException e) {
//throw new CDIException(e);
}
if (args != null) {
variables = new ICVariable[args.length];
for (int i = 0; i < variables.length; i++) {
variables[i] = new Variable(args[i]);
}
} else {
variables = new ICVariable[0];
}
return variables;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICStackFrame#getLocation()
*/
public ICLocation getLocation() {
return new Location(frame.getFile(), frame.getFunction(),
frame.getLine(), frame.getAddress());
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getCDITarget()
*/
public ICTarget getCDITarget() {
return session.getCTarget();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getId()
*/
public String getId() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getParent()
*/
public ICObject getParent() {
return null;
}
}

View file

@ -0,0 +1,53 @@
package org.eclipse.cdt.debug.mi.core.cdi;
import org.eclipse.cdt.debug.core.cdi.ICLocation;
import org.eclipse.cdt.debug.core.cdi.ICSessionObject;
import org.eclipse.cdt.debug.core.cdi.event.ICEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICSuspendedEvent;
import org.eclipse.cdt.debug.core.cdi.model.ICArgument;
import org.eclipse.cdt.debug.core.cdi.model.ICObject;
import org.eclipse.cdt.debug.core.cdi.model.ICStackFrame;
import org.eclipse.cdt.debug.core.cdi.model.ICTarget;
import org.eclipse.cdt.debug.core.cdi.model.ICVariable;
import org.eclipse.cdt.debug.mi.core.event.MIBreakpointEvent;
import org.eclipse.cdt.debug.mi.core.event.MIEvent;
import org.eclipse.cdt.debug.mi.core.event.MIExitEvent;
import org.eclipse.cdt.debug.mi.core.event.MIFunctionFinishedEvent;
import org.eclipse.cdt.debug.mi.core.event.MILocationReachedEvent;
import org.eclipse.cdt.debug.mi.core.event.MISignalEvent;
import org.eclipse.cdt.debug.mi.core.event.MIStepEvent;
import org.eclipse.cdt.debug.mi.core.event.MIWatchpointEvent;
/**
* @author alain
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class SuspendedEvent implements ICSuspendedEvent {
MIBreakpointEvent event;
CSession session;
public SuspendedEvent(CSession s, MIBreakpointEvent e) {
session = s;
event = e;
}
public ICSessionObject getReason() {
return new SessionObject(session);
}
public ICStackFrame getStackFrame() {
return new StackFrame(session, event.getMIFrame());
}
/**
* @see org.eclipse.cdt.debug.core.cdi.event.ICEvent#getSource()
*/
public ICObject getSource() {
return null;
}
}

View file

@ -0,0 +1,66 @@
package org.eclipse.cdt.debug.mi.core.cdi;
import org.eclipse.cdt.debug.core.cdi.CDIException;
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.ICValue;
import org.eclipse.cdt.debug.core.cdi.model.ICVariable;
/**
* @author alain
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class Value implements ICValue {
String val = "";
public Value(String s) {
val = s;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICValue#getTypeName()
*/
public String getTypeName() throws CDIException {
return "";
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICValue#getValueString()
*/
public String getValueString() throws CDIException {
return val;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICValue#getVariables()
*/
public ICVariable[] getVariables() throws CDIException {
return new ICVariable[0];
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getCDITarget()
*/
public ICTarget getCDITarget() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getId()
*/
public String getId() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getParent()
*/
public ICObject getParent() {
return null;
}
}

View file

@ -0,0 +1,86 @@
package org.eclipse.cdt.debug.mi.core.cdi;
import org.eclipse.cdt.debug.core.cdi.CDIException;
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.ICValue;
import org.eclipse.cdt.debug.core.cdi.model.ICVariable;
import org.eclipse.cdt.debug.mi.core.output.MIArg;
/**
* @author alain
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class Variable implements ICVariable {
MIArg arg;
public Variable(MIArg a) {
arg = a;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#getName()
*/
public String getName() throws CDIException {
return arg.getName();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#getTypeName()
*/
public String getTypeName() throws CDIException {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#getValue()
*/
public ICValue getValue() throws CDIException {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#hasValueChanged()
*/
public boolean hasValueChanged() throws CDIException {
return false;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#setValue(ICValue)
*/
public void setValue(ICValue value) throws CDIException {
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICVariable#setValue(String)
*/
public void setValue(String expression) throws CDIException {
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getCDITarget()
*/
public ICTarget getCDITarget() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getId()
*/
public String getId() {
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICObject#getParent()
*/
public ICObject getParent() {
return null;
}
}

View file

@ -27,8 +27,15 @@ public class CLICommand extends Command
* @return the text representation of this command
*/
public String toString(){
if (operation.endsWith("\n"))
return operation;
return operation + "\n";
String str = null;
int t = getToken();
if (t > 0) {
str = Integer.toString(t) + " " + operation;
} else {
str = operation;
}
if (str.endsWith("\n"))
return str;
return str + "\n";
}
}

View file

@ -94,6 +94,10 @@ public class CommandFactory {
return new MIEnvironmentPWD();
}
public MIExecAbort createMIExecAbort() {
return new MIExecAbort();
}
public MIExecArguments createMIExecArguments(String[] args) {
return new MIExecArguments(args);
}
@ -158,6 +162,10 @@ public class CommandFactory {
return new MIGDBShow(params);
}
public MIGDBShowExitCode createMIGDBShowExitCode() {
return new MIGDBShowExitCode();
}
public MIStackInfoDepth createMIStackInfoDepth(int depth) {
return new MIStackInfoDepth(depth);
}
@ -182,6 +190,10 @@ public class CommandFactory {
return new MIStackSelectFrame(frameNum);
}
public MITargetAttach createMITargetAttach(int pid) {
return new MITargetAttach(pid);
}
public MITargetDetach createMITargetDetach() {
return new MITargetDetach();
}

View file

@ -40,6 +40,10 @@ public class MIBreakWatch extends MICommand
setParameters(new String[]{expr});
}
public MIBreakWatchInfo getMIBreakWatchInfo() throws MIException {
return (MIBreakWatchInfo)getMIInfo();
}
public MIInfo getMIInfo() throws MIException {
MIInfo info = null;
MIOutput out = getMIOutput();

View file

@ -0,0 +1,23 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.mi.core.command;
/**
*
* -exec-finish
*
* Asynchronous command. Resumes the execution of the inferior program
* until the current function is exited. Displays the results returned by
* the function.
*
*/
public class MIExecAbort extends CLICommand
{
public MIExecAbort() {
super("kill");
}
}

View file

@ -18,8 +18,7 @@ import org.eclipse.cdt.debug.mi.core.output.MIOutput;
* Show the current value of a GDB variable.
*
*/
public class MIGDBShow extends MICommand
{
public class MIGDBShow extends MICommand {
public MIGDBShow(String[] params) {
super("-gdb-show", params);
}
@ -34,5 +33,5 @@ public class MIGDBShow extends MICommand
}
}
return info;
}
}
}

View file

@ -0,0 +1,40 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.mi.core.command;
import org.eclipse.cdt.debug.mi.core.MIException;
import org.eclipse.cdt.debug.mi.core.output.MIGDBShowExitCodeInfo;
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
import org.eclipse.cdt.debug.mi.core.output.MIOutput;
/**
*
* -gdb-show
*
* Show the current value of a GDB variable.
*
*/
public class MIGDBShowExitCode extends MIGDBShow {
public MIGDBShowExitCode() {
super(new String[] { "convenience", "$_exitcode" });
}
public MIGDBShowExitCodeInfo getMIGDBShowExitCodeInfo() throws MIException {
return (MIGDBShowExitCodeInfo)getMIInfo();
}
public MIInfo getMIInfo() throws MIException {
MIInfo info = null;
MIOutput out = getMIOutput();
if (out != null) {
info = new MIGDBShowExitCodeInfo(out);
if (info.isError()) {
throw new MIException(info.getErrorMsg());
}
}
return info;
}
}

View file

@ -31,6 +31,10 @@ public class MIStackListLocals extends MICommand
}
}
public MIStackListLocalsInfo getMIStackListLocalsInfo() throws MIException {
return (MIStackListLocalsInfo)getMIInfo();
}
public MIInfo getMIInfo() throws MIException {
MIInfo info = null;
MIOutput out = getMIOutput();

View file

@ -14,9 +14,9 @@ package org.eclipse.cdt.debug.mi.core.command;
* Attach to a process PID or a file FILE outside of GDB.
*
*/
public class MITargetAttach extends MICommand
public class MITargetAttach extends CLICommand
{
public MITargetAttach(int pid) {
super("-target-attach", new String[]{Integer.toString(pid)});
super("attach " + Integer.toString(pid));
}
}

View file

@ -39,7 +39,7 @@ public class MIBreakpointEvent extends MIEvent {
return threadId;
}
public MIFrame getFrame() {
public MIFrame getMIFrame() {
return frame;
}

View file

@ -3,8 +3,7 @@ package org.eclipse.cdt.debug.mi.core.event;
/**
* *stopped,reason="exited-normally"
*
* Gdb Session terminated.
*/
public class MIExitEvent extends MIEvent {
}

View file

@ -0,0 +1,10 @@
package org.eclipse.cdt.debug.mi.core.event;
/**
* *stopped,reason="exited-normally"
*
*/
public class MIInferiorExitEvent extends MIEvent {
}

View file

@ -12,6 +12,12 @@ import java.util.List;
/**
* -break-insert main
* ^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x08048468",func="main",file="hello.c",line="4",times="0"}
* -break-insert -a p
* ^done,hw-awpt={number="2",exp="p"}
* -break-watch -r p
* ^done,hw-rwpt={number="4",exp="p"}
* -break-watch p
* ^done,wpt={number="6",exp="p"}
*/
public class MIBreakInsertInfo extends MIInfo {
@ -26,11 +32,28 @@ public class MIBreakInsertInfo extends MIInfo {
MIResult[] results = rr.getMIResults();
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
MIValue val = results[i].getMIValue();
MIBreakPoint bpt = null;
if (var.equals("bkpt")) {
MIValue val = results[i].getMIValue();
if (val instanceof MITuple) {
aList.add(new MIBreakPoint((MITuple)val));
bpt = new MIBreakPoint((MITuple)val);
bpt.setEnabled(true);
}
} else if (var.equals("hw-awpt")) {
if (val instanceof MITuple) {
bpt = new MIBreakPoint((MITuple)val);
bpt.setAccessWatchpoint(true);
bpt.setEnabled(true);
}
} else if (var.equals("hw-rwpt")) {
if (val instanceof MITuple) {
bpt = new MIBreakPoint((MITuple)val);
bpt.setReadWatchpoint(true);
bpt.setEnabled(true);
}
}
if (bpt != null) {
aList.add(bpt);
}
}
}

View file

@ -12,6 +12,8 @@ import java.util.List;
* A -break-list result-record is the form:
* <pre>
* ^done,BreakpointTable={nr_rows="1",nr_cols="6",hdr=[..],body=[brkpt={},brkpt={}]}
*-break-list
^done,BreakpointTable={nr_rows="6",nr_cols="6",hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",times="0"},bkpt={number="2",type="breakpoint",disp="del",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",times="0"},bkpt={number="3",type="breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",cond="1",times="0"},bkpt={number="4",type="hw breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",times="0"},bkpt={number="5",type="breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",thread="0",thread="0",times="0"},bkpt={number="6",type="breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",thread="1",thread="1",times="0"}]}
* </pre>
*/
public class MIBreakListInfo extends MIInfo {

View file

@ -7,12 +7,40 @@ package org.eclipse.cdt.debug.mi.core.output;
/**
* Contain info about the GDB/MI breakpoint info.
* -break-insert -t -c 2 main
* ^done,bkpt={number="1",type="breakpoint",disp="del",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",cond="2",times="0"}
* (gdb)
* -break-insert -h -i 2 main
* ^done,bkpt={number="2",type="hw breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",times="0",ignore="2"}
* (gdb)
*<ul>
* <li>
* -break-insert main
* ^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",times="0"}
* (gdb)
* </li>
* <li>
* -break-insert -t main
* ^done,bkpt={number="2",type="breakpoint",disp="del",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",times="0"}
* </li>
* <li>
* -break-insert -c 1 main
^done,bkpt={number="3",type="breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",cond="1",times="0"}
* </li>
* <li>
* -break-insert -h main
* ^done,bkpt={number="4",type="hw breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",times="0"}
* <li>
* -break-insert -p 0 main
* ^done,bkpt={number="5",type="breakpoint",disp="keep",enabled="y",addr="0x0804846b",func="main",file="hello.c",line="4",thread="0",thread="0",times="0"}
* </li>
* <li>
* -break-insert -a p
* ^done,hw-awpt={number="2",exp="p"}
* </li>
* <li>
* -break-watch -r p
* ^done,hw-rwpt={number="4",exp="p"}
* </li>
* <li>
* -break-watch p
* ^done,wpt={number="6",exp="p"}
* </li>
*</ul>
*/
public class MIBreakPoint {
@ -24,11 +52,16 @@ public class MIBreakPoint {
String func = "";
String file = "";
int line;
String cond = "";
int times;
String what = "";
String cond = "";
String threadId = "";
int ignore;
boolean isWpt;
boolean isAWpt;
boolean isRWpt;
public MIBreakPoint(MITuple tuple) {
parse(tuple);
}
@ -41,6 +74,40 @@ public class MIBreakPoint {
return type;
}
public boolean isHardware() {
return getType().startsWith("hw") || isWatchpoint();
}
public boolean isTemporary() {
return getDisposition().equals("del");
}
public boolean isWatchpoint() {
return isWpt;
}
public void setWatcpoint(boolean w) {
isWpt = w;
}
public boolean isAccessWatchpoint() {
return isAWpt;
}
public void setAccessWatchpoint(boolean a) {
isWpt = a;
isAWpt = a;
}
public boolean isReadWatchpoint() {
return isRWpt;
}
public void setReadWatchpoint(boolean r) {
isWpt = r;
isRWpt = r;
}
public String getDisposition() {
return disp;
}
@ -85,6 +152,10 @@ public class MIBreakPoint {
return cond;
}
public String getThreadId() {
return threadId;
}
void parse(MITuple tuple) {
MIResult[] results = tuple.getMIResults();
for (int i = 0; i < results.length; i++) {
@ -115,6 +186,8 @@ public class MIBreakPoint {
func = str;
} else if (var.equals("file")) {
file = str;
} else if (var.equals("thread")) {
threadId = str;
} else if (var.equals("line")) {
try {
line = Integer.parseInt(str.trim());

View file

@ -5,50 +5,14 @@
package org.eclipse.cdt.debug.mi.core.output;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.debug.mi.core.command.MIBreakInsert;
/**
* -break-watch buf
* ^done,wpt={number="2",exp="buf"}
*/
public class MIBreakWatchInfo extends MIInfo {
MIBreakPoint[] watchpoints = null;
public class MIBreakWatchInfo extends MIBreakInsertInfo {
public MIBreakWatchInfo(MIOutput rr) {
super(rr);
}
public MIBreakPoint[] getBreakpoints () {
if (watchpoints == null) {
parse();
}
return watchpoints;
}
void parse() {
List aList = new ArrayList(1);
if (isDone()) {
MIOutput out = getMIOutput();
MIResultRecord rr = out.getMIResultRecord();
if (rr != null) {
MIResult[] results = rr.getMIResults();
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
if (var.equals("wpt")) {
MIValue val = results[i].getMIValue();
if (val instanceof MITuple) {
aList.add(new MIBreakPoint((MITuple)val));
}
}
}
}
}
watchpoints = (MIBreakPoint[])aList.toArray(new MIBreakPoint[aList.size()]);
}
}

View file

@ -11,8 +11,8 @@ public class MIFrame {
int level;
long addr;
String func;
String file;
String func = "";
String file = "";
int line;
MIArg[] args = new MIArg[0];
@ -24,10 +24,22 @@ public class MIFrame {
return args;
}
public String getFile() {
return file;
}
public String getFunction() {
return func;
}
public int getLine() {
return line;
}
public long getAddress() {
return addr;
}
public int getLevel() {
return level;
}

View file

@ -0,0 +1,54 @@
/*
* (c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.debug.mi.core.output;
import java.util.ArrayList;
import java.util.List;
/**
* GDB/MI show parsing.
* (gdb)
* -gdb-show convenience $_exitcode
* ~"$_exitcode = 0"
* ~"\n"
* ^done
*/
public class MIGDBShowExitCodeInfo extends MIInfo {
int code;
public MIGDBShowExitCodeInfo(MIOutput o) {
super(o);
parse();
}
public int getCode() {
return code;
}
void parse() {
if (isDone()) {
MIOutput out = getMIOutput();
MIOOBRecord[] oobs = out.getMIOOBRecords();
for (int i = 0; i < oobs.length; i++) {
if (oobs[i] instanceof MIConsoleStreamOutput) {
MIStreamRecord cons = (MIStreamRecord)oobs[i];
String str = cons.getString();
if (str.startsWith("$_exitcode")) {
int j = str.indexOf('=');
if (j != -1) {
String sub = str.substring(j + 1).trim();
try {
code = Integer.parseInt(sub);
} catch (NumberFormatException e) {
}
}
}
}
}
}
}
}

View file

@ -7,6 +7,8 @@ package org.eclipse.cdt.debug.mi.core.output;
/**
* GDB/MI stack list locals parsing.
* -stack-list-locals 1
* ^done,locals=[{name="p",value="0x8048600 \"ghislaine\""},{name="buf",value="\"'\", 'x' <repeats 24 times>, \"i,xxxxxxxxx\", 'a' <repeats 24 times>"},{name="buf2",value="\"\\\"?'\\\\()~\""},{name="buf3",value="\"alain\""},{name="buf4",value="\"\\t\\t\\n\\f\\r\""},{name="i",value="0"}]
*/
public class MIStackListLocalsInfo extends MIInfo {

View file

@ -8,4 +8,6 @@ package org.eclipse.cdt.debug.mi.core.output;
* @see MIStreamRecord
*/
public class MITargetStreamOutput extends MIStreamRecord {
public static final String startTag = "@";
}