/*******************************************************************************
* Copyright (c) 2000, 2010 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Ken Ryall (Nokia) - 175532 support the address to source location API
* Alena Laskavaia (QNX) - Bug 221224
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.cdi.model;
import java.io.File;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICDIAddressLocation;
import org.eclipse.cdt.debug.core.cdi.ICDICondition;
import org.eclipse.cdt.debug.core.cdi.ICDIFileLocation;
import org.eclipse.cdt.debug.core.cdi.ICDIFunctionLocation;
import org.eclipse.cdt.debug.core.cdi.ICDILineLocation;
import org.eclipse.cdt.debug.core.cdi.ICDILocation;
import org.eclipse.cdt.debug.core.cdi.model.ICDIAddressBreakpoint;
import org.eclipse.cdt.debug.core.cdi.model.ICDIAddressToSource;
import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint;
import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement3;
import org.eclipse.cdt.debug.core.cdi.model.ICDIEventBreakpoint;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExceptionpoint;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteMoveInstructionPointer;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression;
import org.eclipse.cdt.debug.core.cdi.model.ICDIFunctionBreakpoint;
import org.eclipse.cdt.debug.core.cdi.model.ICDIGlobalVariable;
import org.eclipse.cdt.debug.core.cdi.model.ICDIGlobalVariableDescriptor;
import org.eclipse.cdt.debug.core.cdi.model.ICDIInstruction;
import org.eclipse.cdt.debug.core.cdi.model.ICDILineBreakpoint;
import org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlock;
import org.eclipse.cdt.debug.core.cdi.model.ICDIMixedInstruction;
import org.eclipse.cdt.debug.core.cdi.model.ICDIRegister;
import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterDescriptor;
import org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterGroup;
import org.eclipse.cdt.debug.core.cdi.model.ICDIRuntimeOptions;
import org.eclipse.cdt.debug.core.cdi.model.ICDISharedLibrary;
import org.eclipse.cdt.debug.core.cdi.model.ICDISignal;
import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
import org.eclipse.cdt.debug.core.cdi.model.ICDITargetConfiguration;
import org.eclipse.cdt.debug.core.cdi.model.ICDIThread;
import org.eclipse.cdt.debug.core.cdi.model.ICDIWatchpoint;
import org.eclipse.cdt.debug.core.model.ICBreakpointType;
import org.eclipse.cdt.debug.mi.core.CoreProcess;
import org.eclipse.cdt.debug.mi.core.MIException;
import org.eclipse.cdt.debug.mi.core.MIInferior;
import org.eclipse.cdt.debug.mi.core.MISession;
import org.eclipse.cdt.debug.mi.core.RxThread;
import org.eclipse.cdt.debug.mi.core.cdi.BreakpointManager;
import org.eclipse.cdt.debug.mi.core.cdi.CdiResources;
import org.eclipse.cdt.debug.mi.core.cdi.EventManager;
import org.eclipse.cdt.debug.mi.core.cdi.ExpressionManager;
import org.eclipse.cdt.debug.mi.core.cdi.MI2CDIException;
import org.eclipse.cdt.debug.mi.core.cdi.MemoryManager;
import org.eclipse.cdt.debug.mi.core.cdi.RegisterManager;
import org.eclipse.cdt.debug.mi.core.cdi.Session;
import org.eclipse.cdt.debug.mi.core.cdi.SessionObject;
import org.eclipse.cdt.debug.mi.core.cdi.SharedLibraryManager;
import org.eclipse.cdt.debug.mi.core.cdi.SignalManager;
import org.eclipse.cdt.debug.mi.core.cdi.SourceManager;
import org.eclipse.cdt.debug.mi.core.cdi.VariableManager;
import org.eclipse.cdt.debug.mi.core.command.CLIInfoLine;
import org.eclipse.cdt.debug.mi.core.command.CLIInfoThreads;
import org.eclipse.cdt.debug.mi.core.command.CLIJump;
import org.eclipse.cdt.debug.mi.core.command.CLISignal;
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
import org.eclipse.cdt.debug.mi.core.command.MIDataEvaluateExpression;
import org.eclipse.cdt.debug.mi.core.command.MIExecContinue;
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.MIExecUntil;
import org.eclipse.cdt.debug.mi.core.command.MIGDBShowEndian;
import org.eclipse.cdt.debug.mi.core.command.MITargetDetach;
import org.eclipse.cdt.debug.mi.core.command.MIThreadSelect;
import org.eclipse.cdt.debug.mi.core.event.MIDetachedEvent;
import org.eclipse.cdt.debug.mi.core.event.MIThreadCreatedEvent;
import org.eclipse.cdt.debug.mi.core.event.MIThreadExitEvent;
import org.eclipse.cdt.debug.mi.core.output.CLIInfoLineInfo;
import org.eclipse.cdt.debug.mi.core.output.CLIInfoThreadsInfo;
import org.eclipse.cdt.debug.mi.core.output.MIDataEvaluateExpressionInfo;
import org.eclipse.cdt.debug.mi.core.output.MIFrame;
import org.eclipse.cdt.debug.mi.core.output.MIGDBShowEndianInfo;
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
import org.eclipse.cdt.debug.mi.core.output.MIThreadSelectInfo;
/**
*/
public class Target extends SessionObject implements ICDITarget, ICDIBreakpointManagement3, ICDIAddressToSource, ICDIExecuteMoveInstructionPointer {
MISession miSession;
ICDITargetConfiguration fConfiguration;
Thread[] noThreads = new Thread[0];
Thread[] currentThreads;
int currentThreadId;
String fEndian = null;
boolean suspended = true;
boolean deferBreakpoints = true;
final private Object lock = new Object();
public Target(Session s, MISession mi) {
super(s);
miSession = mi;
currentThreads = noThreads;
}
/**
* Return lock object for target. Replacement for <code>lockTarget</code> and
* <code>releaseTarget</code> methods.
* <p>
* Use as synchronization object:
* </p>
* new code:
*
* <pre>
* synchronized (target.getLock()) {
* ...
* }
* </pre>
*
* old code:
*
* <pre>
* target.lockTarget();
* try {
* ...
* } finally {
* target.releaseTarget();
* }
* </pre>
*
* @since 5.0
*/
public Object getLock() {
return lock;
}
public MISession getMISession() {
return miSession;
}
public void setConfiguration(ICDITargetConfiguration configuration) {
fConfiguration = configuration;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIObject#getTarget()
*/
public ICDITarget getTarget() {
return this;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#setCurrentThread(ICDIThread)
*/
public void setCurrentThread(ICDIThread cthread) throws CDIException {
if (cthread instanceof Thread) {
setCurrentThread(cthread, true);
} else {
throw new CDIException(CdiResources.getString("cdi.model.Target.Unknown_thread")); //$NON-NLS-1$
}
}
public void setCurrentThread(ICDIThread cthread, boolean doUpdate) throws CDIException {
if (cthread instanceof Thread) {
setCurrentThread((Thread)cthread, doUpdate);
} else {
throw new CDIException(CdiResources.getString("cdi.model.Target.Unknown_thread")); //$NON-NLS-1$
}
}
public synchronized void setSupended(boolean state) {
suspended = state;
notifyAll();
}
/**
*/
public void setCurrentThread(Thread cthread, boolean doUpdate) throws CDIException {
int id = cthread.getId();
// No need to set thread id 0, it is a dummy thread.
if (id == 0) {
return;
}
// already the current thread?
if (currentThreadId != id) {
CommandFactory factory = miSession.getCommandFactory();
MIThreadSelect select = factory.createMIThreadSelect(id);
try {
miSession.postCommand(select);
MIThreadSelectInfo info = select.getMIThreadSelectInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
currentThreadId = info.getNewThreadId();
// @^@^$*^$
// GDB reset the currentFrame to some other level 0 when switching thread.
// we need to reposition the current stack level.
MIFrame miFrame = info.getFrame();
if (miFrame != null) {
int depth = cthread.getStackFrameCount();
cthread.currentFrame = new StackFrame(cthread, miFrame, depth - miFrame.getLevel());
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
Session session = (Session)getSession();
// Resetting threads may change the value of
// some variables like Register. Call an update()
// To generate changeEvents.
if (doUpdate) {
RegisterManager regMgr = session.getRegisterManager();
if (regMgr.isAutoUpdate()) {
regMgr.update(this);
}
VariableManager varMgr = session.getVariableManager();
if (varMgr.isAutoUpdate()) {
varMgr.update(this);
}
}
}
// We should be allright now.
if (currentThreadId != id) {
// thread is gone. Generate a Thread destroyed.
miSession.fireEvent(new MIThreadExitEvent(miSession, id));
throw new CDIException(CdiResources.getString("cdi.model.Target.Cannot_switch_to_thread") + id); //$NON-NLS-1$
}
}
/**
* Called when stopping because of breakpoints etc ..
*/
public synchronized void updateState(int newThreadId) {
Thread[] oldThreads = currentThreads;
// If we use "info threads" in getCThreads() this
// will be overwritten. However if we use -stack-list-threads
// it does not provide to the current thread
synchronized (lock) {
try {
// get the new Threads.
currentThreadId = newThreadId;
currentThreads = getCThreads();
} catch (CDIException e) {
currentThreads = noThreads;
}
}
// Fire CreatedEvent for new threads.
// Replace the new threads with the old thread object
// User may have old on to the old Thread object.
List<Integer> cList = new ArrayList<Integer>(currentThreads.length);
for (int i = 0; i < currentThreads.length; i++) {
boolean found = false;
for (int j = 0; j < oldThreads.length; j++) {
if (currentThreads[i].getId() == oldThreads[j].getId()) {
oldThreads[j].clearState();
currentThreads[i] = oldThreads[j];
found = true;
break;
}
}
if (!found) {
cList.add(new Integer(currentThreads[i].getId()));
}
}
if (!cList.isEmpty()) {
MIThreadCreatedEvent[] events = new MIThreadCreatedEvent[cList.size()];
for (int j = 0; j < events.length; j++) {
int id = cList.get(j);
events[j] = new MIThreadCreatedEvent(miSession, id);
}
miSession.fireEvents(events);
}
// Fire destroyedEvent for old threads.
List<Integer> dList = new ArrayList<Integer>(oldThreads.length);
for (int i = 0; i < oldThreads.length; i++) {
boolean found = false;
for (int j = 0; j < currentThreads.length; j++) {
if (currentThreads[j].getId() == oldThreads[i].getId()) {
found = true;
break;
}
}
if (!found) {
dList.add(new Integer(oldThreads[i].getId()));
}
}
if (!dList.isEmpty()) {
MIThreadExitEvent[] events = new MIThreadExitEvent[dList.size()];
for (int j = 0; j < events.length; j++) {
int id = dList.get(j);
events[j] = new MIThreadExitEvent(miSession, id);
}
miSession.fireEvents(events);
}
}
/**
* Do the real work of call -thread-list-ids.
*/
public Thread[] getCThreads() throws CDIException {
Thread[] cthreads = noThreads;
synchronized (lock) {
RxThread rxThread = miSession.getRxThread();
rxThread.setEnableConsole(false);
try {
CommandFactory factory = miSession.getCommandFactory();
CLIInfoThreads tids = factory.createCLIInfoThreads();
// HACK/FIXME: gdb/mi thread-list-ids does not
// show any newly create thread, we workaround by
// issuing "info threads" instead.
// MIThreadListIds tids = factory.createMIThreadListIds();
// MIThreadListIdsInfo info = tids.getMIThreadListIdsInfo();
miSession.postCommand(tids);
CLIInfoThreadsInfo info = tids.getMIInfoThreadsInfo();
int[] ids;
String[] names;
if (info == null) {
ids = new int[0];
names = new String[0];
} else {
ids = info.getThreadIds();
names = info.getThreadNames();
currentThreadId = info.getCurrentThread();
}
if (ids != null && ids.length > 0) {
cthreads = new Thread[ids.length];
// Ok that means it is a multiThreaded.
if (names != null && names.length == ids.length) {
for (int i = 0; i < ids.length; i++) {
cthreads[i] = new Thread(this, ids[i], names[i]);
}
} else {
for (int i = 0; i < ids.length; i++) {
cthreads[i] = new Thread(this, ids[i]);
}
}
} else {
// Provide a dummy.
cthreads = new Thread[]{new Thread(this, 0)};
}
// FIX: When attaching there is no thread selected
// We will choose the first one as a workaround.
if (currentThreadId == 0 && cthreads.length > 0) {
setCurrentThread(cthreads[0], false);
}
} catch (MIException e) {
// Do not throw anything in this case.
throw new CDIException(e.getMessage());
} finally {
rxThread.setEnableConsole(true);
}
}
return cthreads;
}
public ICDIThread getCurrentThread() throws CDIException {
ICDIThread[] threads = getThreads();
for (int i = 0; i < threads.length; i++) {
Thread cthread = (Thread)threads[i];
if (cthread.getId() == currentThreadId) {
return cthread;
}
}
return null;
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#getThreads()
*/
public synchronized ICDIThread[] getThreads() throws CDIException {
if (currentThreads.length == 0) {
currentThreads = getCThreads();
}
return currentThreads;
}
public ICDIThread getThread(int tid) {
Thread th = null;
if (currentThreads != null) {
for (int i = 0; i < currentThreads.length; i++) {
Thread cthread = currentThreads[i];
if (cthread.getId() == tid) {
th = cthread;
break;
}
}
}
return th;
}
public boolean isLittleEndian() throws CDIException {
if (fEndian == null) {
CommandFactory factory = miSession.getCommandFactory();
MIGDBShowEndian endian = factory.createMIGDBShowEndian();
try {
miSession.postCommand(endian);
MIGDBShowEndianInfo info = endian.getMIShowEndianInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
fEndian = info.isLittleEndian() ? "le" : "be"; //$NON-NLS-1$ //$NON-NLS-2$
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
return fEndian.equals("le"); //$NON-NLS-1$
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#restart()
*/
public void restart() throws CDIException {
// Reset the inferior pid
MIInferior inferior = getMISession().getMIInferior();
int pid = inferior.resetInferiorPID();
CommandFactory factory = miSession.getCommandFactory();
MIExecRun run = factory.createMIExecRun(new String[0]);
try {
miSession.postCommand(run);
MIInfo info = run.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
// Replace pid since we probably didn't actually restart
inferior.setInferiorPID(pid);
throw new MI2CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#stepInto()
*/
public void stepInto() throws CDIException {
stepInto(1);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteStep#stepInto(int)
*/
public void stepInto(int count) throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
MIExecStep step = factory.createMIExecStep(count);
try {
miSession.postCommand(step);
MIInfo info = step.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#stepIntoInstruction()
*/
public void stepIntoInstruction() throws CDIException {
stepIntoInstruction(1);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteStep#stepIntoInstruction(int)
*/
public void stepIntoInstruction(int count) throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
MIExecStepInstruction stepi = factory.createMIExecStepInstruction(count);
try {
miSession.postCommand(stepi);
MIInfo info = stepi.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#stepOver()
*/
public void stepOver() throws CDIException {
stepOver(1);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteStep#stepOver(int)
*/
public void stepOver(int count) throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
MIExecNext next = factory.createMIExecNext(count);
try {
miSession.postCommand(next);
MIInfo info = next.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#stepOverInstruction()
*/
public void stepOverInstruction() throws CDIException {
stepOverInstruction(1);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteStep#stepOverInstruction(int)
*/
public void stepOverInstruction(int count) throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
MIExecNextInstruction nexti = factory.createMIExecNextInstruction(count);
try {
miSession.postCommand(nexti);
MIInfo info = nexti.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#stepReturn()
*/
public void stepReturn() throws CDIException {
((Thread)getCurrentThread()).getCurrentStackFrame().stepReturn();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#runUntil(ICDILocation)
*/
public void runUntil(ICDILocation location) throws CDIException {
stepUntil(location);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteStep#stepUntil(org.eclipse.cdt.debug.core.cdi.ICDILocation)
*/
public void stepUntil(ICDILocation location) throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
String loc = null;
File file = null;
if (location instanceof ICDIFileLocation) {
String filePath = ((ICDIFileLocation)location).getFile();
if (filePath != null && filePath.length() > 0)
file = new File(filePath);
}
if (location instanceof ICDILineLocation) {
ICDILineLocation lineLocation = (ICDILineLocation)location;
if (file != null) {
loc = file.getName() + ":" + lineLocation.getLineNumber(); //$NON-NLS-1$
}
} else if (location instanceof ICDIFunctionLocation) {
ICDIFunctionLocation funcLocation = (ICDIFunctionLocation)location;
if (funcLocation.getFunction() != null && funcLocation.getFunction().length() > 0) {
loc = funcLocation.getFunction();
}
if (file != null && loc != null) {
loc = funcLocation.getFile() + ":" + loc; //$NON-NLS-1$
}
} else if (location instanceof ICDIAddressLocation) {
ICDIAddressLocation addrLocation = (ICDIAddressLocation)location;
if (!addrLocation.getAddress().equals(BigInteger.ZERO)) {
loc = "*0x" + addrLocation.getAddress().toString(16); //$NON-NLS-1$
}
}
// Throw an exception we do know where to go
if (loc == null) {
throw new CDIException(CdiResources.getString("cdi.mode.Target.Bad_location")); //$NON-NLS-1$
}
MIExecUntil until = factory.createMIExecUntil(loc);
try {
miSession.postCommand(until);
MIInfo info = until.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#suspend()
*/
public void suspend() throws CDIException {
try {
miSession.getMIInferior().interrupt();
// Wait till the EventManager tell us the go ahead
long maxSec = miSession.getCommandTimeout()/1000 + 1;
synchronized (this) {
for (int i = 0; !suspended && i < maxSec; i++) {
try {
wait(1000);
} catch (InterruptedException e) {
}
}
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#disconnect()
*/
public void disconnect() throws CDIException {
// if Target is running try to suspend first.
if (isRunning()) {
try {
((EventManager)getSession().getEventManager()).allowProcessingEvents(false);
suspend();
} finally {
((EventManager)getSession().getEventManager()).allowProcessingEvents(true);
}
}
CommandFactory factory = miSession.getCommandFactory();
MITargetDetach detach = factory.createMITargetDetach();
try {
miSession.postCommand(detach);
MIInfo info = detach.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
// Unfortunately -target-detach does not generate an
// event so we do it here.
miSession.fireEvent(new MIDetachedEvent(miSession, detach.getToken()));
miSession.getMIInferior().setDisconnected();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#resume()
*/
public void resume() throws CDIException {
resume(false);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteResume#resume(org.eclipse.cdt.debug.core.cdi.ICDILocation)
*/
public void resume(ICDILocation location) throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
String loc = null;
File file = null;
if (location instanceof ICDIFileLocation) {
String filePath = ((ICDIFileLocation)location).getFile();
if (filePath != null && filePath.length() > 0)
file = new File(filePath);
}
if (location instanceof ICDILineLocation) {
ICDILineLocation lineLocation = (ICDILineLocation)location;
if (file != null) {
loc = file.getName() + ":" + lineLocation.getLineNumber(); //$NON-NLS-1$
}
} else if (location instanceof ICDIFunctionLocation) {
ICDIFunctionLocation funcLocation = (ICDIFunctionLocation)location;
if (funcLocation.getFunction() != null && funcLocation.getFunction().length() > 0) {
loc = funcLocation.getFunction();
}
if (file != null && loc != null) {
loc = funcLocation.getFile() + ":" + loc; //$NON-NLS-1$
}
} else if (location instanceof ICDIAddressLocation) {
ICDIAddressLocation addrLocation = (ICDIAddressLocation)location;
if (!addrLocation.getAddress().equals(BigInteger.ZERO)) {
loc = "*0x" + addrLocation.getAddress().toString(16); //$NON-NLS-1$
}
}
// Throw an exception we do know where to go
if (loc == null) {
throw new CDIException(CdiResources.getString("cdi.mode.Target.Bad_location")); //$NON-NLS-1$
}
CLIJump jump = factory.createCLIJump(loc);
try {
miSession.postCommand(jump);
MIInfo info = jump.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteMoveInstructionPointer#moveInstructionPointer(org.eclipse.cdt.debug.core.cdi.ICDILocation)
*/
/**
* @since 6.0
*/
public void moveInstructionPointer(ICDILocation location) throws CDIException {
// Most of this code was taken from our Resume()
// method. The only differences are that we create a temporary
// breakpoint for the location and set it before we post
// the 'jump' command
CommandFactory factory = miSession.getCommandFactory();
LocationBreakpoint bkpt = null;
String loc = null;
File file = null;
if (location instanceof ICDIFileLocation) {
String filePath = ((ICDIFileLocation)location).getFile();
if (filePath != null && filePath.length() > 0)
file = new File(filePath);
}
if (location instanceof ICDILineLocation) {
ICDILineLocation lineLocation = (ICDILineLocation)location;
if (file != null) {
loc = file.getName() + ":" + lineLocation.getLineNumber(); //$NON-NLS-1$
}
bkpt = new LineBreakpoint(this, ICBreakpointType.TEMPORARY, lineLocation, null, true);
} else if (location instanceof ICDIAddressLocation) {
ICDIAddressLocation addrLocation = (ICDIAddressLocation)location;
if (!addrLocation.getAddress().equals(BigInteger.ZERO)) {
loc = "*0x" + addrLocation.getAddress().toString(16); //$NON-NLS-1$
}
bkpt = new AddressBreakpoint(this, ICBreakpointType.TEMPORARY, addrLocation, null, true);
}
// Throw an exception we do know where to go
if (loc == null) {
throw new CDIException(CdiResources.getString("cdi.mode.Target.Bad_location")); //$NON-NLS-1$
}
// Set a temporary breakpoint at the location we're going
// to do a 'jump' (resume from) operation
Session session = (Session)getSession();
session.getBreakpointManager().setLocationBreakpoint(bkpt);
CLIJump jump = factory.createCLIJump(loc);
try {
miSession.postCommand(jump);
MIInfo info = jump.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteResume#resume(org.eclipse.cdt.debug.core.cdi.model.ICDISignal)
*/
public void resume(ICDISignal signal) throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
CLISignal sig = factory.createCLISignal(signal.getName());
try {
miSession.postCommand(sig);
MIInfo info = sig.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteResume#resume(boolean)
*/
public void resume(boolean passSignal) throws CDIException {
if (miSession.getMIInferior().isRunning()) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Inferior_already_running")); //$NON-NLS-1$
} else if (miSession.getMIInferior().isSuspended()) {
if (passSignal) {
CommandFactory factory = miSession.getCommandFactory();
CLISignal signal = factory.createCLISignal("0"); //$NON-NLS-1$
try {
miSession.postCommand(signal);
MIInfo info = signal.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
} else {
continuation();
}
} else if (miSession.getMIInferior().isTerminated()) {
restart();
} else {
restart();
}
}
public void continuation() throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
MIExecContinue cont = factory.createMIExecContinue();
try {
miSession.postCommand(cont);
MIInfo info = cont.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#jump(ICDILocation)
*/
public void jump(ICDILocation location) throws CDIException {
resume(location);
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#signal()
*/
public void signal() throws CDIException {
resume(true);
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#signal(ICDISignal)
*/
public void signal(ICDISignal signal) throws CDIException {
resume(signal);
}
public String evaluateExpressionToString(ICDIStackFrame frame, String expressionText) throws CDIException {
Target target = (Target)frame.getTarget();
Thread currentThread = (Thread)target.getCurrentThread();
StackFrame currentFrame = currentThread.getCurrentStackFrame();
target.setCurrentThread(frame.getThread(), false);
((Thread)frame.getThread()).setCurrentStackFrame((StackFrame)frame, false);
try {
CommandFactory factory = miSession.getCommandFactory();
MIDataEvaluateExpression evaluate =
factory.createMIDataEvaluateExpression(expressionText);
miSession.postCommand(evaluate);
MIDataEvaluateExpressionInfo info =
evaluate.getMIDataEvaluateExpressionInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
return info.getExpression();
} catch (MIException e) {
throw new MI2CDIException(e);
} finally {
target.setCurrentThread(currentThread, false);
currentThread.setCurrentStackFrame(currentFrame, false);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#terminate()
*/
public void terminate() throws CDIException {
try {
miSession.getMIInferior().terminate();
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#isTerminated()
*/
public boolean isTerminated() {
return miSession.getMIInferior().isTerminated();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#isDisconnected()
*/
public boolean isDisconnected() {
return !miSession.getMIInferior().isConnected();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#isSuspended()
*/
public boolean isSuspended() {
return miSession.getMIInferior().isSuspended();
}
public boolean isRunning() {
return miSession.getMIInferior().isRunning();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#getProcess()
*/
public Process getProcess() {
if (miSession.isCoreSession()) {
return new CoreProcess();
}
return miSession.getMIInferior();
}
// Implementaton of ICDIBreapointManagement.
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement#setLineBreakpoint(int, org.eclipse.cdt.debug.core.cdi.ICDILineLocation, org.eclipse.cdt.debug.core.cdi.ICDICondition, boolean)
*/
public ICDILineBreakpoint setLineBreakpoint(int type, ICDILineLocation location,
ICDICondition condition, boolean deferred) throws CDIException {
return this.setLineBreakpoint(type, location, condition, deferred, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement#setFunctionBreakpoint(int, org.eclipse.cdt.debug.core.cdi.ICDIFunctionLocation, org.eclipse.cdt.debug.core.cdi.ICDICondition, boolean)
*/
public ICDIFunctionBreakpoint setFunctionBreakpoint(int type, ICDIFunctionLocation location,
ICDICondition condition, boolean deferred) throws CDIException {
return this.setFunctionBreakpoint(type, location, condition, deferred, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement#setAddressBreakpoint(int, org.eclipse.cdt.debug.core.cdi.ICDIAddressLocation, org.eclipse.cdt.debug.core.cdi.ICDICondition, boolean)
*/
public ICDIAddressBreakpoint setAddressBreakpoint(int type, ICDIAddressLocation location,
ICDICondition condition, boolean deferred) throws CDIException {
return this.setAddressBreakpoint(type, location, condition, deferred, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement#setWatchpoint(int, int, java.lang.String, org.eclipse.cdt.debug.core.cdi.ICDICondition)
*/
public ICDIWatchpoint setWatchpoint(int type, int watchType, String expression,
ICDICondition condition) throws CDIException {
return this.setWatchpoint(type, watchType, expression, condition, true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement2#setWatchpoint(int, int, java.lang.String, org.eclipse.cdt.debug.core.cdi.ICDICondition, boolean)
*/
public ICDIWatchpoint setWatchpoint(int type, int watchType, String expression,
ICDICondition condition, boolean enabled) throws CDIException {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
Watchpoint bkpt = new Watchpoint(this, expression, type, watchType, condition, enabled);
bMgr.setWatchpoint(bkpt);
return bkpt;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement2#setWatchpoint(int, int, java.lang.String, java.math.BigInteger, org.eclipse.cdt.debug.core.cdi.ICDICondition, boolean)
*/
public ICDIWatchpoint setWatchpoint(int type, int watchType, String expression,
String memorySpace, BigInteger range, ICDICondition condition, boolean enabled) throws CDIException {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
Watchpoint bkpt = new Watchpoint(this, expression, memorySpace, range, type, watchType, condition, enabled);
bMgr.setWatchpoint(bkpt);
return bkpt;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement#setExceptionBreakpoint(java.lang.String, boolean, boolean)
*/
public ICDIExceptionpoint setExceptionBreakpoint(String clazz, boolean stopOnThrow, boolean stopOnCatch)
throws CDIException {
throw new CDIException(CdiResources.getString("cdi.Common.Not_implemented")); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement#getBreakpoints()
*/
public ICDIBreakpoint[] getBreakpoints() throws CDIException {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
return bMgr.getBreakpoints(this);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement#deleteBreakpoints(org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint[])
*/
public void deleteBreakpoints(ICDIBreakpoint[] breakpoints) throws CDIException {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
bMgr.deleteBreakpoints(this, breakpoints);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement#deleteAllBreakpoints()
*/
public void deleteAllBreakpoints() throws CDIException {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
bMgr.deleteAllBreakpoints(this);
}
/*
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#createCondition(int, java.lang.String, String)
*/
public ICDICondition createCondition(int ignoreCount, String expression) {
return createCondition(ignoreCount, expression, null);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#createCondition(int, java.lang.String, String)
*/
public ICDICondition createCondition(int ignoreCount, String expression, String[] tids) {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
return bMgr.createCondition(ignoreCount, expression, tids);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#createLineLocation(java.lang.String, int)
*/
public ICDILineLocation createLineLocation(String file, int line) {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
return bMgr.createLineLocation(file, line);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#createFunctionLocation(java.lang.String, java.lang.String)
*/
public ICDIFunctionLocation createFunctionLocation(String file, String function) {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
return bMgr.createFunctionLocation(file, function);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#createLocation(long)
*/
public ICDIAddressLocation createAddressLocation(BigInteger address) {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
return bMgr.createAddressLocation(address);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#getRuntimeOptions()
*/
public ICDIRuntimeOptions getRuntimeOptions() {
return new RuntimeOptions(this);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExpressionManagement#createExpression(java.lang.String)
*/
public ICDIExpression createExpression(String code) throws CDIException {
ExpressionManager expMgr = ((Session)getSession()).getExpressionManager();
return expMgr.createExpression(this, code);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExpressionManagement#getExpressions()
*/
public ICDIExpression[] getExpressions() throws CDIException {
ExpressionManager expMgr = ((Session)getSession()).getExpressionManager();
return expMgr.getExpressions(this);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExpressionManagement#destroyExpression(org.eclipse.cdt.debug.core.cdi.model.ICDIExpression[])
*/
public void destroyExpressions(ICDIExpression[] expressions) throws CDIException {
ExpressionManager expMgr = ((Session)getSession()).getExpressionManager();
expMgr.destroyExpressions(this, expressions);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExpressionManagement#destroyAllExpression()
*/
public void destroyAllExpressions() throws CDIException {
ExpressionManager expMgr = ((Session)getSession()).getExpressionManager();
expMgr.destroyAllExpressions(this);
}
/**
* Returns the array of signals defined for this target.
*
* @return the array of signals
* @throws CDIException on failure. Reasons include:
*/
public ICDISignal[] getSignals() throws CDIException {
SignalManager sigMgr = ((Session)getSession()).getSignalManager();
return sigMgr.getSignals(this);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDISourceManagement#setSourcePaths(java.lang.String[])
*/
public void setSourcePaths(String[] srcPaths) throws CDIException {
SourceManager srcMgr = ((Session)getSession()).getSourceManager();
srcMgr.setSourcePaths(this, srcPaths);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDISourceManagement#getSourcePaths()
*/
public String[] getSourcePaths() throws CDIException {
SourceManager srcMgr = ((Session)getSession()).getSourceManager();
return srcMgr.getSourcePaths(this);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDISourceManagement#getInstructions(java.math.BigInteger, java.math.BigInteger)
*/
public ICDIInstruction[] getInstructions(BigInteger startAddress, BigInteger endAddress) throws CDIException {
SourceManager srcMgr = ((Session)getSession()).getSourceManager();
return srcMgr.getInstructions(this, startAddress, endAddress);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDISourceManagement#getInstructions(java.lang.String, int)
*/
public ICDIInstruction[] getInstructions(String filename, int linenum) throws CDIException {
SourceManager srcMgr = ((Session)getSession()).getSourceManager();
return srcMgr.getInstructions(this, filename, linenum);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDISourceManagement#getInstructions(java.lang.String, int, int)
*/
public ICDIInstruction[] getInstructions(String filename, int linenum, int lines) throws CDIException {
SourceManager srcMgr = ((Session)getSession()).getSourceManager();
return srcMgr.getInstructions(this, filename, linenum, lines);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDISourceManagement#getMixedInstructions(java.math.BigInteger, java.math.BigInteger)
*/
public ICDIMixedInstruction[] getMixedInstructions(BigInteger startAddress, BigInteger endAddress) throws CDIException {
SourceManager srcMgr = ((Session)getSession()).getSourceManager();
return srcMgr.getMixedInstructions(this, startAddress, endAddress);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDISourceManagement#getMixedInstructions(java.lang.String, int)
*/
public ICDIMixedInstruction[] getMixedInstructions(String filename, int linenum) throws CDIException {
SourceManager srcMgr = ((Session)getSession()).getSourceManager();
return srcMgr.getMixedInstructions(this, filename, linenum);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDISourceManagement#getMixedInstructions(java.lang.String, int, int)
*/
public ICDIMixedInstruction[] getMixedInstructions(String filename, int linenum, int lines) throws CDIException {
SourceManager srcMgr = ((Session)getSession()).getSourceManager();
return srcMgr.getMixedInstructions(this, filename, linenum, lines);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlockManagement#createMemoryBlock(java.lang.String, int)
*/
public ICDIMemoryBlock createMemoryBlock(String address, int units, int wordSize) throws CDIException {
MemoryManager memMgr = ((Session)getSession()).getMemoryManager();
return memMgr.createMemoryBlock(this, address, units, wordSize);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlockManagement#removeBlocks(org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlock[])
*/
public void removeBlocks(ICDIMemoryBlock[] memoryBlocks) throws CDIException {
MemoryManager memMgr = ((Session)getSession()).getMemoryManager();
memMgr.removeBlocks(this, memoryBlocks);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlockManagement#removeAllBlocks()
*/
public void removeAllBlocks() throws CDIException {
MemoryManager memMgr = ((Session)getSession()).getMemoryManager();
memMgr.removeAllBlocks(this);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlockManagement#getMemoryBlocks()
*/
public ICDIMemoryBlock[] getMemoryBlocks() throws CDIException {
MemoryManager memMgr = ((Session)getSession()).getMemoryManager();
return memMgr.getMemoryBlocks(this);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDISharedLibraryManagement#getSharedLibraries()
*/
public ICDISharedLibrary[] getSharedLibraries() throws CDIException {
SharedLibraryManager sharedMgr = ((Session)getSession()).getSharedLibraryManager();
return sharedMgr.getSharedLibraries(this);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#getGlobalVariableDescriptors(java.lang.String, java.lang.String, java.lang.String)
*/
public ICDIGlobalVariableDescriptor getGlobalVariableDescriptors(String filename, String function, String name) throws CDIException {
VariableManager varMgr = ((Session)getSession()).getVariableManager();
return varMgr.getGlobalVariableDescriptor(this, filename, function, name);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#getRegisterGroups()
*/
public ICDIRegisterGroup[] getRegisterGroups() throws CDIException {
RegisterManager regMgr = ((Session)getSession()).getRegisterManager();
return regMgr.getRegisterGroups(this);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#getConfiguration()
*/
public ICDITargetConfiguration getConfiguration() {
if (fConfiguration == null) {
if (miSession.isProgramSession()) {
fConfiguration = new TargetConfiguration(this);
} else if (miSession.isAttachSession()) {
fConfiguration = new TargetConfiguration(this);
} else if (miSession.isCoreSession()) {
fConfiguration = new CoreFileConfiguration(this);
} else {
fConfiguration = new TargetConfiguration(this);
}
}
return fConfiguration;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#createGlobalVariable(org.eclipse.cdt.debug.core.cdi.model.ICDIGlobalVariableDescriptor)
*/
public ICDIGlobalVariable createGlobalVariable(ICDIGlobalVariableDescriptor varDesc) throws CDIException {
if (varDesc instanceof GlobalVariableDescriptor) {
VariableManager varMgr = ((Session)getSession()).getVariableManager();
return varMgr.createGlobalVariable((GlobalVariableDescriptor)varDesc);
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#createRegister(org.eclipse.cdt.debug.core.cdi.model.ICDIRegisterDescriptor)
*/
public ICDIRegister createRegister(ICDIRegisterDescriptor varDesc) throws CDIException {
if (varDesc instanceof RegisterDescriptor) {
Session session = (Session)getTarget().getSession();
RegisterManager mgr = session.getRegisterManager();
return mgr.createRegister((RegisterDescriptor)varDesc);
}
return null;
}
public void deferBreakpoints(boolean defer) {
this.deferBreakpoints = defer;
}
public boolean areBreakpointsDeferred() {
return this.deferBreakpoints;
}
public void enableVerboseMode(boolean enabled) {
miSession.enableVerboseMode(enabled);
}
public boolean isVerboseModeEnabled() {
return miSession.isVerboseModeEnabled();
}
public ICDIAddressBreakpoint setAddressBreakpoint(int type, ICDIAddressLocation location, ICDICondition condition, boolean deferred, boolean enabled) throws CDIException {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
return bMgr.setAddressBreakpoint(this, type, location, condition, deferred, enabled);
}
public ICDIExceptionpoint setExceptionBreakpoint(String clazz, boolean stopOnThrow, boolean stopOnCatch, boolean enabled) throws CDIException {
throw new CDIException(CdiResources.getString("cdi.Common.Not_implemented")); //$NON-NLS-1$
}
public ICDIFunctionBreakpoint setFunctionBreakpoint(int type, ICDIFunctionLocation location, ICDICondition condition, boolean deferred, boolean enabled) throws CDIException {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
return bMgr.setFunctionBreakpoint(this, type, location, condition, deferred, enabled);
}
public ICDILineBreakpoint setLineBreakpoint(int type, ICDILineLocation location, ICDICondition condition, boolean deferred, boolean enabled) throws CDIException {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
return bMgr.setLineBreakpoint(this, type, location, condition, deferred, enabled);
}
public IMappedSourceLocation getSourceForAddress(IAddress address) throws CDIException {
// Ask gdb for info for this address, use the module list
// to determine the executable.
CommandFactory factory = miSession.getCommandFactory();
CLIInfoLine cmd = factory.createCLIInfoLine(address);
try {
miSession.postCommand(cmd);
CLIInfoLineInfo info = cmd.getMIInfoLineInfo();
String fileName = ""; //$NON-NLS-1$
ICDISharedLibrary[] libs = getSharedLibraries();
BigInteger sourceAddress = address.getValue();
for (int i = 0; i < libs.length; i++) {
if (sourceAddress.compareTo(libs[i].getStartAddress()) > 0 && sourceAddress.compareTo(libs[i].getEndAddress()) < 0)
{
fileName = libs[i].getFileName();
}
}
return new MappedSourceLocation(address, info, fileName);
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
public ICDIEventBreakpoint setEventBreakpoint(String type, String arg, int cdiType, ICDICondition condition, boolean deferred,
boolean enabled) throws CDIException {
BreakpointManager bMgr = ((Session)getSession()).getBreakpointManager();
return bMgr.setEventBreakpoint(this,type,arg,condition,enabled);
}
}