diff options
author | eutarass | 2010-10-12 18:58:11 +0000 |
---|---|---|
committer | eutarass | 2010-10-12 18:58:11 +0000 |
commit | 00221a37f2dbf2a9f05439aed3d9f346dbd5d848 (patch) | |
tree | d582493f8acfa8732e3c8c67a592e553ae9098de | |
parent | 1e5bcbcf1470b30018aa1f59e9c6a516e84c1029 (diff) | |
download | org.eclipse.tcf-00221a37f2dbf2a9f05439aed3d9f346dbd5d848.tar.gz org.eclipse.tcf-00221a37f2dbf2a9f05439aed3d9f346dbd5d848.tar.xz org.eclipse.tcf-00221a37f2dbf2a9f05439aed3d9f346dbd5d848.zip |
TCF Debugger diagnostic tests: added tests for Disassembly service
2 files changed, 66 insertions, 0 deletions
diff --git a/plugins/org.eclipse.tm.tcf.core/src/org/eclipse/tm/internal/tcf/services/remote/DisassemblyProxy.java b/plugins/org.eclipse.tm.tcf.core/src/org/eclipse/tm/internal/tcf/services/remote/DisassemblyProxy.java index fcd8dbba3..64a0956b7 100644 --- a/plugins/org.eclipse.tm.tcf.core/src/org/eclipse/tm/internal/tcf/services/remote/DisassemblyProxy.java +++ b/plugins/org.eclipse.tm.tcf.core/src/org/eclipse/tm/internal/tcf/services/remote/DisassemblyProxy.java @@ -48,6 +48,18 @@ public class DisassemblyProxy implements IDisassembly { public Map<String,Object>[] getInstruction() { return instruction; } + + public String toString() { + StringBuffer bf = new StringBuffer(); + bf.append('['); + bf.append(addr.toString()); + bf.append(' '); + bf.append(size); + bf.append(' '); + for (Map<String,Object> m : instruction) bf.append(m.toString()); + bf.append(']'); + return bf.toString(); + } } public DisassemblyProxy(IChannel channel) { diff --git a/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TestRCBP1.java b/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TestRCBP1.java index 97989de10..780c5b59f 100644 --- a/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TestRCBP1.java +++ b/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TestRCBP1.java @@ -25,11 +25,13 @@ import org.eclipse.tm.tcf.protocol.IToken; import org.eclipse.tm.tcf.protocol.Protocol; import org.eclipse.tm.tcf.services.IBreakpoints; import org.eclipse.tm.tcf.services.IDiagnostics; +import org.eclipse.tm.tcf.services.IDisassembly; import org.eclipse.tm.tcf.services.ILineNumbers; import org.eclipse.tm.tcf.services.IMemory; import org.eclipse.tm.tcf.services.IRegisters; import org.eclipse.tm.tcf.services.IRunControl; import org.eclipse.tm.tcf.services.IDiagnostics.ISymbol; +import org.eclipse.tm.tcf.services.IDisassembly.IDisassemblyLine; import org.eclipse.tm.tcf.services.ILineNumbers.CodeArea; import org.eclipse.tm.tcf.services.IMemory.MemoryContext; import org.eclipse.tm.tcf.services.IMemory.MemoryError; @@ -46,9 +48,12 @@ class TestRCBP1 implements ITCFTest, IRunControl.RunControlListener { private final IRegisters rg; private final IBreakpoints bp; private final ILineNumbers ln; + private final IDisassembly ds; private final Map<String,IRunControl.RunControlContext> threads = new HashMap<String,IRunControl.RunControlContext>(); private final Map<String,SuspendedContext> suspended = new HashMap<String,SuspendedContext>(); private final Map<String,SuspendedContext> suspended_prev = new HashMap<String,SuspendedContext>(); + private final Map<String,IDisassemblyLine[]> disassembly_lines = new HashMap<String,IDisassemblyLine[]>(); + private final Map<String,Map<String,Object>[]> disassembly_capabilities = new HashMap<String,Map<String,Object>[]>(); private final Set<String> running = new HashSet<String>(); private final Set<IToken> get_state_cmds = new HashSet<IToken>(); private final Map<String,Map<String,IRegisters.RegistersContext>> regs = @@ -66,6 +71,7 @@ class TestRCBP1 implements ITCFTest, IRunControl.RunControlListener { private Runnable pending_cancel; private int bp_cnt = 0; private boolean done_get_state; + private boolean done_disassembly; private int resume_cnt = 0; private IToken cancel_test_cmd; private boolean bp_reset_done; @@ -155,6 +161,7 @@ class TestRCBP1 implements ITCFTest, IRunControl.RunControlListener { rg = channel.getRemoteService(IRegisters.class); bp = channel.getRemoteService(IBreakpoints.class); ln = channel.getRemoteService(ILineNumbers.class); + ds = channel.getRemoteService(IDisassembly.class); } public void start() { @@ -207,6 +214,12 @@ class TestRCBP1 implements ITCFTest, IRunControl.RunControlListener { getContextState(test_ctx_id); return; } + if (ds != null && !done_disassembly) { + assert get_state_cmds.isEmpty(); + assert disassembly_lines.isEmpty(); + getDisassemlyLines(); + return; + } if (rcbp1_found) { if (!bp_change_done) { changeBreakpoints(); @@ -510,6 +523,47 @@ class TestRCBP1 implements ITCFTest, IRunControl.RunControlListener { runTest(); } + private void getDisassemlyLines() { + for (final String id : suspended.keySet()) { + SuspendedContext sc = suspended.get(id); + get_state_cmds.add(ds.getCapabilities(id, new IDisassembly.DoneGetCapabilities() { + public void doneGetCapabilities(IToken token, Throwable error, Map<String,Object>[] arr) { + get_state_cmds.remove(token); + if (error != null) { + exit(error); + } + else { + disassembly_capabilities.put(id, arr); + if (get_state_cmds.isEmpty()) doneDisassembly(); + } + } + })); + if (sc.pc == null) continue; + BigInteger pc = new BigInteger(sc.pc); + get_state_cmds.add(ds.disassemble(id, pc, 1, null, new IDisassembly.DoneDisassemble() { + public void doneDisassemble(IToken token, Throwable error, IDisassemblyLine[] arr) { + get_state_cmds.remove(token); + if (error != null) { + exit(error); + } + else { + disassembly_lines.put(id, arr); + if (get_state_cmds.isEmpty()) doneDisassembly(); + } + } + })); + } + if (get_state_cmds.isEmpty()) doneDisassembly(); + } + + private void doneDisassembly() { + assert !done_disassembly; + assert get_state_cmds.isEmpty(); + assert suspended.size() == disassembly_lines.size(); + done_disassembly = true; + runTest(); + } + private void changeBreakpoints() { assert !bp_change_done; final String bp_id = "TcfTestBP5" + channel_id; |