blob: 079d89e34ee98b6e3457ee55ba542c534955eb93 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 The Regents of the University of California.
* This material was produced under U.S. Government contract W-7405-ENG-36
* for Los Alamos National Laboratory, which is operated by the University
* of California for the U.S. Department of Energy. The U.S. Government has
* rights to use, reproduce, and distribute this software. NEITHER THE
* GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Additionally, 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
*
* LA-CC 04-115
*******************************************************************************/
package org.eclipse.ptp.debug.sdm.core.proxy;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.ptp.core.util.BitList;
import org.eclipse.ptp.debug.sdm.core.utils.DebugUtil;
import org.eclipse.ptp.proxy.debug.client.AbstractProxyDebugClient;
import org.eclipse.ptp.proxy.debug.command.IProxyDebugCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugBreakpointAfterCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugCLICommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugConditionBreakpointCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugDataReadMemoryCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugDataWriteMemoryCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugDeleteBreakpointCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugDisableBreakpointCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugEnableBreakpointCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugEvaluateExpressionCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugGetPartialAIFCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugGetTypeCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugGoCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugInterruptCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugListArgumentsCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugListGlobalVariablesCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugListInfoThreadsCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugListLocalVariablesCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugListSignalsCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugListStackframesCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugSetCurrentStackframeCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugSetFunctionBreakpointCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugSetLineBreakpointCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugSetThreadSelectCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugSetWatchpointCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugSignalInfoCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugStackInfoDepthCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugStartSessionCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugStepCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugTerminateCommand;
import org.eclipse.ptp.proxy.debug.command.ProxyDebugVariableDeleteCommand;
public class ProxyDebugClient extends AbstractProxyDebugClient {
public static final int STEP_INTO = 0;
public static final int STEP_OVER = 1;
public static final int STEP_FINISH = 2;
/**
* Convert a proxy representation of a bitset into a BitList
*
* @param str
* @return proxy bitset converted to BitList
*/
public static BitList decodeBitSet(String str) {
String[] parts = str.split(":");
int len = Integer.parseInt(parts[0], 16); // Skip trailing NULL
return new BitList(len, parts[1]);
}
/**
* Convert a BitList to it's proxy representation
*
* @param set
* @return proxy representation of a BitList
*/
public static String encodeBitSet(BitList set) {
String lenStr = Integer.toHexString(set.size());
return lenStr + ":" + set.toString();
}
/**
* Wait for the debugger to connect. We will receive a connected event
* when the debug server actually connects, or a timeout event if the server
* fails to connect.
*
* @param monitor
* @return true on successful connection, false otherwise
* @throws IOException
*/
public boolean waitConnect(IProgressMonitor monitor) throws IOException {
DebugUtil.trace(DebugUtil.SDM_MASTER_TRACING, "debug: waiting for connect");
if (monitor == null) {
monitor = new NullProgressMonitor();
}
waitLock.lock();
try {
if (state == DebugProxyState.CONNECTING) {
while (state == DebugProxyState.CONNECTING && !timeout && !monitor.isCanceled()) {
waiting = true;
try {
//added to wait for 1000
waitCondition.await(1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
// Expect to be interrupted if monitor is canceled
monitor.setCanceled(true);
}
}
if (timeout) {
throw new IOException("Timeout waiting for debugger to connect");
}
if (monitor.isCanceled()) {
return false;
}
if (state != DebugProxyState.CONNECTED) {
return false;
}
}
return true;
} finally {
waitLock.unlock();
monitor.done();
}
}
public void debugStartSession(String prog, String path, String dir, String[] args) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugStartSessionCommand(prog, path, dir, args);
sendCommand(cmd);
cmd.completed();
}
public void debugSetLineBreakpoint(BitList procs, int bpid, boolean isTemporary, boolean isHardware, String file, int line, String expression, int ignoreCount, int tid) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugSetLineBreakpointCommand(encodeBitSet(procs), bpid, isTemporary, isHardware, file, line, expression, ignoreCount, tid);
sendCommand(cmd);
cmd.completed();
}
public void debugSetFuncBreakpoint(BitList procs, int bpid, boolean isTemporary, boolean isHardware, String file, String func, String expression, int ignoreCount, int tid) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugSetFunctionBreakpointCommand(encodeBitSet(procs), bpid, isTemporary, isHardware, file, func, expression, ignoreCount, tid);
sendCommand(cmd);
cmd.completed();
}
public void debugSetWatchpoint(BitList procs, int bpid, String expression, boolean isAccess, boolean isRead, String condition, int ignoreCount) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugSetWatchpointCommand(encodeBitSet(procs), bpid, expression, isAccess, isRead, condition, ignoreCount);
sendCommand(cmd);
cmd.completed();
}
public void debugDeleteBreakpoint(BitList procs, int bpid) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugDeleteBreakpointCommand(encodeBitSet(procs), bpid);
sendCommand(cmd);
cmd.completed();
}
public void debugEnableBreakpoint(BitList procs, int bpid) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugEnableBreakpointCommand(encodeBitSet(procs), bpid);
sendCommand(cmd);
cmd.completed();
}
public void debugDisableBreakpoint(BitList procs, int bpid) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugDisableBreakpointCommand(encodeBitSet(procs), bpid);
sendCommand(cmd);
cmd.completed();
}
public void debugConditionBreakpoint(BitList procs, int bpid, String expr) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugConditionBreakpointCommand(encodeBitSet(procs), bpid, expr);
sendCommand(cmd);
cmd.completed();
}
public void debugBreakpointAfter(BitList procs, int bpid, int icount) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugBreakpointAfterCommand(encodeBitSet(procs), bpid, icount);
sendCommand(cmd);
cmd.completed();
}
public void debugStackInfoDepth(BitList procs) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugStackInfoDepthCommand(encodeBitSet(procs));
sendCommand(cmd);
cmd.completed();
}
public void debugGo(BitList procs) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugGoCommand(encodeBitSet(procs));
sendCommand(cmd);
cmd.completed();
}
public void debugStep(BitList procs, int count, int type) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugStepCommand(encodeBitSet(procs), count, type);
sendCommand(cmd);
cmd.completed();
}
public void debugTerminate(BitList procs) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugTerminateCommand(encodeBitSet(procs));
sendCommand(cmd);
cmd.completed();
}
public void debugInterrupt(BitList procs) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugInterruptCommand(encodeBitSet(procs));
sendCommand(cmd);
cmd.completed();
}
public void debugListStackframes(BitList procs, int low, int high) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugListStackframesCommand(encodeBitSet(procs), low, high);
sendCommand(cmd);
cmd.completed();
}
public void debugSetCurrentStackframe(BitList procs, int level) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugSetCurrentStackframeCommand(encodeBitSet(procs), level);
sendCommand(cmd);
cmd.completed();
}
public void debugGetType(BitList procs, String expr) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugGetTypeCommand(encodeBitSet(procs), expr);
sendCommand(cmd);
cmd.completed();
}
public void debugListLocalVariables(BitList procs) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugListLocalVariablesCommand(encodeBitSet(procs));
sendCommand(cmd);
cmd.completed();
}
public void debugListArguments(BitList procs, int low, int high) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugListArgumentsCommand(encodeBitSet(procs), low, high);
sendCommand(cmd);
cmd.completed();
}
public void debugListGlobalVariables(BitList procs) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugListGlobalVariablesCommand(encodeBitSet(procs));
sendCommand(cmd);
cmd.completed();
}
public void debugListInfoThreads(BitList procs) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugListInfoThreadsCommand(encodeBitSet(procs));
sendCommand(cmd);
cmd.completed();
}
public void debugSetThreadSelect(BitList procs, int threadNum) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugSetThreadSelectCommand(encodeBitSet(procs), threadNum);
sendCommand(cmd);
cmd.completed();
}
public void setDataReadMemoryCommand(BitList procs, long offset, String address, String format, int wordSize, int rows, int cols, Character asChar) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugDataReadMemoryCommand(encodeBitSet(procs), offset, address, format, wordSize, rows, cols, asChar);
sendCommand(cmd);
cmd.completed();
}
public void setDataWriteMemoryCommand(BitList procs, long offset, String address, String format, int wordSize, String value) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugDataWriteMemoryCommand(encodeBitSet(procs), offset, address, format, wordSize, value);
sendCommand(cmd);
cmd.completed();
}
public void debugListSignals(BitList procs, String name) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugListSignalsCommand(encodeBitSet(procs), name);
sendCommand(cmd);
cmd.completed();
}
public void debugSignalInfo(BitList procs, String arg) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugSignalInfoCommand(encodeBitSet(procs), arg);
sendCommand(cmd);
cmd.completed();
}
public void debugCLIHandle(BitList procs, String arg) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugCLICommand(encodeBitSet(procs), arg);
sendCommand(cmd);
cmd.completed();
}
public void debugGetPartialAIF(BitList procs, String name, String key, boolean listChildren, boolean express) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugGetPartialAIFCommand(encodeBitSet(procs), name, key, listChildren, express);
sendCommand(cmd);
cmd.completed();
}
public void debugVariableDelete(BitList procs, String name) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugVariableDeleteCommand(encodeBitSet(procs), name);
sendCommand(cmd);
cmd.completed();
}
//TODO missing Data Evaluate Expression or Evaluate Expression Command
public void debugDataEvaluateExpression(BitList procs, String expr) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugEvaluateExpressionCommand(encodeBitSet(procs), expr);
sendCommand(cmd);
cmd.completed();
}
public void debugEvaluateExpression(BitList procs, String expr) throws IOException {
IProxyDebugCommand cmd = new ProxyDebugEvaluateExpressionCommand(encodeBitSet(procs), expr);
sendCommand(cmd);
cmd.completed();
}
}