From 8f9527369d4173b8023aaaa74907863f904c2253 Mon Sep 17 00:00:00 2001 From: d-millar <33498836+d-millar@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:13:33 +0000 Subject: [PATCH] GP-7282: just DAP GP-7282: still not right GP-7282: still not right GP-7282: aisle 9 GP-7282: working flow graph GP-7282: typing... GP-7283: script, first half GP-7282: dap fixes --- .../src/main/java/dap/DapDebugAdapter.java | 13 ++++++++++++- .../Debugger-dap/src/main/java/dap/DapPlugin.java | 8 ++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Ghidra/Debug/Debugger-dap/src/main/java/dap/DapDebugAdapter.java b/Ghidra/Debug/Debugger-dap/src/main/java/dap/DapDebugAdapter.java index 19c445d409..a065c4af3f 100644 --- a/Ghidra/Debug/Debugger-dap/src/main/java/dap/DapDebugAdapter.java +++ b/Ghidra/Debug/Debugger-dap/src/main/java/dap/DapDebugAdapter.java @@ -49,6 +49,7 @@ import ghidra.program.model.symbol.SymbolIterator; import ghidra.program.util.ProgramLocation; import ghidra.trace.model.Lifespan; import ghidra.trace.model.Trace; +import ghidra.trace.model.breakpoint.TraceBreakpointKind; import ghidra.trace.model.breakpoint.TraceBreakpointKind.CommonSet; import ghidra.trace.model.breakpoint.TraceBreakpointKind.TraceBreakpointKindSet; import ghidra.trace.model.breakpoint.TraceBreakpointLocation; @@ -415,6 +416,15 @@ public class DapDebugAdapter implements IDebugProtocolServer { // unclear whether it receives/filters client.breakpoint messages. Until it does, seems // unwise to clear breakpoints possible only know to Ghidra List> deletionFutures = new ArrayList<>(); + Collection locations = + manager.getCurrentTrace().getBreakpointManager().getAllBreakpointLocations(); + for (TraceBreakpointLocation loc : locations) { + Set kinds = loc.getKinds(manager.getCurrentSnap()); + if ((kinds.equals(CommonSet.HWX.kinds()) && dataBreakpoints) || + (kinds.equals(CommonSet.SWX.kinds()) && !dataBreakpoints)) { + target.deleteBreakpointAsync(loc); + } + } return CompletableFuture.allOf(deletionFutures.toArray(new CompletableFuture[0])); } @@ -767,7 +777,8 @@ public class DapDebugAdapter implements IDebugProtocolServer { } private TraceBreakpointKindSet kind(String mode) { - return mode.equals("hardware") ? CommonSet.HWX.kinds() : CommonSet.SWX.kinds(); + return mode == null || !mode.equals("hardware") ? CommonSet.SWX.kinds() + : CommonSet.HWX.kinds(); } private TraceBreakpointKindSet kinds(DataBreakpointAccessType accessType) { diff --git a/Ghidra/Debug/Debugger-dap/src/main/java/dap/DapPlugin.java b/Ghidra/Debug/Debugger-dap/src/main/java/dap/DapPlugin.java index fb6dcd3870..fe7460e8c1 100644 --- a/Ghidra/Debug/Debugger-dap/src/main/java/dap/DapPlugin.java +++ b/Ghidra/Debug/Debugger-dap/src/main/java/dap/DapPlugin.java @@ -75,6 +75,7 @@ public class DapPlugin extends ProgramPlugin { private DapServer server; private final Map listeners = new HashMap<>(); private IDebugProtocolClient client; + private long lastSnap = -1L; public DapPlugin(PluginTool tool) { super(tool); @@ -282,8 +283,11 @@ public class DapPlugin extends ProgramPlugin { trace.getTimeManager().getSnapshot(currentSnap, false); args.setDescription( snapshot == null ? "STOPPED" : snapshot.getDescription()); - args.setReason(ThreadEventArgumentsReason.STARTED); - client.stopped(args); + args.setReason(StoppedEventArgumentsReason.STEP); + if (lastSnap != currentSnap) { + client.stopped(args); + lastSnap = currentSnap; + } } case RUNNING -> { ContinuedEventArguments args = new ContinuedEventArguments();