From a1cfeebcc93cb1e2e94e44a8e881649bc72452aa Mon Sep 17 00:00:00 2001
From: Dan <46821332+nsadeveloper789@users.noreply.github.com>
Date: Wed, 5 May 2021 09:35:35 -0400
Subject: [PATCH] GP-406: Central Debug Console for problems and actions
---
Ghidra/Debug/Debugger/certification.manifest | 3 +-
.../src/main/help/help/TOC_Source.xml | 4 +
.../help/topics/Debugger/Troubleshooting.html | 10 +-
.../DebuggerConsolePlugin.html | 68 ++
.../images/DebuggerConsolePlugin.png | Bin 0 -> 16762 bytes
.../DebuggerInterpreterPlugin.html | 4 +-
.../DebuggerListingPlugin.html | 27 +-
.../images/DebuggerModuleImportDialog.png | Bin 11360 -> 0 bytes
.../DebuggerModulesPlugin.html | 10 +
.../core/debug/gui/DebuggerResources.java | 96 +-
.../gui/console/ConsoleActionsCellEditor.java | 67 ++
.../console/ConsoleActionsCellRenderer.java | 89 ++
.../gui/console/DebuggerConsolePlugin.java | 130 +++
.../gui/console/DebuggerConsoleProvider.java | 487 +++++++++
.../console/LogRowConsoleActionContext.java | 22 +
.../DebuggerInterpreterPlugin.java | 23 +-
.../gui/listing/DebuggerListingPlugin.java | 2 +-
.../gui/listing/DebuggerListingProvider.java | 55 +-
.../listing/DebuggerModuleImportDialog.java | 251 -----
.../DebuggerMissingModuleActionContext.java | 55 ++
.../gui/modules/DebuggerModulesPlugin.java | 35 +-
.../gui/modules/DebuggerModulesProvider.java | 72 +-
.../model/DebuggerModelServicePlugin.java | 4 +-
.../service/model/DefaultThreadRecorder.java | 4 +-
.../service/model/TraceEventListener.java | 6 +-
.../DebuggerTraceManagerServicePlugin.java | 2 +-
.../app/services/DebuggerConsoleService.java | 87 ++
.../main/resources/defaultTools/Debugger.tool | 921 +++++++++++-------
.../DebuggerConsolePluginScreenShots.java | 77 ++
.../DebuggerListingPluginScreenShots.java | 33 -
.../console/DebuggerConsoleProviderTest.java | 78 ++
.../listing/DebuggerListingProviderTest.java | 23 +-
.../ghidra/dbg/DebuggerConsoleLogger.java | 20 +
.../model/TraceDomainObjectListener.java | 2 +-
.../trace/util/DefaultTraceTimeViewport.java | 14 +-
.../table/CustomToStringCellRenderer.java | 35 +-
.../DefaultEnumeratedColumnTableModel.java | 102 +-
.../RowWrappedEnumeratedColumnTableModel.java | 16 +-
.../src/main/java/ghidra/util/TimedMsg.java | 4 +-
39 files changed, 2101 insertions(+), 837 deletions(-)
create mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerConsolePlugin/DebuggerConsolePlugin.html
create mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerConsolePlugin/images/DebuggerConsolePlugin.png
delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerListingPlugin/images/DebuggerModuleImportDialog.png
create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/console/ConsoleActionsCellEditor.java
create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/console/ConsoleActionsCellRenderer.java
create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/console/DebuggerConsolePlugin.java
create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/console/DebuggerConsoleProvider.java
create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/console/LogRowConsoleActionContext.java
delete mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/listing/DebuggerModuleImportDialog.java
create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/modules/DebuggerMissingModuleActionContext.java
create mode 100644 Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/DebuggerConsoleService.java
create mode 100644 Ghidra/Debug/Debugger/src/screen/java/ghidra/app/plugin/core/debug/gui/console/DebuggerConsolePluginScreenShots.java
create mode 100644 Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/console/DebuggerConsoleProviderTest.java
create mode 100644 Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebuggerConsoleLogger.java
diff --git a/Ghidra/Debug/Debugger/certification.manifest b/Ghidra/Debug/Debugger/certification.manifest
index 1e12776852..9f50cd3e65 100644
--- a/Ghidra/Debug/Debugger/certification.manifest
+++ b/Ghidra/Debug/Debugger/certification.manifest
@@ -38,11 +38,12 @@ src/main/help/help/topics/DebuggerBreakpointsPlugin/images/breakpoint-mixed-ed.p
src/main/help/help/topics/DebuggerBreakpointsPlugin/images/breakpoints-clear-all.png||GHIDRA||||END|
src/main/help/help/topics/DebuggerBreakpointsPlugin/images/breakpoints-disable-all.png||GHIDRA||||END|
src/main/help/help/topics/DebuggerBreakpointsPlugin/images/breakpoints-enable-all.png||GHIDRA||||END|
+src/main/help/help/topics/DebuggerConsolePlugin/DebuggerConsolePlugin.html||GHIDRA||||END|
+src/main/help/help/topics/DebuggerConsolePlugin/images/DebuggerConsolePlugin.png||GHIDRA||||END|
src/main/help/help/topics/DebuggerInterpreterPlugin/DebuggerInterpreterPlugin.html||GHIDRA||||END|
src/main/help/help/topics/DebuggerListingPlugin/DebuggerListingPlugin.html||GHIDRA||||END|
src/main/help/help/topics/DebuggerListingPlugin/images/DebuggerGoToDialog.png||GHIDRA||||END|
src/main/help/help/topics/DebuggerListingPlugin/images/DebuggerListingPlugin.png||GHIDRA||||END|
-src/main/help/help/topics/DebuggerListingPlugin/images/DebuggerModuleImportDialog.png||GHIDRA||||END|
src/main/help/help/topics/DebuggerMemviewPlugin/DebuggerMemviewPlugin.html||GHIDRA||||END|
src/main/help/help/topics/DebuggerMemviewPlugin/images/DebuggerMemviewPlugin.png||GHIDRA||||END|
src/main/help/help/topics/DebuggerMemviewPlugin/images/DebuggerMemviewPlugin_old.png||GHIDRA||||END|
diff --git a/Ghidra/Debug/Debugger/src/main/help/help/TOC_Source.xml b/Ghidra/Debug/Debugger/src/main/help/help/TOC_Source.xml
index a9902c2ef8..d21c44c30c 100644
--- a/Ghidra/Debug/Debugger/src/main/help/help/TOC_Source.xml
+++ b/Ghidra/Debug/Debugger/src/main/help/help/TOC_Source.xml
@@ -74,6 +74,10 @@
target="help/topics/DebuggerModelServicePlugin/DebuggerModelServicePlugin.html" />
+
+
diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/Troubleshooting.html b/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/Troubleshooting.html
index c851714c51..0ed4ff62bc 100644
--- a/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/Troubleshooting.html
+++ b/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/Troubleshooting.html
@@ -15,9 +15,10 @@
Error Console
- The first place to look when you're having trouble is the error console. In Eclipse, this is
- just the "Console" window. In Ghidra, it can be accessed from the main application window.
- Sometimes it reports known issues; sometimes it reports unexpected behavior; etc., which may be
+
The first place to look when you're having trouble is the Debug Console. Second, if you're
+ in Eclipse, you can check its "Console" window. Often, Ghidra's Debug Console will offer
+ actions to help you resolve a well-known issue or configuration problem. It also duplicates the
+ error log, when those messages are emitted from a debugger-related class. These typically offer
clues to exactly what has gone wrong.
Settings and Toggles
@@ -38,9 +39,6 @@
In the Dynamic Listing:
- "Auto-Import Current Module" will cause the user to be prompted for information to sync
- static and dynamic listings.
-
"Sync to Static Listing" controls the tracking of the Static listing.
diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerConsolePlugin/DebuggerConsolePlugin.html b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerConsolePlugin/DebuggerConsolePlugin.html
new file mode 100644
index 0000000000..30e30a3393
--- /dev/null
+++ b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerConsolePlugin/DebuggerConsolePlugin.html
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+ Debugger: Memory Regions
+
+
+
+
+
+ Debugger: Console
+
+
+
+
+
+
+
+
+
+ The console logs messages from Ghidra related to the debugger. Depending on the exact
+ configuration, this can comprise a wide range of components, including all GUI views, active
+ connectors, and running agents. Currently, it implements an appender to gather all Log4J
+ messages emitted by Ghidra and filters for debugger-related packages and a level in the range
+ INFO through and including FATAL. That feature will likely be removed as more components are
+ programmed to work directly with the console. Soon, it may also provide a command-line
+ interface to control Ghidra's debugging sessions and interact with traces.
+
+ Some log messages include an action context, allowing plug-ins to offer actions on that
+ message. These are said to be "actionable" messages. A noteworthy example is when navigating to
+ a module that could not be automatically mapped from the current project. Instead of displaying
+ a prompt, it will log a message and suggest actions to resolve the issue. A successful
+ resolution typically removes the message from the log. Note that additional actions may be
+ available from the context menu.
+
+ By default, the log is sorted so that actionable messages appear at the top. Then, it is
+ sorted by descending date, so that the most recent messages appear at the top. Like any other
+ Ghidra table, it can customized and filtered. Note that the filter box is at the top, because
+ we anticipate a command-line input in the future, which we'd like to place at the bottom.
+
+ Table Columns
+
+ The table has the following columns:
+
+
+ Icon - an icon to identify the type, topic, or source of a message.
+
+ Message - the message itself.
+
+ Actions - if actionable, a row of buttons for available actions.
+
+ Time - the time the message was generated in 24-hour HH:mm:ss.SSS format.
+
+
+ Actions
+
+ Not considering extension actions from other plugins, the console provides the
+ following:
+
+ Clear
+
+ Removes all messages, including actionable messages, from the log.
+
+
diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerConsolePlugin/images/DebuggerConsolePlugin.png b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerConsolePlugin/images/DebuggerConsolePlugin.png
new file mode 100644
index 0000000000000000000000000000000000000000..79f8089b97ad217e4216160befedfbc24b61ebd8
GIT binary patch
literal 16762
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
-
+
Interrupt
-
+
This action is always available. It interrupts the current target's execution.