mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-23 17:05:26 +02:00
[302505] [disassembly view] Infinite loop retrieving disassembly
This commit is contained in:
parent
4a27c4fc9d
commit
ab580bbafe
3 changed files with 52 additions and 40 deletions
|
@ -440,7 +440,7 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
|
|||
* @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyBackend#retrieveDisassembly(java.math.BigInteger, java.math.BigInteger, java.lang.String, int, int, boolean, boolean, boolean, int)
|
||||
*/
|
||||
public void retrieveDisassembly(final BigInteger startAddress, BigInteger endAddress, final String file, final int lineNumber, final int lines, boolean mixed, final boolean showSymbols, final boolean showDisassembly, final int linesHint) {
|
||||
final BigInteger finalEndAddress= endAddress;
|
||||
final BigInteger finalEndAddress= startAddress.add(BigInteger.valueOf(32)).max(endAddress);
|
||||
|
||||
DsfSession session = getSession();
|
||||
if (session == null) {
|
||||
|
@ -460,7 +460,7 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
|
|||
public void run() {
|
||||
if (!insertDisassembly(startAddress, finalEndAddress, data, showSymbols, showDisassembly)) {
|
||||
// retry in non-mixed mode
|
||||
fCallback.retrieveDisassembly(startAddress, finalEndAddress, linesHint, false, false);
|
||||
fCallback.retrieveDisassembly(startAddress, finalEndAddress, linesHint, false, true);
|
||||
}
|
||||
}});
|
||||
} else {
|
||||
|
@ -517,7 +517,13 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
|
|||
if (!isCanceled() && getData() != null) {
|
||||
fCallback.asyncExec(new Runnable() {
|
||||
public void run() {
|
||||
insertDisassembly(startAddress, finalEndAddress, getData(), showSymbols, showDisassembly);
|
||||
if (!insertDisassembly(startAddress, finalEndAddress, getData(), showSymbols, showDisassembly)) {
|
||||
fCallback.doScrollLocked(new Runnable() {
|
||||
public void run() {
|
||||
fCallback.insertError(startAddress, DisassemblyMessages.DisassemblyBackendDsf_error_UnableToRetrieveData);
|
||||
}
|
||||
});
|
||||
}
|
||||
}});
|
||||
} else {
|
||||
final IStatus status= getStatus();
|
||||
|
@ -535,44 +541,32 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
|
|||
}
|
||||
}
|
||||
};
|
||||
if (file != null) {
|
||||
executor.execute(new Runnable() {
|
||||
public void run() {
|
||||
final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
|
||||
if (disassembly == null) {
|
||||
disassemblyRequest.cancel();
|
||||
disassemblyRequest.done();
|
||||
return;
|
||||
}
|
||||
disassembly.getInstructions(context, file, lineNumber, lines, disassemblyRequest);
|
||||
}});
|
||||
} else {
|
||||
executor.execute(new Runnable() {
|
||||
public void run() {
|
||||
final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
|
||||
if (disassembly == null) {
|
||||
disassemblyRequest.cancel();
|
||||
disassemblyRequest.done();
|
||||
return;
|
||||
}
|
||||
disassembly.getInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
|
||||
}});
|
||||
}
|
||||
executor.execute(new Runnable() {
|
||||
public void run() {
|
||||
final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
|
||||
if (disassembly == null) {
|
||||
disassemblyRequest.cancel();
|
||||
disassemblyRequest.done();
|
||||
return;
|
||||
}
|
||||
disassembly.getInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
|
||||
}});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void insertDisassembly(BigInteger startAddress, BigInteger endAddress, IInstruction[] instructions, boolean showSymbols, boolean showDisassembly) {
|
||||
private boolean insertDisassembly(BigInteger startAddress, BigInteger endAddress, IInstruction[] instructions, boolean showSymbols, boolean showDisassembly) {
|
||||
if (!fCallback.hasViewer() || fDsfSessionId == null) {
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
if (DEBUG) System.out.println("insertDisassembly "+ DisassemblyUtils.getAddressText(startAddress)); //$NON-NLS-1$
|
||||
assert fCallback.getUpdatePending();
|
||||
if (!fCallback.getUpdatePending()) {
|
||||
// safe-guard in case something weird is going on
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
// indicates whether [startAddress] was inserted
|
||||
boolean insertedStartAddress = false;
|
||||
|
||||
try {
|
||||
fCallback.lockScroller();
|
||||
|
||||
|
@ -590,9 +584,18 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
|
|||
if (p instanceof ErrorPosition && p.fValid) {
|
||||
p.fValid = false;
|
||||
fCallback.getDocument().addInvalidAddressRange(p);
|
||||
} else if (p == null || p.fValid || address.compareTo(endAddress) > 0) {
|
||||
} else if (p == null || address.compareTo(endAddress) > 0) {
|
||||
if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$
|
||||
return;
|
||||
return insertedStartAddress;
|
||||
} else if (p.fValid) {
|
||||
if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$
|
||||
if (!p.fAddressOffset.equals(address)) {
|
||||
// override probably unaligned disassembly
|
||||
p.fValid = false;
|
||||
fCallback.getDocument().addInvalidAddressRange(p);
|
||||
} else {
|
||||
return insertedStartAddress;
|
||||
}
|
||||
}
|
||||
boolean hasSource= false;
|
||||
String compilationPath= null;
|
||||
|
@ -621,8 +624,9 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
|
|||
} else {
|
||||
opCode= ""; //$NON-NLS-1$
|
||||
}
|
||||
insertedStartAddress= insertedStartAddress || address.compareTo(startAddress) == 0;
|
||||
p = fCallback.getDocument().insertDisassemblyLine(p, address, instrLength.intValue(), opCode, instruction.getInstruction(), compilationPath, -1);
|
||||
if (p == null) {
|
||||
if (p == null && insertedStartAddress) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -631,11 +635,16 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
|
|||
DisassemblyUtils.internalError(e);
|
||||
} finally {
|
||||
fCallback.setUpdatePending(false);
|
||||
fCallback.updateInvalidSource();
|
||||
fCallback.unlockScroller();
|
||||
fCallback.doPending();
|
||||
fCallback.updateVisibleArea();
|
||||
if (insertedStartAddress) {
|
||||
fCallback.updateInvalidSource();
|
||||
fCallback.unlockScroller();
|
||||
fCallback.doPending();
|
||||
fCallback.updateVisibleArea();
|
||||
} else {
|
||||
fCallback.unlockScroller();
|
||||
}
|
||||
}
|
||||
return insertedStartAddress;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -694,7 +703,7 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
|
|||
return insertedStartAddress;
|
||||
} else if (p.fValid) {
|
||||
if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$
|
||||
if (file != null && lineNumber >= 0 || p.fAddressLength == BigInteger.ONE) {
|
||||
if (!p.fAddressOffset.equals(address)) {
|
||||
// override probably unaligned disassembly
|
||||
p.fValid = false;
|
||||
fCallback.getDocument().addInvalidAddressRange(p);
|
||||
|
|
|
@ -109,6 +109,7 @@ public final class DisassemblyMessages extends NLS {
|
|||
public static String Disassembly_GotoLocation_warning;
|
||||
public static String Disassembly_Error_Dialog_title;
|
||||
public static String Disassembly_Error_Dialog_ok_button;
|
||||
public static String DisassemblyBackendDsf_error_UnableToRetrieveData;
|
||||
|
||||
static {
|
||||
NLS.initializeMessages(BUNDLE_NAME, DisassemblyMessages.class);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
##########################################################################
|
||||
# Copyright (c) 2007, 2009 Wind River Systems and others.
|
||||
# Copyright (c) 2007, 2010 Wind River 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
|
||||
|
@ -93,3 +93,5 @@ SourceColorerJob_name=Coloring source file
|
|||
EditionFinderJob_name=Finding best match for source file
|
||||
EditionFinderJob_task_get_timestamp=Retrieving module timestamp
|
||||
EditionFinderJob_task_search_history=Searching local history
|
||||
|
||||
DisassemblyBackendDsf_error_UnableToRetrieveData=Unable to retrieve disassembly data from backend.
|
||||
|
|
Loading…
Add table
Reference in a new issue