diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/watch/DebuggerWatchesProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/watch/DebuggerWatchesProvider.java index b7c8edd515..7cd0ccce67 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/watch/DebuggerWatchesProvider.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/watch/DebuggerWatchesProvider.java @@ -883,11 +883,29 @@ public class DebuggerWatchesProvider extends ComponentProviderAdapter reevaluate(); } + protected void clearCachedState() { + if (asyncWatchExecutor != null) { + asyncWatchExecutor.getState().clear(); + } + if (prevValueExecutor != null) { + prevValueExecutor.getState().clear(); + } + } + public synchronized void doCheckDepsAndReevaluate() { - asyncWatchExecutor.getState().clear(); + if (asyncWatchExecutor == null) { + return; + } + List toReevaluate = new ArrayList<>(); for (WatchRow row : watchTableModel.getModelData()) { AddressSetView reads = row.getReads(); if (reads == null || reads.intersects(changed)) { + toReevaluate.add(row); + } + } + if (!toReevaluate.isEmpty()) { + clearCachedState(); + for (WatchRow row : toReevaluate) { row.reevaluate(); } } @@ -895,6 +913,10 @@ public class DebuggerWatchesProvider extends ComponentProviderAdapter } public void reevaluate() { + if (asyncWatchExecutor == null) { + return; + } + clearCachedState(); for (WatchRow row : watchTableModel.getModelData()) { row.reevaluate(); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/DebuggerPcodeUtils.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/DebuggerPcodeUtils.java index 440eaf1f3d..a2a753700c 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/DebuggerPcodeUtils.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/DebuggerPcodeUtils.java @@ -72,7 +72,13 @@ public enum DebuggerPcodeUtils { } PcodeExecutorState local = new RWTargetRegistersPcodeExecutorState( access.getDataForLocalState(coordinates.getThread(), coordinates.getFrame()), Mode.RW); - return new ThreadPcodeExecutorState<>(shared, local); + return new ThreadPcodeExecutorState<>(shared, local) { + @Override + public void clear() { + shared.clear(); + local.clear(); + } + }; } /**