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

[302006] Disassembly view doesn't take into account active debug context when jumping to an address

This commit is contained in:
Anton Leherbauer 2010-02-17 09:33:12 +00:00
parent ed9c03f437
commit a603dc072a
3 changed files with 44 additions and 26 deletions

View file

@ -60,6 +60,8 @@ public class DisassemblyBackendCdi implements IDisassemblyBackend, IDebugEventSe
private String fCdiSessionId; private String fCdiSessionId;
private ICStackFrame fTargetFrameContext; private ICStackFrame fTargetFrameContext;
private CDIDisassemblyRetrieval fDisassemblyRetrieval; private CDIDisassemblyRetrieval fDisassemblyRetrieval;
/* The frame level as the disassembly callback expects it (0 = topmost frame) */
private int fFrameLevel;
public DisassemblyBackendCdi() { public DisassemblyBackendCdi() {
} }
@ -120,6 +122,7 @@ public class DisassemblyBackendCdi implements IDisassemblyBackend, IDebugEventSe
} catch (DebugException e) { } catch (DebugException e) {
} }
} }
fFrameLevel = result.frameLevel;
if (fTargetContext != null) { if (fTargetContext != null) {
result.sessionId = fCdiSessionId = cdiSessionId; result.sessionId = fCdiSessionId = cdiSessionId;
@ -127,16 +130,22 @@ public class DisassemblyBackendCdi implements IDisassemblyBackend, IDebugEventSe
} }
} }
else if (context instanceof ICStackFrame) { else if (context instanceof ICStackFrame) {
if (context instanceof ICStackFrame) { fTargetFrameContext = (ICStackFrame)context;
fTargetFrameContext = (ICStackFrame)context; ICThread newTargetContext = (ICThread)fTargetFrameContext.getThread();
fTargetContext = (ICThread)fTargetFrameContext.getThread(); ICThread oldTargetContext = fTargetContext;
try { fTargetContext = newTargetContext;
// CDI frame levels are ordered opposite of DSF. Frame 0 is the if (oldTargetContext != null && newTargetContext != null) {
// root frame of the thread where in DSF it's the topmost frame result.contextChanged = !oldTargetContext.getDebugTarget().equals(newTargetContext.getDebugTarget());
// (where the PC is). Do a little math to flip reverse the value }
result.frameLevel = ((CStackFrame)((fTargetContext.getTopStackFrame()))).getLevel() - fTargetFrameContext.getLevel(); try {
} catch (DebugException e) { // CDI frame levels are ordered opposite of DSF. Frame 0 is the
} // root frame of the thread where in DSF it's the topmost frame
// (where the PC is). Do a little math to flip reverse the value
result.frameLevel = ((CStackFrame)((fTargetContext.getTopStackFrame()))).getLevel() - fTargetFrameContext.getLevel();
} catch (DebugException e) {
}
fFrameLevel = result.frameLevel;
if (!result.contextChanged) {
fCallback.gotoFrame(result.frameLevel); fCallback.gotoFrame(result.frameLevel);
} }
} }
@ -167,6 +176,7 @@ public class DisassemblyBackendCdi implements IDisassemblyBackend, IDebugEventSe
fCdiSessionId = null; fCdiSessionId = null;
fTargetFrameContext = null; fTargetFrameContext = null;
fDisassemblyRetrieval = null; fDisassemblyRetrieval = null;
fFrameLevel = 0;
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -174,7 +184,12 @@ public class DisassemblyBackendCdi implements IDisassemblyBackend, IDebugEventSe
*/ */
public void retrieveFrameAddress(final int targetFrame) { public void retrieveFrameAddress(final int targetFrame) {
try { try {
IStackFrame stackFrame= fTargetContext.getStackFrames()[targetFrame]; final IStackFrame[] stackFrames= fTargetContext.getStackFrames();
if (stackFrames.length <= targetFrame) {
fCallback.setUpdatePending(false);
return;
}
IStackFrame stackFrame= stackFrames[targetFrame];
fDisassemblyRetrieval.asyncGetFrameAddress(stackFrame, new IDisassemblyRetrieval.AddressRequest() { fDisassemblyRetrieval.asyncGetFrameAddress(stackFrame, new IDisassemblyRetrieval.AddressRequest() {
@Override @Override
public void done() { public void done() {
@ -199,7 +214,7 @@ public class DisassemblyBackendCdi implements IDisassemblyBackend, IDebugEventSe
* @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#getFrameLevel() * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#getFrameLevel()
*/ */
public int getFrameLevel() { public int getFrameLevel() {
return fTargetFrameContext.getLevel(); return fFrameLevel;
} }
/* (non-Javadoc) /* (non-Javadoc)

View file

@ -181,15 +181,17 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
} else if (dmContext instanceof IFrameDMContext) { } else if (dmContext instanceof IFrameDMContext) {
// switch to different frame // switch to different frame
IFrameDMContext frame= (IFrameDMContext) dmContext; IFrameDMContext frame= (IFrameDMContext) dmContext;
final IDMContext[] parents= frame.getParents(); IExecutionDMContext newExeDmc = DMContexts.getAncestorOfType(frame, IExecutionDMContext.class);
for (IDMContext parent : parents) { if (newExeDmc != null) {
if (parent instanceof IExecutionDMContext) { IDisassemblyDMContext newDisDmc = DMContexts.getAncestorOfType(newExeDmc, IDisassemblyDMContext.class);
fTargetContext= (IExecutionDMContext) parent; IDisassemblyDMContext oldDisDmc = DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
fTargetFrameContext= frame; result.contextChanged = !newDisDmc.equals(oldDisDmc);
fTargetContext= newExeDmc;
fTargetFrameContext= frame;
if (!result.contextChanged) {
fCallback.gotoFrameIfActive(frame.getLevel()); fCallback.gotoFrameIfActive(frame.getLevel());
result.frameLevel = getFrameLevel();
break;
} }
result.frameLevel = getFrameLevel();
} }
} }

View file

@ -1842,7 +1842,12 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
fJumpToAddressAction.setEnabled(true); fJumpToAddressAction.setEnabled(true);
fAddressBar.enableAddressBox(true); fAddressBar.enableAddressBox(true);
updatePC(PC_UNKNOWN); int activeFrame = getActiveStackFrame();
if (activeFrame > 0) {
gotoFrame(activeFrame);
} else {
updatePC(PC_UNKNOWN);
}
if (fGotoAddressPending != PC_UNKNOWN) { if (fGotoAddressPending != PC_UNKNOWN) {
gotoAddress(fGotoAddressPending); gotoAddress(fGotoAddressPending);
@ -1856,10 +1861,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
fAddressBar.enableAddressBox(false); fAddressBar.enableAddressBox(false);
fViewer.removeViewportListener(this); fViewer.removeViewportListener(this);
fGotoMarkerPending = null; fGotoMarkerPending = null;
// invokeLater(new Runnable() {
// public void run() {
// closePart();
// }});
} }
updateTitle(); updateTitle();
updateStateDependentActions(); updateStateDependentActions();
@ -1917,7 +1918,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
fGotoFramePending = false; fGotoFramePending = false;
fPCAddress = fFrameAddress = PC_RUNNING; fPCAddress = fFrameAddress = PC_RUNNING;
fTargetFrame = -1; fTargetFrame = -1;
fGotoAddressPending = fFocusAddress; fGotoAddressPending = PC_UNKNOWN;
fFocusAddress = PC_UNKNOWN; fFocusAddress = PC_UNKNOWN;
setFocusPosition(null); setFocusPosition(null);
fPCHistory.clear(); fPCHistory.clear();