From 7a60300b65ddba592d3b84ebd16f8e483fdd45c9 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Thu, 19 Jan 2023 20:08:21 +0000 Subject: [PATCH] GP-3028: Fix follow present and control mode timing issues. --- .../AbstractDebuggerProgramLaunchOffer.java | 6 ++++-- .../DebuggerTraceManagerServicePlugin.java | 17 ++++++++++++----- .../workflow/MultiToolTraceListenerManager.java | 4 +++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/launch/AbstractDebuggerProgramLaunchOffer.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/launch/AbstractDebuggerProgramLaunchOffer.java index 86ab4a6fd5..ed20c6f409 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/launch/AbstractDebuggerProgramLaunchOffer.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/launch/AbstractDebuggerProgramLaunchOffer.java @@ -15,7 +15,7 @@ */ package ghidra.app.plugin.core.debug.service.model.launch; -import static ghidra.async.AsyncUtils.*; +import static ghidra.async.AsyncUtils.loop; import java.io.IOException; import java.util.*; @@ -31,6 +31,7 @@ import org.jdom.JDOMException; import ghidra.app.plugin.core.debug.gui.objects.components.DebuggerMethodInvocationDialog; import ghidra.app.services.*; +import ghidra.app.services.DebuggerTraceManagerService.ActivationCause; import ghidra.app.services.ModuleMapProposal.ModuleMapEntry; import ghidra.async.*; import ghidra.dbg.*; @@ -553,7 +554,8 @@ public abstract class AbstractDebuggerProgramLaunchOffer implements DebuggerProg Trace trace = recorder.getTrace(); Swing.runLater(() -> { traceManager.openTrace(trace); - traceManager.activateTrace(trace); + traceManager.activate(traceManager.resolveTrace(trace), + ActivationCause.START_RECORDING); }); } return recorder; diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java index be9ba6fc64..f953732044 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java @@ -551,10 +551,17 @@ public class DebuggerTraceManagerServicePlugin extends Plugin return coordinates.platform(platform); } - protected DebuggerCoordinates doSetCurrent(DebuggerCoordinates newCurrent) { + protected DebuggerCoordinates doSetCurrent(DebuggerCoordinates newCurrent, + ActivationCause cause) { newCurrent = newCurrent == null ? DebuggerCoordinates.NOWHERE : newCurrent; newCurrent = fillInRecorder(newCurrent.getTrace(), newCurrent); newCurrent = fillInPlatform(newCurrent); + if (cause == ActivationCause.START_RECORDING || cause == ActivationCause.FOLLOW_PRESENT) { + TraceRecorder recorder = newCurrent.getRecorder(); + if (recorder != null) { + newCurrent = newCurrent.snap(recorder.getSnap()); + } + } synchronized (listenersByTrace) { if (current.equals(newCurrent)) { return null; @@ -687,7 +694,7 @@ public class DebuggerTraceManagerServicePlugin extends Plugin public void processEvent(PluginEvent event) { super.processEvent(event); if (event instanceof TraceActivatedPluginEvent ev) { - doSetCurrent(ev.getActiveCoordinates()); + doSetCurrent(ev.getActiveCoordinates(), ev.getCause()); } else if (event instanceof TraceClosedPluginEvent ev) { doTraceClosed(ev.getTrace()); @@ -800,7 +807,7 @@ public class DebuggerTraceManagerServicePlugin extends Plugin } varView.setSnap(snap); fireLocationEvent(coordinates, cause); - }, SwingExecutorService.MAYBE_NOW); + }, SwingExecutorService.LATER); // Not MAYBE_NOW lest snap events get out of order } protected void fireLocationEvent(DebuggerCoordinates coordinates, ActivationCause cause) { @@ -1076,7 +1083,7 @@ public class DebuggerTraceManagerServicePlugin extends Plugin } protected void activateNoFocus(DebuggerCoordinates coordinates, ActivationCause cause) { - DebuggerCoordinates resolved = doSetCurrent(coordinates); + DebuggerCoordinates resolved = doSetCurrent(coordinates, cause); if (resolved == null) { return; } @@ -1142,7 +1149,7 @@ public class DebuggerTraceManagerServicePlugin extends Plugin } } prev = current; - resolved = doSetCurrent(coordinates); + resolved = doSetCurrent(coordinates, cause); if (resolved == null) { return AsyncUtils.NIL; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/workflow/MultiToolTraceListenerManager.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/workflow/MultiToolTraceListenerManager.java index a32d2a496e..6c42b54586 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/workflow/MultiToolTraceListenerManager.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/workflow/MultiToolTraceListenerManager.java @@ -66,7 +66,9 @@ public class MultiToolTraceListenerManager