diff --git a/Ghidra/Debug/Debugger-api/src/main/java/ghidra/debug/api/tracemgr/DebuggerCoordinates.java b/Ghidra/Debug/Debugger-api/src/main/java/ghidra/debug/api/tracemgr/DebuggerCoordinates.java index 7f51b76abd..cc7c433083 100644 --- a/Ghidra/Debug/Debugger-api/src/main/java/ghidra/debug/api/tracemgr/DebuggerCoordinates.java +++ b/Ghidra/Debug/Debugger-api/src/main/java/ghidra/debug/api/tracemgr/DebuggerCoordinates.java @@ -28,6 +28,7 @@ import ghidra.framework.options.SaveState; import ghidra.framework.plugintool.PluginTool; import ghidra.framework.store.LockException; import ghidra.program.model.address.AddressSpace; +import ghidra.program.model.lang.Language; import ghidra.trace.database.DBTraceContentHandler; import ghidra.trace.model.Lifespan; import ghidra.trace.model.Trace; @@ -48,7 +49,6 @@ public class DebuggerCoordinates { /** * Coordinates that indicate no trace is active in the Debugger UI. - * *

* Typically, that only happens when no trace is open. Telling the trace manager to activate * {@code NOWHERE} will cause it to instead activate the most recently active trace, which may @@ -609,6 +609,10 @@ public class DebuggerCoordinates { return platform; } + public Language getLanguage() { + return platform == null ? null : platform.getLanguage(); + } + public Target getTarget() { return target; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/register/DebuggerRegistersProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/register/DebuggerRegistersProvider.java index 3424208868..6de9fe339e 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/register/DebuggerRegistersProvider.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/register/DebuggerRegistersProvider.java @@ -332,7 +332,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter * It's possible an "undo" or other transaction rollback will cause the current thread * to be replaced by another object. If that's the case, we need to adjust our * coordinates. - * + *

* If that adjustment does not otherwise cause the table to update, we have to fire that * event, since the register values may have changed, esp., if this "restored" event is * the result of many events being coalesced. @@ -499,7 +499,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter final RegistersTableModel regsTableModel; GhidraTable regsTable; GhidraTableFilterPanel regsFilterPanel; - Map regMap = new HashMap<>(); + Map regMap = new IdentityHashMap<>(); private final DebuggerAvailableRegistersDialog availableRegsDialog; @@ -826,7 +826,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter prepareRegisterSpace(); recomputeViewKnown(); - loadRegistersAndValues(); + loadRegistersAndValues(previous.getLanguage() != current.getLanguage()); contextChanged(); return true; } @@ -984,7 +984,6 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter /** * Ensure the register space exists and has been populated from register object values. - * *

* TODO: I wish this were not necessary. Maybe I should create the space when register object * values are populated. @@ -1080,10 +1079,8 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter /** * Gather general registers, the program counter, and the stack pointer - * *

* This excludes the context register - * *

* TODO: Several pspec files need adjustment to clean up "common registers" * @@ -1234,7 +1231,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter Set selection = getSelectionFor(current.getPlatform()); selection.clear(); selection.addAll(new TreeSet<>(selectedRegisters)); - return loadRegistersAndValues(); + return loadRegistersAndValues(false); } public RegisterRow getRegisterRow(Register register) { @@ -1275,12 +1272,16 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter regsTableModel.addAll(toAdd); } - protected CompletableFuture loadRegistersAndValues() { + protected CompletableFuture loadRegistersAndValues(boolean changeLanguage) { if (current.getThread() == null) { regsTableModel.clear(); regMap.clear(); return AsyncUtils.nil(); } + if (changeLanguage) { + regsTableModel.clear(); + regMap.clear(); + } Set selected = getSelectionFor(current.getPlatform()); displaySelectedRegisters(selected); return loadValues();