diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgBreakpointCreatedEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgBreakpointCreatedEvent.java index 973b38a1fe..99b03440d2 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgBreakpointCreatedEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgBreakpointCreatedEvent.java @@ -17,16 +17,11 @@ package agent.dbgeng.manager.evt; import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo; -/** - * The event corresponding with "{@code =breakpoint-created}" - */ public class DbgBreakpointCreatedEvent extends AbstractDbgEvent { private final DbgBreakpointInfo bkptInfo; /** - * Construct a new event by parsing the tail for information - * - * The breakpoint information must be specified by GDB. + * Construct a new event from the given info * * @param info breakpoint info * @@ -39,7 +34,7 @@ public class DbgBreakpointCreatedEvent extends AbstractDbgEvent { private final long number; /** - * Construct a new event by parsing the tail for information - * - * The breakpoint number must be specified by GDB. + * Construct a new event from the given info * * @param info breakpoint info */ diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgBreakpointModifiedEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgBreakpointModifiedEvent.java index 02c3e75fa5..718e95a3d7 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgBreakpointModifiedEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgBreakpointModifiedEvent.java @@ -17,17 +17,12 @@ package agent.dbgeng.manager.evt; import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo; -/** - * The event corresponding with "{@code =breakpoint-modified}" - */ public class DbgBreakpointModifiedEvent extends AbstractDbgEvent { private long bptId; /** - * Construct a new event by parsing the tail for information - * - * The breakpoint information must be specified by GDB. + * Construct a new event from the given info * * @param info breakpoint info */ @@ -44,7 +39,7 @@ public class DbgBreakpointModifiedEvent extends AbstractDbgEvent cmd; - /** - * Construct a new event, parsing the tail for information - */ public DbgCommandDoneEvent() { super(); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgCommandErrorEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgCommandErrorEvent.java index 7f2549b0cd..a065869226 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgCommandErrorEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgCommandErrorEvent.java @@ -18,9 +18,6 @@ package agent.dbgeng.manager.evt; import agent.dbgeng.manager.DbgEvent; import agent.dbgeng.manager.DbgState; -/** - * The event corresponding with "{@code ^error}" - */ public class DbgCommandErrorEvent extends AbstractDbgCompletedCommandEvent { /** diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgCommandRunningEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgCommandRunningEvent.java index f33c06f079..f812681354 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgCommandRunningEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgCommandRunningEvent.java @@ -17,14 +17,8 @@ package agent.dbgeng.manager.evt; import agent.dbgeng.manager.DbgState; -/** - * The event corresponding with "{@code ^running}" - */ public class DbgCommandRunningEvent extends AbstractDbgCompletedCommandEvent { - /** - * Construct a new event, parsing the tail for information - */ public DbgCommandRunningEvent() { super(); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgConsoleOutputEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgConsoleOutputEvent.java index 2a751813e9..7004ee9328 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgConsoleOutputEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgConsoleOutputEvent.java @@ -15,9 +15,6 @@ */ package agent.dbgeng.manager.evt; -/** - * The event corresponding with "{@code ~""}" output records - */ public class DbgConsoleOutputEvent extends AbstractDbgEvent { private int mask; diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgProcessSelectedEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgProcessSelectedEvent.java index 12326e064d..cce6c76dfe 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgProcessSelectedEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgProcessSelectedEvent.java @@ -18,9 +18,6 @@ package agent.dbgeng.manager.evt; import agent.dbgeng.dbgeng.DebugProcessId; import agent.dbgeng.manager.impl.DbgProcessImpl; -/** - * The event corresponding with "{@code =thread-selected}" - */ public class DbgProcessSelectedEvent extends AbstractDbgEvent { private final DebugProcessId id; private DbgProcessImpl process; diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgRunningEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgRunningEvent.java index 78c1c528dd..84b50954a2 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgRunningEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgRunningEvent.java @@ -18,16 +18,11 @@ package agent.dbgeng.manager.evt; import agent.dbgeng.dbgeng.DebugThreadId; import agent.dbgeng.manager.DbgState; -/** - * The event corresponding with "{@code *running}" - */ public class DbgRunningEvent extends AbstractDbgEvent { private final DebugThreadId id; /** - * Construct a new event, parsing the tail for information - * - * A thread ID must be specified by dbgeng. + * Construct a new event with the given thread ID * * @param id the event info */ diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSessionSelectedEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSessionSelectedEvent.java index 350714e86e..e5297d2c44 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSessionSelectedEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSessionSelectedEvent.java @@ -18,9 +18,6 @@ package agent.dbgeng.manager.evt; import agent.dbgeng.dbgeng.DebugSessionId; import agent.dbgeng.manager.impl.DbgSessionImpl; -/** - * The event corresponding with "{@code =thread-selected}" - */ public class DbgSessionSelectedEvent extends AbstractDbgEvent { private final DebugSessionId id; private DbgSessionImpl session; diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgStoppedEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgStoppedEvent.java index 3df476fc79..209d34fb88 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgStoppedEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgStoppedEvent.java @@ -20,18 +20,13 @@ import agent.dbgeng.manager.DbgState; import agent.dbgeng.manager.impl.DbgStackFrameImpl; import agent.dbgeng.manager.impl.DbgThreadImpl; -/** - * The event corresponding with "{@code *stopped}" - */ public class DbgStoppedEvent extends AbstractDbgEvent { private final DebugThreadId id; /** - * Construct a new event, parsing the tail for information + * Construct a new event with the given thread ID * - * A thread ID must be specified by dbgeng. - * - * @param id the event info + * @param id the thread ID */ public DbgStoppedEvent(DebugThreadId id) { super(id); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSystemErrorEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSystemErrorEvent.java index 8c79fef490..f2e8885625 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSystemErrorEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSystemErrorEvent.java @@ -15,9 +15,6 @@ */ package agent.dbgeng.manager.evt; -/** - * The event corresponding with "{@code =thread-selected}" - */ public class DbgSystemErrorEvent extends AbstractDbgEvent { private final int error; private final int level; diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSystemsEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSystemsEvent.java index 788851d79f..f82b5e55de 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSystemsEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgSystemsEvent.java @@ -15,9 +15,6 @@ */ package agent.dbgeng.manager.evt; -/** - * The event corresponding with "{@code =thread-selected}" - */ public class DbgSystemsEvent extends AbstractDbgEvent { private final long id; diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgThreadSelectedEvent.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgThreadSelectedEvent.java index cd86b59804..7e3bfe54f5 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgThreadSelectedEvent.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/evt/DbgThreadSelectedEvent.java @@ -21,9 +21,6 @@ import agent.dbgeng.manager.DbgThread; import agent.dbgeng.manager.impl.DbgStackFrameImpl; import agent.dbgeng.manager.impl.DbgThreadImpl; -/** - * The event corresponding with "{@code =thread-selected}" - */ public class DbgThreadSelectedEvent extends AbstractDbgEvent { private final DebugThreadId id; private DbgState state; diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetEventImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetEventImpl.java index 0559b2cafb..b1054b8628 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetEventImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetEventImpl.java @@ -149,7 +149,7 @@ public class DbgModelTargetEventImpl extends DbgModelTargetObjectImpl } @Override - public Map> getConfigParameters() { + public Map> getConfigurableOptions() { Map> map = new HashMap<>(); ParameterDescription cmdDesc = ParameterDescription.create(String.class, COMMAND_ATTRIBUTE_NAME, false, "", COMMAND_ATTRIBUTE_NAME, "filter command"); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetExceptionImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetExceptionImpl.java index 1c1b7dbe27..967a743a1f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetExceptionImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetExceptionImpl.java @@ -116,7 +116,7 @@ public class DbgModelTargetExceptionImpl extends DbgModelTargetObjectImpl } @Override - public Map> getConfigParameters() { + public Map> getConfigurableOptions() { Map> map = new HashMap<>(); ParameterDescription cmdDesc = ParameterDescription.create(String.class, COMMAND_ATTRIBUTE_NAME, false, "", COMMAND_ATTRIBUTE_NAME, "filter command"); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/test/java/agent/dbgeng/dbgeng/DbgEngTest.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/test/java/agent/dbgeng/dbgeng/DbgEngTest.java index a52ca42f55..51be388ae5 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/test/java/agent/dbgeng/dbgeng/DbgEngTest.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/test/java/agent/dbgeng/dbgeng/DbgEngTest.java @@ -16,7 +16,7 @@ package agent.dbgeng.dbgeng; import static org.junit.Assert.*; -import static org.junit.Assume.*; +import static org.junit.Assume.assumeTrue; import java.io.*; import java.nio.ByteBuffer; @@ -29,7 +29,6 @@ import com.sun.jna.Native; import com.sun.jna.platform.win32.COM.COMException; import com.sun.jna.win32.StdCallLibrary; -//import agent.dbgeng.DummyProc; import agent.dbgeng.dbgeng.DebugBreakpoint.BreakType; import agent.dbgeng.dbgeng.DebugClient.*; import agent.dbgeng.dbgeng.DebugDataSpaces.*; diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java index 5d4dd9612e..740f4926a4 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java @@ -46,8 +46,7 @@ import ghidra.app.plugin.core.debug.gui.DebuggerResources.*; import ghidra.app.plugin.core.debug.gui.objects.actions.*; import ghidra.app.plugin.core.debug.gui.objects.components.*; import ghidra.app.services.*; -import ghidra.async.AsyncUtils; -import ghidra.async.TypeSpec; +import ghidra.async.*; import ghidra.dbg.*; import ghidra.dbg.error.DebuggerMemoryAccessException; import ghidra.dbg.target.*; @@ -1528,17 +1527,22 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter public void performConfigure(ActionContext context) { performAction(context, false, TargetConfigurable.class, configurable -> { Map> configParameters = - configurable.getConfigParameters(); - if (configParameters.size() > 0) { - Map args = configDialog.promptArguments(configParameters); - if (args != null) { - for (Entry entry : args.entrySet()) { - configurable.writeConfigurationOption(entry.getKey(), entry.getValue()); - } - } + configurable.getConfigurableOptions(); + if (configParameters.isEmpty()) { + return AsyncUtils.NIL; } - return AsyncUtils.NIL; - }, "Couldn't configure"); + Map args = configDialog.promptArguments(configParameters); + if (args == null) { + // User cancelled + return AsyncUtils.NIL; + } + AsyncFence fence = new AsyncFence(); + for (Entry entry : args.entrySet()) { + fence.include( + configurable.writeConfigurationOption(entry.getKey(), entry.getValue())); + } + return fence.ready(); + }, "Couldn't configure one or more options"); } public void initiateConsole(ActionContext context) { diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetConfigurable.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetConfigurable.java index 44965552c0..975635dcb7 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetConfigurable.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetConfigurable.java @@ -26,10 +26,9 @@ import ghidra.dbg.target.TargetMethod.ParameterDescription; * A target with writable configuration options * *

- * In general, the options are stored as attributes, so that the current values are retrievable by - * the client, and so that the names and types of options are known. Note that not every attribute - * denotes a writable option. Enumeration of available options is not yet specified, but for the - * moment, we assume a subset of the attributes. + * In general, the options are also stored as attributes, so that the current values are retrievable + * by the client. Note that not every attribute denotes a writable option. The list of configurable + * options, along with a description of each, is retrieved using {@link #getConfigurableOptions()}. * *

* Options should be close to their scope of applicability. For example, if an object affects the @@ -51,6 +50,11 @@ public interface TargetConfigurable extends TargetObject { /** * Write a single option to this object * + *

+ * TODO: This should probably be replaced with a {@code configure(Map options)} + * method. That should also make it easy to validate the arguments using the same mechanisms as + * for {@link TargetMethod#invoke(Map)}. + * * @param key the name of the option, typically corresponding to the same-named attribute * @param value the value to assign the option, typically conforming to the attribute schema * @return a future which completes when the change is processed. @@ -59,7 +63,16 @@ public interface TargetConfigurable extends TargetObject { */ public CompletableFuture writeConfigurationOption(String key, Object value); - public default Map> getConfigParameters() { + /** + * Get the map of writable configuration options + * + *

+ * TODO: Implement this properly in all subclasses to advertise their parameters. Then remove + * this default implementation. + * + * @return a map of names to option descriptions + */ + public default Map> getConfigurableOptions() { return new HashMap<>(); } }