diff options
author | Eugene Tarassov | 2012-07-17 16:27:05 +0000 |
---|---|---|
committer | Eugene Tarassov | 2012-07-17 16:27:05 +0000 |
commit | d1d63a37e70906b8047a95b2225a40f27842b581 (patch) | |
tree | 42ed3e2ce432c8f245a80bfff3b69fd0caf354b0 /plugins | |
parent | 121d671218288eba9dc74b260a6d745a81499877 (diff) | |
download | org.eclipse.tcf-d1d63a37e70906b8047a95b2225a40f27842b581.tar.gz org.eclipse.tcf-d1d63a37e70906b8047a95b2225a40f27842b581.tar.xz org.eclipse.tcf-d1d63a37e70906b8047a95b2225a40f27842b581.zip |
TCF Debugger: fixed ArrayIndexOutOfBoundsException in the Disassembly view; fixed "TCF Task Aborted" in the log when debug session is closed
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/org.eclipse.tcf.cdt.ui/src/org/eclipse/tcf/internal/cdt/ui/disassembly/TCFDisassemblyBackend.java | 49 |
1 files changed, 28 insertions, 21 deletions
diff --git a/plugins/org.eclipse.tcf.cdt.ui/src/org/eclipse/tcf/internal/cdt/ui/disassembly/TCFDisassemblyBackend.java b/plugins/org.eclipse.tcf.cdt.ui/src/org/eclipse/tcf/internal/cdt/ui/disassembly/TCFDisassemblyBackend.java index 90f52dc18..0d4b19e25 100644 --- a/plugins/org.eclipse.tcf.cdt.ui/src/org/eclipse/tcf/internal/cdt/ui/disassembly/TCFDisassemblyBackend.java +++ b/plugins/org.eclipse.tcf.cdt.ui/src/org/eclipse/tcf/internal/cdt/ui/disassembly/TCFDisassemblyBackend.java @@ -235,35 +235,42 @@ public class TCFDisassemblyBackend extends AbstractDisassemblyBackend { } public SetDebugContextResult setDebugContext(IAdaptable context) { - TCFNodeExecContext newContext = null; TCFNodeStackFrame frame = null; + TCFNodeExecContext thread = null; SetDebugContextResult result = new SetDebugContextResult(); if (context instanceof TCFNodeExecContext) { - newContext = (TCFNodeExecContext)context; - final TCFNodeExecContext _execContext = newContext; - frame = new TCFTask<TCFNodeStackFrame>(_execContext.getChannel()) { - public void run() { - TCFChildrenStackTrace stack = _execContext.getStackTrace(); - if (!stack.validate(this)) return; - done(stack.getTopFrame()); - } - }.getE(); - if (frame == null) newContext = null; + thread = (TCFNodeExecContext)context; + IChannel channel = thread.getChannel(); + try { + final TCFNodeExecContext ctx = thread; + frame = new TCFTask<TCFNodeStackFrame>(channel) { + public void run() { + TCFChildrenStackTrace stack = ctx.getStackTrace(); + if (!stack.validate(this)) return; + done(stack.getTopFrame()); + } + }.getE(); + } + catch (Error x) { + if (channel.getState() == IChannel.STATE_OPEN) throw x; + frame = null; + } + if (frame == null) thread = null; } else if (context instanceof TCFNodeStackFrame) { frame = (TCFNodeStackFrame)context; - newContext = (TCFNodeExecContext)frame.getParent(); + thread = (TCFNodeExecContext)frame.getParent(); } - if (fExecContext != newContext) { + if (fExecContext != thread) { result.contextChanged = true; fSuspendCount++; if (fExecContext != null) removeListeners(fExecContext); - fExecContext = newContext; - if (newContext != null) addListeners(newContext); + fExecContext = thread; + if (thread != null) addListeners(thread); } if (fExecContext != null) { - fMemoryContext = new TCFTask<TCFNodeExecContext>() { + fMemoryContext = new TCFTask<TCFNodeExecContext>(fExecContext.getChannel()) { public void run() { TCFDataCache<TCFNodeExecContext> cache = fExecContext.getMemoryNode(); if (!cache.validate(this)) return; @@ -275,7 +282,7 @@ public class TCFDisassemblyBackend extends AbstractDisassemblyBackend { fMemoryContext = null; } fActiveFrame = frame; - result.sessionId = newContext != null ? newContext.getID() : null; + result.sessionId = thread != null ? thread.getID() : null; if (!result.contextChanged && fActiveFrame != null) { fCallback.asyncExec(new Runnable() { @@ -638,7 +645,7 @@ public class TCFDisassemblyBackend extends AbstractDisassemblyBackend { } fCallback.asyncExec(new Runnable() { public void run() { - insertDisassembly(modCount, startAddress, code, big_endian, + insertDisassembly(modCount, startAddress, code, range, big_endian, disassembly, functionSymbols, code_areas); if (fCallback.getAddressSize() < addr_bits) fCallback.addressSizeChanged(addr_bits); } @@ -651,7 +658,7 @@ public class TCFDisassemblyBackend extends AbstractDisassemblyBackend { return ((IDocumentExtension4) fCallback.getDocument()).getModificationStamp(); } - protected final void insertDisassembly(long modCount, BigInteger startAddress, byte[] code, boolean big_endian, + protected final void insertDisassembly(long modCount, BigInteger startAddress, byte[] code, AddressRange range, boolean big_endian, IDisassemblyLine[] instructions, ISymbols.Symbol[] symbols, CodeArea[] codeAreas) { if (!fCallback.hasViewer() || fExecContext == null) return; if (modCount != getModCount()) return; @@ -732,8 +739,8 @@ public class TCFDisassemblyBackend extends AbstractDisassemblyBackend { Map<String,Object>[] instrAttrs = instruction.getInstruction(); String instr = formatInstruction(instrAttrs); - if (code != null) { - int offs = address.subtract(startAddress).intValue(); + int offs = address.subtract(range.start).intValue(); + if (code != null && offs >= 0 && offs + instrLength <= code.length) { BigInteger opcode = BigInteger.ZERO; for (int i = 0; i < instrLength; i++) { int j = big_endian ? i : instrLength - i - 1; |