From c634283544a4cd24438ef37984aff88ca4ce5c68 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Fri, 12 Apr 2024 16:39:41 -0400 Subject: [PATCH] GP-3837: Update Debugger Help for Trace RMI. --- .../data/debugger-launchers/local-ttd.bat | 2 +- .../data/debugger-launchers/local-gdb.sh | 2 +- .../data/debugger-launchers/qemu-gdb.sh | 7 +- .../data/debugger-launchers/raw-gdb.sh | 2 +- .../data/debugger-launchers/remote-gdb.sh | 1 + .../data/debugger-launchers/ssh-gdb.sh | 2 +- .../data/debugger-launchers/ssh-gdbserver.sh | 2 +- .../data/debugger-launchers/wine-gdb.sh | 4 +- .../data/debugger-launchers/remote-lldb.sh | 3 +- Ghidra/Debug/Debugger-rmi-trace/build.gradle | 1 + .../Debugger-rmi-trace/certification.manifest | 7 + .../data/debugger-launchers/raw-python3.sh | 2 +- .../src/main/help/help/TOC_Source.xml | 61 ++ .../TraceRmiConnectionManagerPlugin.html | 107 ++++ .../images/ConnectDialog.png | Bin 0 -> 7093 bytes .../TraceRmiConnectionManagerPlugin.png | Bin 0 -> 10459 bytes .../TraceRmiLauncherServicePlugin.html | 598 ++++++++++++++++++ .../images/GdbLauncher.png | Bin 0 -> 17742 bytes .../images/GdbTerminal.png | Bin 0 -> 44159 bytes .../launcher/AbstractTraceRmiLaunchOffer.java | 8 +- .../service/tracermi/TraceRmiHandler.java | 10 +- ...RmiConnectionManagerPluginScreenShots.java | 75 +++ ...TraceRmiConnectionManagerProviderTest.java | 2 +- Ghidra/Debug/Debugger/certification.manifest | 16 +- .../Debugger/data/debugger.theme.properties | 3 + .../src/main/help/help/TOC_Source.xml | 60 +- .../help/help/topics/Debugger/Debugger.html | 43 +- .../help/topics/Debugger/GettingStarted.html | 199 +++--- .../help/topics/Debugger/Troubleshooting.html | 103 +-- .../DebuggerBreakpointMarkerPlugin.html | 63 +- .../DebuggerBreakpointsPlugin.html | 204 +++--- .../images/DebuggerBreakpointsPlugin.png | Bin 27493 -> 28715 bytes .../DebuggerConsolePlugin.html | 42 +- .../images/DebuggerConsolePlugin.png | Bin 17075 -> 18571 bytes .../DebuggerControlPlugin.html | 92 +-- .../DebuggerCopyActionsPlugin.html | 15 +- .../images/DebuggerCopyIntoProgramDialog.png | Bin 38319 -> 33609 bytes .../DebuggerInterpreterPlugin.html | 8 +- .../DebuggerListingPlugin.html | 93 +-- .../images/DebuggerGoToDialog.png | Bin 7183 -> 5978 bytes .../images/DebuggerListingPlugin.png | Bin 49963 -> 47928 bytes .../DebuggerMemoryBytesPlugin.html | 82 +-- .../images/DebuggerMemoryBytesPlugin.png | Bin 46900 -> 47566 bytes .../DebuggerMemviewPlugin.html | 19 +- .../DebuggerModelPlugin.html | 308 +++++++++ .../images/DebuggerModelPlugin.png | Bin 0 -> 39410 bytes .../DebuggerModelServicePlugin.html | 5 + .../DebuggerModulesPlugin.html | 95 ++- .../images/DebuggerModulesPlugin.png | Bin 27784 -> 26217 bytes .../DebuggerObjectsPlugin.html | 115 ++-- .../images/breakpoint-set.png | Bin 383 -> 0 bytes .../images/display_as_graph.png | Bin 368 -> 0 bytes .../images/display_as_table.png | Bin 566 -> 0 bytes .../images/display_as_tree.png | Bin 295 -> 0 bytes .../images/display_as_xml.png | Bin 857 -> 0 bytes .../images/display_filtered_graph.png | Bin 368 -> 0 bytes .../images/display_filtered_table.png | Bin 566 -> 0 bytes .../images/display_filtered_tree.png | Bin 295 -> 0 bytes .../images/display_filtered_xml.png | Bin 857 -> 0 bytes .../images/export_as_facts.png | Bin 545 -> 0 bytes .../images/export_as_xml.png | Bin 857 -> 0 bytes .../images/import_from_facts.png | Bin 545 -> 0 bytes .../images/import_from_xml.png | Bin 857 -> 0 bytes .../DebuggerObjectsPlugin/images/stop.png | Bin 172 -> 0 bytes .../DebuggerPcodeStepperPlugin.html | 34 +- .../images/DebuggerPcodeStepperPlugin.png | Bin 31293 -> 28521 bytes .../DebuggerPlatformPlugin.html | 73 +-- .../DebuggerSelectPlatformOfferDialog.png | Bin 25696 -> 20539 bytes .../DebuggerRegionsPlugin.html | 62 +- .../DebuggerRegionMapProposalDialog.png | Bin 22302 -> 21275 bytes .../images/DebuggerRegionsPlugin.png | Bin 20272 -> 19246 bytes .../DebuggerRegistersPlugin.html | 83 ++- .../DebuggerAvailableRegistersDialog.png | Bin 43243 -> 40601 bytes .../images/DebuggerRegistersPlugin.png | Bin 36109 -> 29217 bytes .../DebuggerStackPlugin.html | 66 +- .../images/DebuggerStackPlugin.png | Bin 8962 -> 10867 bytes .../images/DebuggerStackUnwindInListing.png | Bin 46585 -> 47197 bytes .../DebuggerStaticMappingPlugin.html | 42 +- .../images/DebuggerStaticMappingPlugin.png | Bin 16779 -> 15866 bytes .../DebuggerTargetsPlugin.html | 28 +- .../DebuggerThreadsPlugin.html | 117 ++-- .../images/DebuggerThreadsPlugin.png | Bin 18943 -> 16008 bytes .../DebuggerTimePlugin.html | 69 +- .../images/DebuggerTimePlugin.png | Bin 19284 -> 19518 bytes .../DebuggerTraceManagerServicePlugin.html | 22 +- .../DebuggerTraceViewDiffPlugin.html | 53 +- .../images/DebuggerTimeSelectionDialog.png | Bin 21154 -> 19648 bytes .../images/DebuggerTraceViewDiffPlugin.png | Bin 50812 -> 46268 bytes .../DebuggerWatchesPlugin.html | 36 +- .../images/DebuggerWatchesPlugin.png | Bin 20740 -> 20247 bytes .../VariableValueHoverPlugin.html | 47 +- .../VariableValueHoverPluginBrowser.png | Bin 63084 -> 62289 bytes .../VariableValueHoverPluginDecompiler.png | Bin 31913 -> 31543 bytes .../VariableValueHoverPluginListing.png | Bin 57552 -> 55440 bytes .../core/debug/gui/DebuggerResources.java | 6 +- .../DebuggerBreakpointsProvider.java | 35 +- .../core/debug/gui/model/ModelQuery.java | 10 +- ...AbstractTraceValueObjectAddressColumn.java | 5 + .../AbstractTraceValueObjectLengthColumn.java | 5 + .../TraceValueObjectPropertyColumn.java | 7 +- .../gui/modules/DebuggerModulesProvider.java | 4 +- .../debug/gui/stack/DebuggerStackPanel.java | 109 +++- .../gui/thread/DebuggerThreadsPanel.java | 147 +++-- ...ebuggerLogicalBreakpointServicePlugin.java | 9 +- .../emulation/ProgramEmulationUtils.java | 9 + .../DebuggerStaticMappingProposals.java | 1 - .../modules/DebuggerStaticMappingUtils.java | 8 +- .../DebuggerConsolePluginScreenShots.java | 51 +- .../DebuggerCopyActionsPluginScreenShots.java | 36 +- ...ebuggerTraceViewDiffPluginScreenShots.java | 9 +- .../DebuggerListingPluginScreenShots.java | 5 + .../DebuggerRegionsPluginScreenShots.java | 21 +- .../model/DebuggerModelPluginScreenShots.java | 209 ++++++ .../DebuggerModulesPluginScreenShots.java | 41 +- ...ebuggerStaticMappingPluginScreenShots.java | 24 +- ...DebuggerPcodeStepperPluginScreenShots.java | 12 +- .../stack/DebuggerStackPluginScreenShots.java | 19 +- .../VariableValueHoverPluginScreenShots.java | 21 +- .../DebuggerThreadsPluginScreenShots.java | 221 +++++-- .../memory/DebuggerRegionsProviderTest.java | 39 +- .../gui/stack/DebuggerStackProviderTest.java | 99 +-- .../thread/DebuggerThreadsProviderTest.java | 45 +- .../debug/service/control/MockTarget.java | 4 +- .../dbg/target/schema/XmlSchemaContext.java | 8 +- .../main/java/ghidra/dbg/util/ShellUtils.java | 14 + .../data/AbstractPcodeTraceDataAccess.java | 2 +- .../memory/DBTraceObjectMemoryRegion.java | 19 +- .../database/target/DBTraceObjectManager.java | 6 +- .../plugin/core/terminal/TerminalPlugin.java | 23 +- .../core/terminal/TerminalProvider.java | 11 +- .../ghidra/app/services/TerminalService.java | 29 +- .../java/help/validator/HTMLFileParser.java | 9 +- .../DebuggerBreakpointsPluginScreenShots.java | 170 ++--- ...ceRmiLauncherServicePluginScreenShots.java | 69 ++ 134 files changed, 3214 insertions(+), 1550 deletions(-) create mode 100644 Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/TOC_Source.xml create mode 100644 Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiConnectionManagerPlugin/TraceRmiConnectionManagerPlugin.html create mode 100644 Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiConnectionManagerPlugin/images/ConnectDialog.png create mode 100644 Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiConnectionManagerPlugin/images/TraceRmiConnectionManagerPlugin.png create mode 100644 Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/TraceRmiLauncherServicePlugin.html create mode 100644 Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/images/GdbLauncher.png create mode 100644 Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/images/GdbTerminal.png create mode 100644 Ghidra/Debug/Debugger-rmi-trace/src/screen/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerPluginScreenShots.java create mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerModelPlugin/DebuggerModelPlugin.html create mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerModelPlugin/images/DebuggerModelPlugin.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/breakpoint-set.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/display_as_graph.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/display_as_table.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/display_as_tree.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/display_as_xml.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/display_filtered_graph.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/display_filtered_table.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/display_filtered_tree.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/display_filtered_xml.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/export_as_facts.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/export_as_xml.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/import_from_facts.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/import_from_xml.png delete mode 100644 Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerObjectsPlugin/images/stop.png create mode 100644 Ghidra/Debug/Debugger/src/screen/java/ghidra/app/plugin/core/debug/gui/model/DebuggerModelPluginScreenShots.java create mode 100644 Ghidra/Test/DebuggerIntegrationTest/src/screen/java/ghidra/app/plugin/core/debug/gui/tracermi/launcher/TraceRmiLauncherServicePluginScreenShots.java diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-ttd.bat b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-ttd.bat index a6aa5b0f3e..37cfc06fbb 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-ttd.bat +++ b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-ttd.bat @@ -9,7 +9,7 @@ ::@desc ::@menu-group local ::@icon icon.debugger -::@help TraceRmiLauncherServicePlugin#dbgeng +::@help TraceRmiLauncherServicePlugin#dbgeng_ttd ::@env OPT_PYTHON_EXE:str="python" "Path to python" "The path to the Python 3 interpreter. Omit the full path to resolve using the system PATH." :: Use env instead of args, because "all args except first" is terrible to implement in batch ::@env OPT_TARGET_IMG:str="" "Trace (.run)" "A trace associated with the target binary executable" diff --git a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/local-gdb.sh b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/local-gdb.sh index 3878ab9c38..74a4099743 100755 --- a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/local-gdb.sh +++ b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/local-gdb.sh @@ -28,7 +28,7 @@ #@arg :str "Image" "The target binary executable image" #@args "Arguments" "Command-line arguments to pass to the target" #@env OPT_GDB_PATH:str="gdb" "Path to gdb" "The path to gdb. Omit the full path to resolve using the system PATH." -#@env OPT_START_CMD:StartCmd="start" "Run command" "The gdb command to actually run the target." +#@env OPT_START_CMD:StartCmd="starti" "Run command" "The gdb command to actually run the target." #@env OPT_EXTRA_TTY:bool=false "Inferior TTY" "Provide a separate terminal emulator for the target." #@tty TTY_TARGET if env:OPT_EXTRA_TTY diff --git a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/qemu-gdb.sh b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/qemu-gdb.sh index 16e6f5eb78..ed48419357 100755 --- a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/qemu-gdb.sh +++ b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/qemu-gdb.sh @@ -25,8 +25,7 @@ #@desc #@menu-group cross #@icon icon.debugger -#@help TraceRmiLauncherServicePlugin#gdb -#@enum StartCmd:str run start starti +#@help TraceRmiLauncherServicePlugin#gdb_qemu #@arg :str "Image" "The target binary executable image" #@args "Arguments" "Command-line arguments to pass to the target" #@env GHIDRA_LANG_EXTTOOL_qemu:str="" "Path to qemu" "The path to qemu for the target architecture." @@ -53,9 +52,9 @@ target_image="$1" if [ -z "$TTY_TARGET" ] then - "$GHIDRA_LANG_EXTTOOL_qemu" $@ & + "$GHIDRA_LANG_EXTTOOL_qemu" $OPT_EXTRA_QEMU_ARGS $@ & else - "$GHIDRA_LANG_EXTTOOL_qemu" $@ <$TTY_TARGET >$TTY_TARGET 2>&1 & + "$GHIDRA_LANG_EXTTOOL_qemu" $OPT_EXTRA_QEMU_ARGS $@ <$TTY_TARGET >$TTY_TARGET 2>&1 & fi # Give QEMU a moment to open the socket diff --git a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/raw-gdb.sh b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/raw-gdb.sh index 3a2b8224ec..37779af3e3 100755 --- a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/raw-gdb.sh +++ b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/raw-gdb.sh @@ -26,7 +26,7 @@ #@desc #@menu-group raw #@icon icon.debugger -#@help TraceRmiLauncherServicePlugin#gdb +#@help TraceRmiLauncherServicePlugin#gdb_raw #@env OPT_GDB_PATH:str="gdb" "Path to gdb" "The path to gdb. Omit the full path to resolve using the system PATH." #@env OPT_ARCH:str="i386:x86-64" "Architecture" "Target architecture" diff --git a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/remote-gdb.sh b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/remote-gdb.sh index 7dd2a94142..76af6bdcfd 100755 --- a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/remote-gdb.sh +++ b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/remote-gdb.sh @@ -15,6 +15,7 @@ # limitations under the License. ## #@title remote gdb +#@no-image #@desc #@desc

Launch with local gdb and connect to a stub (e.g., gdbserver)

#@desc

This will start gdb on the local system and then use it to connect to the remote system. diff --git a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/ssh-gdb.sh b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/ssh-gdb.sh index ee10af08ef..6ccb89e34b 100755 --- a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/ssh-gdb.sh +++ b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/ssh-gdb.sh @@ -34,7 +34,7 @@ #@desc #@menu-group remote #@icon icon.debugger -#@help TraceRmiLauncherServicePlugin#gdb +#@help TraceRmiLauncherServicePlugin#gdb_ssh #@enum StartCmd:str run start starti #@arg :str "Image" "The target binary executable image on the remote system" #@args "Arguments" "Command-line arguments to pass to the target" diff --git a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/ssh-gdbserver.sh b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/ssh-gdbserver.sh index b4e62b8a8a..4185dac8c0 100755 --- a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/ssh-gdbserver.sh +++ b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/ssh-gdbserver.sh @@ -31,7 +31,7 @@ #@desc #@menu-group remote #@icon icon.debugger -#@help TraceRmiLauncherServicePlugin#gdb +#@help TraceRmiLauncherServicePlugin#gdb_gdbserver_ssh #@arg :str "Image" "The target binary executable image on the remote system" #@args "Arguments" "Command-line arguments to pass to the target" #@env OPT_HOST:str="localhost" "[User@]Host" "The hostname or user@host" diff --git a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/wine-gdb.sh b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/wine-gdb.sh index f21c4bd5e6..f1eaf81905 100755 --- a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/wine-gdb.sh +++ b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/wine-gdb.sh @@ -26,14 +26,14 @@ #@desc file, and most copies of GDB for UNIX will support only ELF. Nevertheless, Ghidra should #@desc recognize the target and map it, giving you symbols and debug info in the front end, even #@desc if not in the GDB CLI.

-#@desc

You will need to locate the wine executable on your system, not the script. To +#@desc

You will need to locate the wine executable, not the script, on your system. To #@desc find it, either dissect the wine script or consult online documentation for your #@desc distribution of Wine. There are often two executables, one for 32-bit targets and one for #@desc 64-bit targets. You must select the correct one.

#@desc #@menu-group cross #@icon icon.debugger -#@help TraceRmiLauncherServicePlugin#gdb +#@help TraceRmiLauncherServicePlugin#gdb_wine #@arg :str "Image" "The target binary executable image" #@args "Arguments" "Command-line arguments to pass to the target" #@env OPT_WINE_PATH:str="/usr/lib/wine/wine64" "Path to wine binary" "The path to the wine executable for your target architecture." diff --git a/Ghidra/Debug/Debugger-agent-lldb/data/debugger-launchers/remote-lldb.sh b/Ghidra/Debug/Debugger-agent-lldb/data/debugger-launchers/remote-lldb.sh index 8ab749e8ea..84d0b3f94a 100755 --- a/Ghidra/Debug/Debugger-agent-lldb/data/debugger-launchers/remote-lldb.sh +++ b/Ghidra/Debug/Debugger-agent-lldb/data/debugger-launchers/remote-lldb.sh @@ -15,6 +15,7 @@ # limitations under the License. ## #@title remote lldb +#@no-image #@desc #@desc

Launch with local lldb and connect to a stub (e.g., gdbserver)

#@desc

This will start lldb on the local system and then use it to connect to the remote system. @@ -29,7 +30,7 @@ #@desc #@menu-group remote #@icon icon.debugger -#@help TraceRmiLauncherServicePlugin#lldb +#@help TraceRmiLauncherServicePlugin#lldb_remote #@env OPT_HOST:str="localhost" "Host" "The hostname of the target" #@env OPT_PORT:str="9999" "Port" "The host's listening port" #@env OPT_ARCH:str="" "Architecture" "Target architecture override" diff --git a/Ghidra/Debug/Debugger-rmi-trace/build.gradle b/Ghidra/Debug/Debugger-rmi-trace/build.gradle index 40fbc17ab0..2c9cf5fc22 100644 --- a/Ghidra/Debug/Debugger-rmi-trace/build.gradle +++ b/Ghidra/Debug/Debugger-rmi-trace/build.gradle @@ -15,6 +15,7 @@ */ apply from: "${rootProject.projectDir}/gradle/javaProject.gradle" +apply from: "${rootProject.projectDir}/gradle/helpProject.gradle" apply from: "${rootProject.projectDir}/gradle/jacocoProject.gradle" apply from: "${rootProject.projectDir}/gradle/javaTestProject.gradle" apply from: "${rootProject.projectDir}/gradle/distributableGhidraModule.gradle" diff --git a/Ghidra/Debug/Debugger-rmi-trace/certification.manifest b/Ghidra/Debug/Debugger-rmi-trace/certification.manifest index 6a41f8216c..bdc45f52b2 100644 --- a/Ghidra/Debug/Debugger-rmi-trace/certification.manifest +++ b/Ghidra/Debug/Debugger-rmi-trace/certification.manifest @@ -2,6 +2,13 @@ DEVNOTES.txt||GHIDRA||||END| Module.manifest||GHIDRA||||END| data/ExtensionPoint.manifest||GHIDRA||||END| +src/main/help/help/TOC_Source.xml||GHIDRA||||END| +src/main/help/help/topics/TraceRmiConnectionManagerPlugin/TraceRmiConnectionManagerPlugin.html||GHIDRA||||END| +src/main/help/help/topics/TraceRmiConnectionManagerPlugin/images/ConnectDialog.png||GHIDRA||||END| +src/main/help/help/topics/TraceRmiConnectionManagerPlugin/images/TraceRmiConnectionManagerPlugin.png||GHIDRA||||END| +src/main/help/help/topics/TraceRmiLauncherServicePlugin/TraceRmiLauncherServicePlugin.html||GHIDRA||||END| +src/main/help/help/topics/TraceRmiLauncherServicePlugin/images/GdbLauncher.png||GHIDRA||||END| +src/main/help/help/topics/TraceRmiLauncherServicePlugin/images/GdbTerminal.png||GHIDRA||||END| src/main/py/LICENSE||GHIDRA||||END| src/main/py/README.md||GHIDRA||||END| src/main/py/pyproject.toml||GHIDRA||||END| diff --git a/Ghidra/Debug/Debugger-rmi-trace/data/debugger-launchers/raw-python3.sh b/Ghidra/Debug/Debugger-rmi-trace/data/debugger-launchers/raw-python3.sh index 2290d7fb4a..823881931d 100755 --- a/Ghidra/Debug/Debugger-rmi-trace/data/debugger-launchers/raw-python3.sh +++ b/Ghidra/Debug/Debugger-rmi-trace/data/debugger-launchers/raw-python3.sh @@ -25,7 +25,7 @@ #@desc #@menu-group raw #@icon icon.debugger -#@help TraceRmiLauncherServicePlugin#gdb +#@help TraceRmiLauncherServicePlugin#python_raw #@env OPT_PYTHON_EXE:str="python" "Path to python" "The path to the Python 3 interpreter. Omit the full path to resolve using the system PATH." #@env OPT_LANG:str="DATA:LE:64:default" "Ghidra Language" "The Ghidra LanguageID for the trace" #@env OPT_COMP:str="pointer64" "Ghidra Compiler" "The Ghidra CompilerSpecID for the trace" diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/TOC_Source.xml b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/TOC_Source.xml new file mode 100644 index 0000000000..3d7af5fccb --- /dev/null +++ b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/TOC_Source.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiConnectionManagerPlugin/TraceRmiConnectionManagerPlugin.html b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiConnectionManagerPlugin/TraceRmiConnectionManagerPlugin.html new file mode 100644 index 0000000000..72bc23dcc1 --- /dev/null +++ b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiConnectionManagerPlugin/TraceRmiConnectionManagerPlugin.html @@ -0,0 +1,107 @@ + + + + + + + Debugger: Connections + + + + + +

Debugger: Connections

+ +
+ +
+ +

The Connections window manages connections to live debuggers and, at a high level, their + targets. Each item is a Trace RMI connection (or a step toward one) to a back-end debugger. + Usually, the back end is a native debugger with a plugin that communicates with Ghidra via + Trace RMI. These connections are typically established using a launcher script, invoked from + the Launcher + Menu, though there are actions here for establishing connections manually or to remote back + ends. There are different kinds of items displayed in the connection list.

+ + + +

Actions

+ +

Connect + Outbound

+ +

Connect to a back end. The back end plays the role of TCP server while Ghidra plays the TCP + client. The dialog prompts for the (possibly remote) back end's host and port. Once the + connection is established, the back end takes the role of Trace RMI client, despite being the + TCP server. Check the command documentation for your back end's plugin to figure out how to + have it listen first.

+ +
+ +
+ +

Connect by + Accept

+ +

Accept a single connection from a back end. Ghidra plays the role of TCP server, and the + back end is the TCP client. The dialog prompts for the host/interface and port on which to + listen. Check the command documentation for your back end's plugin to figure out how to have it + connect to a listening Ghidra. Once the connection is established, the listening port is + closed. The back end plays the role of Trace RMI client.

+ +

Close

+ +

Right-click a connection or acceptor to access this action. For an acceptor, this will + cancel it. For an established connection, this will tear it down, rendering its target traces + dead. Note that the back end may retain its live targets, despite losing its connection to + Ghidra.

+ +

Close All

+ +

Burn it all to the ground and start over. This closes the server, cancels all acceptors, and + tears down all connections. Any live trace in the Debugger will be rendered dead, which often + causes the trace manager to close them. Note that the back ends may retain their live targets, + despite losting their connections to Ghidra.

+ +

Start Server

+ +

Start a persistent server, able to accept many back-end connections. Ghidra plays the role + of TCP server, and each back end is a TCP client. The dialog prompts for the host/interface and + port on which to listen. Check the command documentation for your back end's plugin to figure + out how to have it connect to a listening Ghidra. The listening port remains open no matter how + many connections it has accepted. It is still possible to connect by other means while the + server is active.

+ +

Stop Server

+ +

Stop the server. This closes the persistent server. This does not affect pending acceptors + or established connections.

+ + diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiConnectionManagerPlugin/images/ConnectDialog.png b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiConnectionManagerPlugin/images/ConnectDialog.png new file mode 100644 index 0000000000000000000000000000000000000000..ae21ac3c4e038b1e712ec45a8e3cb265dd67664e GIT binary patch literal 7093 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 Y4QpyDStTCxISxxzS?g(~qE+yJ0Afn+Jpcdz literal 0 HcmV?d00001 diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiConnectionManagerPlugin/images/TraceRmiConnectionManagerPlugin.png b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiConnectionManagerPlugin/images/TraceRmiConnectionManagerPlugin.png new file mode 100644 index 0000000000000000000000000000000000000000..defda68d43ac2c767e615b9d7038bee553d8aa1b GIT binary patch literal 10459 zcmeHtWm8;jw`LUA;7wy8xI+^f4<6jz-K8ODkPs{oED+q?-JJkw+}#5W!Cf26G*8Ym z^-i5RKVYin3)R%#weBU?z3kedN(xe#XaKY)Po7{(zZX||^5khG;`agy65?-_T^_@e zC-m9U;v#Au1_x=V9_l}rq2mieb@w`Dd0%y=>az=#Y7Kwp)rC!KjEB`P6uQ0}so?lPKW7r1dR zIEubCGL-ajWLWSlJ&D)-;UEx46a`hf!}mTnE$uxDRiMYoVapK|Aob_ro*^uoen2xF zs;r?Qsf;h743V({(g}hRZ2b9nvlZ@t4=`Yl#;H=I(-jDED)LE9ZH{}Me(n7&JNre! z&$~VKq{kb+iHE-7m!U^#DWqQDpvd;U<~3h|pZIgafu`q#{S|-e-j96DSLpC@t4gI% zzS?>XXw+f_Hj1-)`G)EV6e@I3w5qX&Zch;HPMP*`HhFJz!l^-aNqQW1O?vQk=ce5} zzI*s4f%C;Nfivd$02+MnOPsU4_-sV!E3J->0W*T0%Xd6`bo_?kx4fU zDRKw6R8=kzC#Gp%;z=WI6Cd>LSa_BVZfyN zYK2M7&AtNZ#SJd2i?>Nt7AZq|u}n2HGu9)`dTL@|*<7H2tm^~ESEL8vQ(1S}m zJ&L%;wW2&SzZ(Q)mWfC2)u(r?(2+Z{di_`Q4GA*f==9WiI{Ij_fsM6;;k#x`!9q_R z|BP3%R0&UHEOo>*`lJetd$(-0`K5LY-{vBxiADTCfc2f_n%9m%aZT;sszP(rLAe*X z8<|?S1S}IW240HD$!=8(dy5@auOAl|2QdfeHnq5zE{GGy>*qH`PzwtivbJBF!1rrL z*H0;PsVO%11olJ7 zmlcWsJtjP-m6^Z%z{UplPO;k#&n3)dec;`&J&--f?O>t5q5Yx^eAa3Ek9?mxQBq_t zz)ip^s4d{TLke@<5>{ia$7$9y^q%#5jE{P?yI;f`^SJk`9DA^VI&tm- zX^&8-2;#gz9;|cFP<_dpEuVSA_LA|C;>*KjCISKinMK)#5Khd(rigA3@}$7sL>vA9 zn7zP%jp6=BLc&qBZ_Q2rxL8y?7Moi%%#hE(=iPRUaU)|Nh?Trm&h4;BO-!3eph3+S zz99-t_E~V2y!^s-4H*9aeQt|` z1->akSJ>XyOJe}R?6ubKvch4JJhOxG^UG5qQR&d`8gdPaFa~ceM`jr;5T@1cuD9pT z*-+yL)ijDUHW;BpY?^u8fLUb(C=HuDIgxP({xPq$SaQaWC2lad3?(fJ=FRJj(e#r* zMaO_8R`c*n(vUFC1Z4*wlkTaTW})e}u(?aE0p8g?U~kUx?n-AqxDk{5s~cG;WBJU6y1~F^oU3@ z-_t6H1C#zcB-1jQZ_^K9#afYRFd5zz6&d$6J>1OR9|LaoH3nWA#{$al_~@&x*USJ~ z_{u{h1*oQx8RT>u?9d|H0QhpaO>Z+X|a0y7TxU@1)V}v z+FLn<>5{Qcb;&(Pzap{3y8NlrTG5UnQf=^Qwa^iZYOAbOc@Pq!F?n$|9lcV^{gUJ8 zFT}e@kZE&V7lYOq_zls!HRyFS3d-0)o3pg9NB^<+)VF|RtBkcx%NTQAs;9Tf5-@5c*r-hO+pd91H)F_>DjS{tB|R7j~^^Eo%#7a?_VgiAuqed zIi$QwsHpq6murP^Bn!Xrx4YotvA-THeJYp6r;f$H&rV~v2xqm4=fw)Yvdj5K zq>~bw^S%)IVNPY2kl>ggKk1u2u#w+h3Se)6OmzW!D-|1h@>0-TW*v@9^IvXS5+16G zNw|@)faZJ!BfoU?U4QcIZ@km zZ3P;~R-q4Nr>7!PKONV+P-RGcM zz3?24DdrB?Cu=$FW`haK4;mEZ56?YNDek7sZKu+zm)RFYyZO013%s&XJ78LI>aV!o z1W3BvW$SU5zBFD0KA_ro2b@9-5~VuzkkjpCRy6YCmB--)l7RKu-)4i6G55u5zBd8# z;{tM}u*Un9imYDWt46c=#VB?X4juf~!#A9O{%IJi#{LnQ9u z(?N)UavXO>%Z<~du(14vKz(j_{7_SedaQzn36;wTuZ;(qU<7-<2)Eo{bLYV9{r2_x z+nz>q0}d_h0@Kmyl48?K&~aik5S9RIGpA?h&GXDHe}2~?&tI$_ogpdHPLl_YrHbGJ z5$^JTa;#J(gHR+=sjak8a|3s0t||xUd%boVn{g*z-hN}FU2FAC zzg8mPV(*^)?DNPh2F!{{xgBXSLC-nVJJd>*(2duHe@MuvH{-sA>HW!Bc4{5`%6u# zd>^)P5`;fq+QFBPeCbx^pc_35Z3!z*h{F6$b)_hVC1n0hJvS_Q6u1;ivL z7i*9VkBr1)3thkSz27q={rK~2LYA$c%zY`V-q7#f6~4*l$B>kiBr``Y=v7)Y<>O`5hPB>a=Yq^m-J3XDM_<)Q-Oi5(mVGR1ydNvXpCH$a8q9`KbzvO#+ z;5=`h@UKmY*8LN8SB>DwG0~O8qW(*V_Fv_s?rWiiWo2=e>7J6yo9mIs`6&)6xb>jM zW2Y?G;Z?L4*0;-pMOg@>N;#mfT)$-_MEEXC#=UG*?uy#ZAn|P4V|pjf;`7~di~FE7 zU0N={oqyC35kQ_*?;3%d?Hox553lp>EP$BP2=7*3L5442xZCYD%o=s`UdX-TLj@=$ zf|RG2oH+gpi!qA805@(JI}zQBA`nD00)6W1v)EIpTsp5tDQ*37e0J;7r z=W4m2UVo2k@*X9H=(jhwfvZKFv@l8xOb~< zrD)9h;m)HRwVo3tq=LJMV$BM$1F}ct*4}N~ZZs+B=rAe@!E-+xEU34`haCq-eJ{D- zTf%=xTr^jTROzH;WxuvVJ=lWf5HVmk%l@&v1nDKCo1S)E(?9v6=yx+|MKXKS6}`RA zbJmqw0WDF;_3R&-%`~V9`K8IaFBC%NrjUm}oypAP!K1S@)bvfI9S@)>E z#>$&i(JlzI|aZmgXzVofHbZ0NG=CrcTn5Aon+1@eKBDN7I zu1%qh&UF?e9tM^1D}q@6-(-Zr?)$;7h+2>;4*KPm<`t7c()Nm}VCC|ThZ`#cpI!8> zqjh9oPv5PQlZ8>H;hv$2(o!|p1v(LHIKs&awWCpfcc!aIjN=f&hilkr51yj9VMtRq z58?*Pze;Pc*qbTixNzN>pt*s67I*z63EL^i&^QCU-KJVcvWA~-x)D;zht)ug))yU} zfz~$8-rDhPDR{&aop?0Kv5G?4@~>~#T-SyZIm9CL18PQvbeEH?cU28>LNBGiBkv7%UX+cpkp&K;yR-u;_}V7q zT2CSER_DV49rh8kLd5N2rg<5~U6lmCzvRoO{MJT(Cv>v0hwo zV&T~XFU(KYf7(=E&zVN4n?4X%wA~)IOsgsZFm^hhu=Dt%O3D3Nhloe`tXVsqn4+My zVaMLgY$aetZ_%U`pgt;mRkO#lDz&v}G=~}W^fnH?1-r8nJ-z(1zc(VcX}X9ZP@7@a zA49{j35umtj3f;fTgDbVj|Q~+lOu{lW0uI7kFJjA{X)FO?o^TU?ZFp9}2XA zz@9NMVw(aMfl&tHtiOl|z!Cj|_fJVv_|FI8ZQ-!Ng?p7+&qli>pZHvbP<=FiknkmT zUozU6Px781DisU1C9IHfG%h?zpJuboP5Ik%Sr_j0M^R3kh^edA+AeuTM5aMLeqooh zMXQZiz@t)Uz^gBs$}Rrc-l>uG*PKW`85Wc;65B%X4ZH%*%U75>25{k<@u-bpQim_W z8?{$eR}FjCyGo_BZfWvCK9TZ4hRYV$+D3mcnZ=1Fr&RjkfP% z$9T8JNhQPVbFFcv(EM{Nn;8dMZ+1(@1$q{) z&ocg$9&$#3*HP+ZN=OR2gnCb4y@N#s>BWR+-4hr6{f0k{QTeczs?s4)5*sRE<~0Y& zZZ30^;0*4nLCh?^9xz{3oC!bpA*2cC8lURtxh~3kRbqlRMw&$N#E(iG!1lY6iaB+Er`lV3eh!|tW3I!Y5W&mmLHK;^rFFY7>kB>bZ~X-A5vUwj zL&|IXk_c@=4k5YcKi^K=oyy~Qqrj#TnWr-X<`b{eax|0gg)Sj)XlRPa(GTtT-S&yO z?AFyA$b4sdN?K_VsCd1zW*kWQ`Ebl$Z!qNz9|ha1poEtOaFO1SYYKLBZz3mq!K)<~ z4rL7a)?K!|`Dg6gmx;%2ids^=jkBbqlR5P;b$IEGlDE7gZEXk%SISZVoQUe7pj)XF%Ya35)$` zLm$J*_%-Zdp$s5qkJFd1&Fh$T;*-9T|4_P6+1`p?`5a~YBXIiXH6NgEjk?Y)NqAV@4u1?88#h zS7FmDqdi02LE+ak#0H-#?XgI*PJH&OdZ(6N0&GE)08lPnhIcg|7N|Kf;FzDS0tVrY zWKhk2KU=Op-HMW4-j&;m6e08w+$>aaT+{i$ztFoy!_~^zPLT+@>Mq6h6HYj;F5kSc z)pct}AjwV%aRcQO*+nh@C%O3KjGv?vUrZyykrhF0YjD+UTs*3%Du|7tYd&&cmdxHe zsgdL|qTH=&>;(vH>^!astYsD@?R|(bGbi8n#FJlolCQ32DI3o3$YX|4e!Fo=$QuLR6HZ%?222*a+oSq<{$z+I}kV<;&Sdn zr7LU!iQ94iJQu-%r|&JMps{T4vO!6 z7arPj)UJDwBXV!mStUG>S-R|$^ac%PvtmwH{G5Hs#*VKY`TExQhXg-1`psG@x0dld zMhIFgF|V`PxhswvcslsedenccC+FHv1jE2K$I6$i{*+HJ;#Vb~=Zb|V6M-~jB(5mj ztr`dSrb`k8jys=^dw>6_&mo%CrBrDL4n`|)Tu0*`%A6b#{&Tl2Bw{SzhQg;{x95$r zcz=5p_1jb$!b}j=qKwi_=GJY#{t7yc9jqIn81gOoWLW-j{Js$E+=>{*@Z-w0c8cY& z8l&XKcq!Jg7ECH2tow^Vp^j=x>b-1NKX_=Y$^Z)4uQW{)>s>z_#kw{%7)#@G4GVq# ziNlmxuv}#RV6j2UkUEfI0`O{P>T4#fr#{JXl;xM;umSeK0;cBcS3!`AfHe)%Bwm+% zG?ct8f_)#O>uU!pvaYvs1_7o&BEDi3gjII=+?;dR6p9@=hN#;2!Eq;I5RDbrhtgT4 zY3dpZ2o~8Mfyq>B=J>BYbY*m+OlbRccdln!0m;miHyffawh*d6@a8uw;RRY8Il}(S z+&tL?)^VKn&K2Y~@gdtp7vTHJU)MuQUF=baNmj}*#UtoHkFxXhZ0AI*QYar+cJ63o z=uVmrD^2SP%dMHXTJ(cxEVd?wcg7RDi?H_}Qs>^DDf@|e0Y!}U+7R6tBJ9iypX?E? zjIoM*?w?^q2(Y8p$)fm=Xj|=%RXsVw^ms9qO3Kb=@#0tn05HekEz_zJ9X7OT1%zkT z{)@9=?;+#FGg=Qtm&k4=K&G@3u_k|OF=lt!%vu80z5r4=4~Q}soHyW zm%@S6EmX7u!0$U0USbq`pgb-g;hZAr+BzqjRd@j+IKTOvu0ot@Jj~QgAC36jmF$I! zumT#Zl1TK9r029gB;TRs;4SxgAg9N70xF$*6a=C}H0z8Trz=kHE6;Em$T@aT@JV0f z^okMDHj;E6<3B{UeY}cH0%HHixfo=NjitH`3MB7Ue>jx{M(4k-g|L6H>ux$~znz*i zn4h2D#f9A-b*!>ZSk0Y*192v_0^edyIE_8;q^|Rjt3hm3Y(|1{M6urf_gxd}-z5}Q zBgE)4amQfi(W~P{Bs-UhL>y5aR^%b@aW`F0SZ7pbJd19=23}BQL;#79cjIJK&OU_; zH|<3cDbuOf{gWdjWZ|&x;)=lN`oX6hSj5lbP2YjIg=b2&b9~3iW(0O88$*89IS^C& z>W3S?Zg^V>M2+YF;e3R6zaR1bIVd~de{=MxO><+2YY(3Ty?;nen;o0E4i{+_y8Lps zxi^Y}q9%Rj$BS@)VX*j`{PSmi~uOZp1Va=e7F0}ttjA1 zcK3$zh!*s6S3{R!ZcgK_7yR%{N;wZzaZQj|{wvW1!eIxX778n1>!~2-BB=JE1=u^0 zCu@Flz9Wgbk_l17Z{}8}*I-BNw|HUUTvN|n3sRkBKr+C0%i9vE0A5z++Am7AT4BrB zr6T5Rk+ab^0g-~+OZq4^=RCo`KF4R#1=boQFN1?INKU71N{ExIF~v%BdDLH+pY*8X zSP9?-Ibfpw40FoVQYI{!GXbu)=14AU8hGY~p?`*defk`!hdZB^9r?DuGI)yO!@kH? z5_+_~e~m2ufhW$+DE@2GBkoLQ(#Y9+f3C`{I$P)hne5|OlWomO ztaKtTmRuzD4cT8|Pmf_j0yZU`IGD6u90gCa3Qi0s-z9ycmI8dd2|!|3-k!-+Dn*c< z;lcOf-I2Vg5zCD?dDdfnhQ9Dk4r|OJ;qAGAk>w!vHTjcnNf+k~oQZlcB|=4qyGAw} za&pR}m5)aex0wDE|Av9jd;ouEp{^uZw{uc4F?{9)_x{^$^)=*A9srri{~cL0$K?2U zD8-Xk6Hs1C=+iOctSx^Yr~ne}P!^4Bd?Dx@)RinLYxb+te{}3DurOxX zWmpkFjTL_>;Y-xf%-fro4qk?8m?9X33BoMMlqv#I?{$Nq%8KKNjg5UACG6Tmx?X^f zL!z9bN~PS>^QR^t@(;B&8%x5X6kR|1k>hv$pEQtLF~DP0sD1W19QMF7`(9Z)2>)oA zttC^?u&5BDI67i+aHGG7*Ll`We5%smzAmO9QeY8EuTXYVomsX0jv!W zrz&>GOYgMHNH1tmmo%tLJygWU4G1uri$HyolA75}fORpoZIba@>isntzxyWfW}s79 z5Kb)O&nzwBtXp-A4ae{e>KV3sw6m#ibCIjGQeYA?WmvM*SLS`SN>BrfcO$yd>s}m@0BY4=kw`fh7wO%2`>78$+do(!5QZgI+Z3E9snB2fsn9pH#B#7r+4SXd$! z+1~#H=AWbB6+;!u*{D@k_qGJKHYvy0AnUjR5MjQi%u$sm<2~EA^KTi1vMLG@r9C;# zxN+)ggFo*Rpi_C)&M@{Z`dU7>eR>842FQ-VZOdQ4UXvi#vUG^E5?3nUDD=hJhB(G; zwCe0|(<&Y&)`~fJ+ov!u=rNQ~=T|XiZ_ZCwGn)Vj)axeht7v_T2S&jQ4UTL~n&sgP z{2s?fI|$lHhK-&+8o^*mN0AE(TwQ(qFOSEGL!auOPpRyj$<*r!fpi}@+eE!02fiH! zxNHny4{Rzl21x&@xKy9%b9~?x&c~9EB}Jy~LagDwB!UFgxy|};xM%&1OSneB zVzlzf8%-UnA0Izc`Frbv6q&yxNbC&?bQ^QKK z$=a>%{Kwur_pau~@?kQ8YDn-SRay3l64tn16{Mo2L!~W25Ytqn$B8~j1M665Dv&`{ zR5>Ur{ML4Bo10&+!TK>5H@H}*`5$=5L_@;=c-JhQb~*F@X>Xc1IGi`!Dd$Tg+0mz8 z=9L|}zqQ-pvMOrj;u6fq!h9@~I!{FqxDMTSO46h#zXA^N*PmG1Y$|N`F*2@EX??=pph*#EPgu{rwQhm7cNm bfkNvU>Sf}y5A=wS7N1BB>pH~ literal 0 HcmV?d00001 diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/TraceRmiLauncherServicePlugin.html b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/TraceRmiLauncherServicePlugin.html new file mode 100644 index 0000000000..cc90ae864a --- /dev/null +++ b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/TraceRmiLauncherServicePlugin.html @@ -0,0 +1,598 @@ + + + + + + + Debugger: Launchers + + + + + +

Debugger: Launchers

+ +

The Debugger has an updated and simplified launcher system. A nice collection of basic + launchers for our supported platforms are provided out of the box. For Linux, we provide a + suite of GDB-based launchers. For macOS, we provide a suite of LLDB-based launchers (though, + these work on Linux, too). For Windows, we provide a launcher based on the Windows Debugger + (dbgeng.dll and dbgmodel.dll).

+ +

Each launcher automates the creation of a Trace RMI acceptor, + executes the back-end shell script in a Terminal, then waits for the resulting target trace. In + contrast to the previous system, the Terminal is the first and most basic interface presented. + Even if just about everything else goes wrong, the terminal should still be faithfully + operational:

+ +
+ +
+ +

The Terminal is fully integrated into Ghidra's UI and so can be docked or undocked just like + the rest of Ghidra's windows. It provides fairly robust VT-100 emulation. Thus, the user + experience from the Terminal is nearly identical to using the same debugger outside of Ghidra. + This terminal-first approach also ensures that you interact with the target application's + standard I/O. This was not possible in the previous system, as we re-implemented the CLI using + the back end's execute method. The debugger's (and so also the target's) actual I/O + streams were hidden away within a GDB/MI wrapper.

+ +

Each launcher script sets up a — usually Python — environment, launches the + actual debugger, and provides a sequence of commands for it to load the Trace RMI plugin, + connect back to Ghidra, launch the actual target process, and start the target trace. At this + point, the plugin generally takes over, reacting to user and target events, accepting front-end + requests, and generally keeping Ghidra and the back end synchronized.

+ +

The list of launchers can be accessed in either of two places: + 1) In the Debugger → Configure and Launch ... menu or more conveniently from the + Launch button in the main toolbar. This is the blue bug + button near the top center. The Configure and Launch ... menu lists all available + launchers. Selecting one will prompt for its options then launch. To re-launch quickly, use the + Launch button. Clicking it will re-launch using the most recent launcher and + configuration for the current program. If this is the first launch of the given program, the + button will instead activate its drop-down menu. The drop-down is also accessible by clicking + the down arrow next to the Launch button. The drop-down lists all launchers that have + been previously configured for the current program. Clicking one will immediately launch the + program without prompting. The Configure and Launch ... sub-menu of the drop-down + functions exactly like in the Debugger menu.

+ +

The Terminal provides some fairly standard actions. Other keyboard control sequences, + notably CTRL-C, are interpreted by the terminal, rather than Ghidra's action system, to + achieve their expected behavior, e.g., interrupt.

+ +

Copy

+ +

This is accessed using the toolbar button or the key sequence CTRL-SHIFT-C. As + expected, it copies the current selection to the system clipboard.

+ +

Paste

+ +

This is accessed using the toolbar button or the key sequence CTRL-SHIFT-V. As + expected, it pastes the text contents of the system clipboard into the terminal, as if + typed.

+ +

Find

+ +

This is accessed using the local drop-down menu or the key sequence CTRL-SHIFT-F. It + displays a dialog for searching the terminal's scrollback buffer.

+ +

Find Next/Previous

+ +

These actions are accessed using the local drop-down menu or the key sequence + CTRL-SHIFT-H or CTRL-SHIFT-G, respectively. They repeat the last search in the + forward or backward direction.

+ +

Terminate

+ +

This action is accessed using the local drop-down menu. It will terminate the Terminal's + current session. Exactly what that means is determined by the Terminal's creator. In general, + it means to destroy the full debugging session associated with the Terminal. That may cause + related terminals, e.g., a secondary terminal for target I/O and associated target traces, to + be terminated as well. NOTE: This action is not implied by closing the Terminal + window. Closing the window with an active session merely hides it. It can be recalled using the + Window → Terminals menu. If the session has already been terminated (indicated by + an orange border) then closing the window will, in fact, destroy the Terminal.

+ +

Stock GDB Launchers

+ +

The following launchers based on GDB (GNU Debugger) are included out of the box:

+ +

GDB

+ +

This launcher is a Python plugin for GDB, and so is best suited for debugging Linux + user-space targets as well as many embedded systems. Please note you may need to obtain a + properly-configured build of GDB for your target. If you are working with an embedded system, + it is probably safest to install the "multiarch" build of GDB from your package manager.

+ +

Once running, you are presented with GDB's command-line interface in Ghidra's Terminal. This + is the bona fide GDB command-line interface, so it has all the functionality you would + expect. If you command GDB from this shell, the plugin will keep Ghidra in sync. The terminal + can also be used to interact with the target application when it is running. The plugin + provides an additional set of commands for managing the connection to Ghidra, as well as + controlling trace synchronization. These are all in the "ghidra" command prefix. You + can use tab completion to enumerate the available commands and GDB's "help" command to + examine their documentation.

+ +
+ +
+ +

Options

+ +
    +
  • Image: This is the path to the target binary image (ELF). Ghidra will try to fill + this in based on information gathered when the current program was imported. If the file + exists and is executable on the local machine, it will be filled in automatically. Otherwise, + it is up to you to locate it. NOTE: If you have patched the current program database, + these changes are not applied to the target. You can either 1) apply the same + patches to the target once it is running, or 2) export a patched copy of your image and + direct this launcher to run it.
  • + +
  • Arguments: These are the command-line arguments to pass into the target process. + These are passed as is to GDB's "set args ..." command.
  • + +
  • Path to gdb: This is the command or path to GDB. We recommend version 13 + or later. We require version 8 or later.
  • + +
  • Run command: This is the GDB command to actually launch the target. In most cases + this should be "starti," since this will assure you an initial break and a chance to + enable your breakpoints.
  • + +
  • Inferior TTY: Depending on your target and/or personal preference, you may opt to + separate the debugger's and the target's I/O. If you check this box, the launcher will use + GDB's "set inferior-tty ..." command to direct the target's I/O to a second Terminal + window.
  • +
+ +

GDB via SSH

+ +

This works the same as the GDB launcher, but runs gdb on a remote system via + ssh. In contrast to the previous system, which used an SSH library for Java, this + launcher uses the ssh command on the local system. Thus, it should have broader + compatibility with remote systems, and it should use the same configuration files as you are + accustomed to. That said, we developed it using OpenSSH, so your experience will be best if + your copy understands the same command-line arguments. It will need to be capable of port + forwarding. The remote server must permit remote port forwarding (-R option) and terminal + allocation (-t option). You will also need to manually install the required Python + packages on the target host, comprising our plugin for GDB and its dependencies.

+ +

Options

+ +
    +
  • Image: This is the path to the target binary image (ELF) on the remote + system. Ghidra will try to fill this in based on information gathered when the current + program was imported; however, it cannot examine the remote system. If the file + exists and is executable on the local machine, it will be filled in automatically. + Whether or not it is filled automatically, please ensure the location is correct with respect + to the remote system. NOTE: If you have patched the current program database, these + changes are not applied to the target. You can either 1) apply the same patches to + the target once it is running, or 2) export a patched copy of your image, copy it to the + target system, and direct this launcher to run it.
  • + +
  • Arguments: This works the same as in GDB.
  • + +
  • [User@]Host: This is the host name of the target system, optionally including a + user name. This is passed as is to ssh, which may interpret it according to local + configuration.
  • + +
  • Remote Trace RMI Port: An available TCP port on the target system, which will + listen for GDB's Trace RMI connection and forward it back to Ghidra.
  • + +
  • Extra ssh arguments: These are extra arguments to pass to ssh. + They are inserted immediately after the ssh command but before the host name. Beware + that syntax errors may cause strange behavior, and that not all features may be compatible + with this launcher.
  • + +
  • Path to gdb: This works the same as in GDB, but with respect to the + remote file system.
  • + +
  • Run command: This works the same as in GDB.
  • + +
  • Note there is no option to create a second Terminal (TTY) for the target.
  • +
+ +

GDB + gdbserver via SSH

+ +

This works similarly to the GDB via SSH launcher, but instead of tunneling the Trace RMI + connection, tunnels the RSP (gdbserver) connection. There is actually a fairly elegant method + of doing this straight from within gdb, which is exactly what this launcher does:

+ +
    +
  • +
    +target remote | ssh user@host gdbserver - /path/to/image
    +
    +
  • +
+ +

This has some advantages compared to running gdb on the remote target:

+ +
    +
  1. GDB may not be available on the remote target.
  2. + +
  3. There is no need to install our plugin for GDB on the target.
  4. +
+ +

But, it also has some drawbacks:

+ +
    +
  1. gdbserver must be installed on the remote system, and the local gdb + must be compatible with it.
  2. + +
  3. It may be slightly more annoying to map modules from the remote system, because of the + way GDB reports these modules.
  4. + +
  5. The memory map may be absent. Though this is overcome by creating an entry for the entire + address space, if the map is of interest to your analysis, it may not be available.
  6. +
+ +

Options

+ +
    +
  • Image: This works the same as in GDB via SSH.
  • + +
  • Arguments: This works the same as in GDB.
  • + +
  • [User@]Host: This works the same as in GDB via SSH.
  • + +
  • Remote Trace RMI Port: An available TCP port on the target system, which will + listen for GDB's Trace RMI connection and forward it back to Ghidra.
  • + +
  • Extra ssh arguments: This works the same as in GDB via SSH.
  • + +
  • Path to gdbserver: This is the command or path to gdbserver with + respect to the remote file system.
  • + +
  • Extra gdbserver arguments: These are extra arguments to pass to + gdbserver. They are inserted immediately after gdbserver but before the + dash. Beware that syntax errors may cause strange behavior, and that not all features may be + compatible with this launcher.
  • + +
  • Path to gdb: This works the same as in GDB, with respect to the + local file system.
  • + +
  • Note there is no option to create a second Terminal (TTY) for the target.
  • +
+ +

QEMU + GDB

+ +

This launcher orchestrates a QEMU user-mode target and connects to it using our Python + plugin for GDB. You will almost certainly need the "multiarch" build of GDB, and by default, + the launcher will try to use gdb-multiarch. You must also install the appropriate + build of QEMU for your target architecture. Ghidra will inspect the current program and attempt + to map its language to the appropriate QEMU command, but this may fail, or be subtly + incorrect.

+ +

Options

+ +
    +
  • Image: This is the path to the target binary image (ELF). This works the same as + in GDB, but is passed to QEMU. This will also provide the name to GDB using its "file + ..." command.
  • + +
  • Arguments: These are the command-line arguments to pass into the target process. + These are passed as is on QEMU's command line.
  • + +
  • Path to qemu: The command or path to QEMU.
  • + +
  • QEMU Port: An available TCP port for QEMU to listen on for GDB.
  • + +
  • Extra qemu arguments: Extra arguments to pass to qemu. These are + inserted immediately after the qemu command but before the target program and + arguments. Beware that syntax errors may cause strange behavior, and that not all features + may be compatible with this launcher.
  • + +
  • Path to gdb: This works the same as in GDB, but defaults to + "gdb-multiarch."
  • + +
  • QEMU TTY: This works similarly as in GDB, but just runs QEMU in the second + Terminal window.
  • +
+ +

Wine + GDB

+ +

This launchers runs wine in a gdb session on Linux and directs it to a + target Windows executable. There are other ways to rig a Windows target in GDB on Linux, but + this is the method we have chosen: You will need to install Wine on your system and locate the + actual wine executable. These are often in some library directory and named + "wine32" or "wine64." To find them, either examine the file list of the + installed package, or dissect the wrapper wine script, usually on your path:

+ +
    +
  • +
    +less $(which wine)
    +
    +
  • +
+ +

The locations are usually given in variables at the top of the script, e.g., + "/usr/lib/wine/wine64". One is for 64-bit Windows targets and another is for 32-bit + Windows targets. Unlike native Windows, Wine does not (yet) implement WoW64 (Windows on Windows + 64). Instead, the 32-bit target is loaded using a 32-bit copy of Wine, and so is serviced by + Linux's 32-bit system calls. NOTE: Careful attention must be given to + select the correct wine executable for the target program's architecture! Even + though the wine executable is smart enough to correct this mistake, it results in + calls to exec, which confuse this launcher. If GDB complains that it cannot place + breakpoints because of memory access, it is probably because of this mistake.

+ +

The launcher loads some additional support packages in our plugin for GDB, e.g., to scan the + memory map for PE files and amend the module list. Thus, Ghidra can display both Windows and + Linux modules, and map them to its program databases accordingly, despite GDB's inability to + process PE files. There are perhaps other configurations of GDB for Linux that can process ELFs + as well as PEs loaded by Wine, but they do not seem to be readily available in any popular + package repositories.

+ +

Options

+ +
    +
  • Image: This is the path to the target binary image (EXE). This works the same as + in GDB, but is passed to Wine via GDB's "set args ...". This will also provide the + name to GDB using its "file ..." command.
  • + +
  • Arguments: These are the command-line arguments to pass into the target process. + These are included in "set args ...".
  • + +
  • Path to wine binary: The path to wine for your target architecture. See note above!
  • + +
  • Path to gdb: This works the same as in GDB.
  • + +
  • Inferior TTY: This works the same as in GDB.
  • +
+ +

Remote GDB

+ +

This launcher can target any TCP-based GDB stub that is compatible with a local copy of + gdb. Essentially, it just starts gdb and then enters

+ +
    +
  • +
    +target remote [host]:[port]
    +
    +
  • +
+ +

into it. It is best to test this command outside of Ghidra to be sure everything is + compatible before using this launcher. This launcher does not require an image, nor does it + create your target. Thus, it can be used without a current program.

+ +

Options

+ +
    +
  • Target: The type of target. Either remote or remote-extended, + depending on the capabilities of the stub.
  • + +
  • Host: The host name of the target stub.
  • + +
  • Port: The TCP port of the target stub.
  • + +
  • Architecture (optional): If the stub does not describe its architecture to GDB, + you must set it before connecting. This is passed as is to "set arch ..." + immediately before the "target ..." command. Enter "set arch" into a GDB + session outside of Ghidra to see the list of available options in your configuration. You may + want to use gdb-multiarch.
  • + +
  • Path to gdb: This works the same as in GDB, though you may want to use + gdb-multiarch.
  • +
+ +

Raw GDB

+ +

This is hardly a launcher at all. It simply starts gdb, gets it connected to + Ghidra, and starts a trace. This allows you to create or connect to whatever target your copy + of GDB supports. While perhaps the most flexible, it is also the least convenient. It requires + no image, so it can be used without a current program. That also means it will make no effort + to ensure your target maps to the current program, if you happen to have one. You may have to + do it manually.

+ +

Options

+ +
    +
  • Path to gdb: This works the same as in GDB.
  • + +
  • Architecture: Because the trace is created before the target, you must specify the + target's architecture.
  • + +
  • This is passed as is to "set arch ..." immediately + before the "target ..." command. Enter "set arch" into a GDB session + outside of Ghidra to see the list of available options in your configuration.
  • +
+ +

Stock LLDB Launchers

+ +

The following launchers based on the LLDB Debugger are included out of the box:

+ +

LLDB

+ +

This launcher is a Python plugin for LLDB, and so is well suited for debugging user-space + targets on a variety of platforms. It is the de facto debugger for macOS. It can be + obtained by installing XCode from the App Store. Though it may require a bit more careful + configuration, it can also be obtained from other repositories like brew.

+ +

Once running, you are presented with LLDB's command-line interface in Ghidra's Terminal. + This is the bona fide LLDB command-line interface, so it has all the functionality you + would expect. If you command LLDB from this shell, the plugin will keep Ghidra in sync. The + terminal can be used to interact with the target application when it is running. The plugin + provides an additional set of commands for managing the connection to Ghidra, as well as + controlling trace synchronization. These are all in the "ghidra" category. You can use + tab completion to enumerate the available commands and LLDB's "help" command to + examine their documentation.

+ +

Options

+ +
    +
  • Image: This is the path to the target binary image (executable). Ghidra will try + to fill this in based on information gathered when the current program was imported. If the + file exists and is executable on the local machine, it will be filled in automatically. + Otherwise, it is up to you to locate it. NOTE: If you have patched the current program + database, these changes are not applied to the target. You can either 1) apply the + same patches to the target once it is running, or 2) export a patched copy of your image and + direct this launcher to run it.
  • + +
  • Arguments: These are the command-line arguments to pass into the target. These are + passed as is to LLDB's "settings set target.run-args ..." command.
  • + +
  • Path to lldb: This is the command or path to LLDB. We recommend version + 15 or later.
  • + +
  • Run command: This is the LLDB command to actually launch the target. In most cases + this should include "--stop-at-entry", since this will assure you an initial break + and a chance to enable your breakpoints.
  • + +
  • Target TTY: Depending on your target and/or personal preference, you may opt to + separate the debugger's and the target's I/O. If you check this box, the launcher will use + LLDB's "setting set target.output-path ..." command (and similar for the input) to + direct the target's I/O to a second Terminal window.
  • +
+ +

Remote LLDB

+ +

This launcher can target any TCP-based GDB stub that is compatible with a local copy of + lldb. Essentially, it just starts lldb and then enters

+ +
    +
  • +
    +gdb-remote [host]:[port]
    +
    +
  • +
+ +

into it. It is best to test this command outside of Ghidra to be sure everything is + compatible before using this launcher. This launcher does not require an image, nor does it + create your target. Thus, it can be used without a current program.

+ +

Options

+ +
    +
  • Host: The host name of the target stub.
  • + +
  • Port: The TCP port of the target stub.
  • + +
  • Architecture (optional): If the stub does not describe its architecture to GDB, + you must set it before connecting. This is passed as is to "setting set + target.default-arch ..." immediately before the "gdb-remote ..." command.
  • + +
  • Path to llddb: This works the same as in LLDB.
  • +
+ +

Stock Windows Debugger (WinDbg) Launchers

+ +

The following launchers based on Microsoft's dbgeng.dll are included out of the + box:

+ +

dbgeng

+ +

This launcher is actually a Python implementation of a console debugger based on + dbgeng.dll. This DLL represents the Microsoft Windows Debugger engine, and so is best + suited for debugging Windows user-space targets. Windows kernel targets are not yet supported. + This DLL also backs WinDbg and several other debuggers on Windows. By default, the launcher + will search for this DLL in an installation of the Windows Debugging Kits version 10. If it + does not find it there, it will fall back to the one provided with Windows, which is + substantially less capable. Installing WinDbg is highly recommended. Please note on some system + configurations, one of the debugger's dependencies dbghelp.dll may get loaded from the + system directory instead of from the WinDbg installation, usually because a security product + has pre-loaded it into the Python process. You might work around this by copying the affected + DLLs from your WinDbg installation into your Python installation.

+ +

Once running, you are presented with a command-line interface in Ghidra's Terminal. This CLI + accepts your usual WinDbg (kd) commands. You can escape from this CLI and enter a Python 3 REPL + by entering ".exit". This is not an actual kd command, but our implementation + understands this to mean exit the kd REPL. From the Python 3 REPL, you can access the + underlying Python-based API pybag. This is an uncommon need, but may be useful for + diagnostics and/or workarounds. To re-enter the kd REPL, enter "repl()". + Alternatively, if you are trying to quit, but typed ".exit", just type + "quit()" to terminate the session.

+ +

Options

+ +
    +
  • Path to python: This is the command or path to the Python interpreter. It + must be version 3. Python 2 is not supported.
  • + +
  • Image: This is the path to the target binary image (EXE file). Ghidra will try to + fill this in based on information gathered when the current program was imported. If the file + exists and is executable on the local machine, it will be filled in automatically. Otherwise, + it is up to you to locate it. NOTE: If you have patched the current program database, + these changes are not applied to the target. You can either 1) apply the same + patches to the target once it is running, or 2) export a patched copy of your image and + direct this launcher to run it.
  • + +
  • Arguments: These are the command-line arguments to pass into the target process. + These are passed as is into WinDbg's "CreateProcess" function.
  • + +
  • Use dbgmodel: If dbgmodel.dll is available on the system, this + launcher will use it to populate the trace's object model. Without that DLL, the launcher + will invent its own model, roughly approximating the same, using just the information + available from dbgeng.dll. Disabling this option will prevent the launcher from + using dbgmodel.dll, even when it is available.
  • + +
  • Path to dbgeng: By default, the launcher allows the underlying + pybag package to locate the Windows Debugger DLLs. This is typically found by + examining the registry for a Windows Kits 10 installation. Otherwise, it may check its + typical installation directory before falling back to those in the Windows system directory. + This option allows you to override this search. For example, if you have installed WinDbg + Preview or later from the Microsoft Store and wish to use its DLLs, you will need to fill in + this option.
  • +
+ +

TTD (Time-Travel Debugging)

+ +

This is a nascent extension to our launcher for the Windows Debugger. The launcher itself + functions well, but lacks full integration. It is not yet properly packaged for the Ghidra + distribution, but is available in development environments. It also needs some additional + protocol support, namely to integrate its notion of time travel with Ghidra's notion. For the + time being, we map our time specifications as follows. MS TTD uses a tuple for its time specs, + both displayed in hexadecimal, e.g., "B5:1A". The first is the "major," which we believe counts + the events that warrant a snapshot. The second is the "minor," which we believe counts + instructions executed since the major event. Thus, we would like to map the major to a Ghidra + trace snapshot and the minor to steps of p-code emulation. For example, the "B5:1A" notation + would map to "181:26". It should be no surprise the notations are similar, since both MS TTD + and Ghidra (as well as several other "timeless" debuggers) use a snapshot-replay strategy to + recover past machine states. However, we have not yet worked out how to have Ghidra cooperate + with a back end in the replay part of this strategy. Currently, Ghidra will always apply p-code + emulation, despite having a perfectly good and performant back end available. So, for the time + being, we multiply the major number by 1000, thus reserving that many Ghidra snapshots between + major events for MS TTD minor steps. Thus, the notation "B5:1A" will actually map to "181026", + that is snapshot 181026 with no steps of p-code emulation. This hack will fall short if you + visit a time where the minor number exceeds 999.

+ +

Furthermore, if you use the Ghidra Debugger UI to visit a past snapshot, the back end is not + yet informed of your intent. You will probably only see stale records of the machine state. + Instead, please use the kd commands from the Terminal to navigate through time. The back end + (MS TTD) will perform the replay, record the snapshot, and command Ghidra to navigate + there.

+ +

Options

+ +

This launcher has the same options as the WinDbg launcher, except that the DLL path must + contain dbgmodel.dll and the scripts that implement TTD. These are most easily + obtained by installing WinDbg Preview or later.

+ +

Development and Diagnostic Launchers

+ +

We currently provide one launcher for Trace RMI API exploration and development:

+ +

Raw Python

+ +

This launcher runs Python in a Terminal window, connects a Trace RMI client back to Ghidra, + then starts a blank trace. Once running, it presents the Python interpreter, with the + ghidratrace and ghidratrace.client packages imported into the local + namespace. Thus, a developer can explore the API, invoke methods, and observer how Ghidra + reacts.

+ +

Options

+ +
    +
  • Path to python: This is the command or path to python version 3. + Python 2 is not supported.
  • + +
  • Ghidra Language: The LanguageID for the blank trace.
  • + +
  • Ghidra Compiler: The CompilerSpecID for the blank trace.
  • +
+ + diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/images/GdbLauncher.png b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/images/GdbLauncher.png new file mode 100644 index 0000000000000000000000000000000000000000..85b71b483be45615f5ef83f582133454aa5d6365 GIT binary patch literal 17742 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 literal 0 HcmV?d00001 diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/images/GdbTerminal.png b/Ghidra/Debug/Debugger-rmi-trace/src/main/help/help/topics/TraceRmiLauncherServicePlugin/images/GdbTerminal.png new file mode 100644 index 0000000000000000000000000000000000000000..9e6c3ab8cbdf69c320cbe6c80ea763059d73cc1d GIT binary patch literal 44159 zcmeFYXE5~#4;ob1~2mYnG;_^IiC3X4icq`eukT0V@ zsWbJLSLaPJDsS;D1lL^Vgd0#fF^^6Yw`a1Is<=UX6mKJzV9D5G#`d0b3n@jF*MWR1ev5kCKmOH^)VHy(RzFvHI_ z>^KJ%6InSdSX}UE8+PoZ6%#q=g)WwPv`v@yz~m~$P%Ex>!j_XU^WC7{YF9kVnIj}N z)uXM)9h1t@?S+B4Y>LJAO!p*CUX!`ZufP}qB5ZajFPi^C(fh3dK=u0Cc{=f6ik+50_<@9D zX7R4)+xHSf>6i6M#(iOL#1cI2KnKC?QRrh4Hk4xRJKva8VryEI=S8>s_%Q==lPwgyz&0l~}7k;Mn`Ny;;<)d{BG7K~n@fL%+RfST|{Qb*R-xwH-;8)Uv{knD#s*>|k3= zdy7ZjG4p2)d?~Br=YBK>t8QyS4Lzj?@}kHQ#05%p`f_K>;e5e$G0mg?VD?73IxQGc~ZBXxX2-%a8jH6P@BzMLTHZHQ9$K0w`? zzB-`q!8IzX*h{FDNfJ05<>B;9%Hv8d-w8udUn=8lBZtqne)p&(aUYi zJ&cF<5lSk>r(o&G=Ttde3YIz_;e5W*Cn|Zl2kt@nbnGmFE_cy16E`2neS*Jv5D0%n z%K_4M%3szUK)mmTkJN0{8^mg_^&{Rl^&`GPWKp00J_9SFP4BfI<$iT>)T8db8^h>* zu?9|Q5b7sA!}9o8Ep{hqw$!@seco;R0+IcB=YKBx4e|yK!O2-&$;m(xe|$UN7H%P? zL+^e3Rja&*39c3L1ao##4VsoRcO zsnd$a-g0JyeqHcw|ER;32kN>fek78*TE?1C)T(R4S(@lh%Y&X!o_by8+X_K6CuJ({ zO5l%x+g6$9<|Y3hX3!JSeon)2(_M+Syy@M;)bFyPWO{6Ox-+C2ZrB$_>Lj4GFbLnF z{Sb9nQyCP4Y_F20S&3xI;O2;3*KNIYn*J`WS)TTP*!%|s3(}#`)35yS)%|=2)iYXP zpq%cBV`+8(6GqXa8@IF)#%z&u71&feok`r_Hw@A3Jp6W z_jv}{oZKv+_R-_8z3g^eAs#OrK-vuPiPPx2~YZC!6%$ zK<2Hh?!4(!t%?Bo?4W!Ea;D3h>z{IXCz3R8W}rKqX`6BiJ)1c(r%@wkT~Ze*Nhj;- zHWzccjaK@HWD8eNZ@nDLLtzI8G@|;X>Zqsaa(_!3^%+W^^xK(OvmJ5T`R%AX!h7$k z+h>?IfyC#EM8J6@;tow-k~3<<(s@P1cIIqkraOS7PWj)>;FO>I1%kt?fd%Pj_tyDB z0zy_LQFpMvoo+5PE+=L&@XYChyAi%jE|d1CN1~dy%q1*?+9cNC{^p4wj2s>?#r|G+MEF0cL9!`*4zEi7&rZ_iky6;#nZe8t2 zEsktmeci;ZVS=8iU#$aXTw8OZbM4YjaqaD*Pqy} z?BR@?bKLDqrxY`1Zm%`;Xw=K&#FXh0D6I>m_aqf@%Jx>#$k-@odp0m5McDh8%>X^% zY;(Djacx71;!7FK)iNQ??S0BiL)7~#VOmunQnWkFd{g&gAADu1Ru4h7 z4@L=8Bt}SH9{KWTuG*gJ_q{HySeTb7^cnh2E1Jhkl*wpIDNNIqCz{ne(6}6}t|L0D zUZFTYdV-amd1ifu1w)T}%cY+AoSylNlk&8nN3wm~2Rvo5IAIzc?X<=?X8wdebGoLn zs{+neyX@QDo-+s_ia@2kq|rK`mb%?h=Regffe126>v1i-_!U;*r~oUvrCww0dHLos z4O1BR;D1tR-uErts@^y;hqzJ1{UD`}bSgG@n?D}0mdG@0aWpccly=w4(Z=q0_`e0Q zX2Zk5k7%eajvB6xd~hs?YgzTwHT0jXD~oyd3ipg2Ng<0^v0FZu75%J6({UXc@m22E z&LytOUd%wd`)cZg;Wp@=sfhLm_%<8-(L(cTXDGyZ zIb4)&1b{~w$fsMnjf$u025noqMj~5Ad#5B8{c^*jJmT2-KJ8?L3PH)kli^Oyvb^#0`8+b(rUp`78V^Btwl)T)^>$80l;PDR21FRMhhzjAPxBoa#l z6tRj}9!IFHn?SHF`Pg&$YtZNY0R-cl7mE;6M$yr>CLRC(iH6VcH!`$& z{gWIw)kfs$y|lEr2}G!lH9l-kR*iNHny8T(Q?5EVMZ!(;!8mgCPi{wllu$QSSk@)I{x0(u+8_7+|9$xu z`_r?TD_id~%uI5|#kwV#f0W!m24a~LX^c9Z^&`3Soa!H2#s<&t0|<&tR9hkQAJg5p zPc74A`PX;^|C|{1uVqR9F(3cGE|B}zt^fLp@?VEA{bP0We?9lV7h(Qin{@ndoc!7eSK1Q{|nu4&JY1m7&OGRx)C6UKBk^Qb*^VK zG?%KSmyri=ZI%#1MyW{xHK}^{(57HMEktujVE4NSwcbA!e4#=hjz zn)EatCjR1s?SjRDPZ7!9&{HgS=uB0(kHmd?eb6l7+o^OVNM>Vwy1K^Q^BD7@iZxsf zs6FPE*^KZJh7A(F8Oj~n(%sp(w;5AMd`1SY&(K@0b#Wa;C+W90p9ZfL^Q7Y-PL*!< z-tSBwUdi&^7lhhjN(!nht_*CBhkJ9#+V9aJmhh>KFLSZ(bw5x&;5!JHUQrV@ExK>1 z{MSX%F$cJlUk0py+DWPoofFC)OTB9lRA-@I{_f2OzfoapS`vh1o>UG$@&mufXG>hcH$#Z)OjMjP;_vaT;(y7M`+uB`nF)6fj5HS!aQky?tNLzRC0{5Prcfm|h8EK|%{k|@SbQ=4hW{lUEx|;tclir3wd0#@@ z>wH)FS_9zT6~?9-8H#TYW=C9lWqnbO`%OkZeFv}lj0s6{-iCx*AFQb#~sGv88e@4 z{)nXmnr<_T0!Ak70wsFHogRb|V8K!vub8n;FD)kfX7M%UXh~iWWL^_-APZI z8UFev$Ty{!y59Pi5zbDKs(Nhn~tJnSZYy zl12v&#+U=K+uo}rOT%$PewJFM-V|J5I=sAiDU5MC3WUie2;7R4lr_@56)ex*)7=Vq8mr2kDa=K<)%4bltkMee8bHu7akwRet9Gr1D(t{R+15Ia z&+fS0{qZK6J5q7?UQVjVPcGLc0=9=)YzLIPnKW|BWxe-E#6|j6r=S&6`7wdJuG7vH zacQoXCqk0m=K+gNeLmBHQSn;DYVGYz5rP1DTO+!X6;rVOHHiM{PXkR`pEtgqn{|B? zx6TII{D`T{7kld(fXA(vIr(0}RX*HyFB}SadXNxZfv{3S-j`-q1|qY{p4PD&A^QmV zex%dTWgNZnu2Gq%!K@h|Vz||WCq+i!-^7t7UsndRL*stG8RJ+J9{UhV#?^gFRFs^f zBN2n9fVL^V`HCUmi=0TF!pFO4rt6>-R*G0d z{R&&C#j+IF5c5Gy`@v3g6`%XAg-a|x>S|)GuvE<`niF^3%W>%K)-pJGPk`%*-=0(N zWD_)aar)}{r6I0ms{MDpy>mijL=-vdr8#zA`7T;WH5qxfui$nXmV_iKUOAq3Bq4Tt z{tKT?4tD^z0EKp`ATe^90!curVJ<=sGq@BF(p)BVOP$8~JtYg>-e*&ax!6P*ODhaz z0;MTXM|grz2?eJOWl!Zb^^HqA8}9@7?c+HDZB}wd9U;h~3P;WPXAT>hBJk z?7CL!Lk=jHhjU}%<^#W4SW!rvx*5<3o3z;T$x>kn`3k?-E}MPo zyoBc=|7|?tGVE4LX)`HD4%qD2=AjuBjh(FYpPK2Ma9+!|8O30T)^wzwa0wxTD5F2wWw6Q z;U9&YWEgBnnZEm2?0mZ!N>kLd;4AvB|4Xg$Q)&kl7FvS3akfdGty|O5EugF=!nBpn%$9PHZ`Ka7n;B%U z!l|BhcETlGVkL5Z53lWhYo?{;1Pl=@NnS97c1c5rD~}x+M4h~=pGm}BsYkBC_}r6) zj@NCTNE#tdw>#;7dmT+xD3CK`S!t4@*o97g75gGh?+ZV7+l#NrSK$^fRG}ddp>c^m zh|@{J*fvZV7w;&&+E>yO?rC-X?PqJ0u`qBFGiQ~182reXgv;9@WJB!e05TZ-=11yB zZ#u`$r^rdJib;KDH1k0Muq9&lT4iZ|C2|sd=+4kh^Cf$PJ8?^kV}6ePmn)ryi$_02s#tu9PTu$R4+AxLEHY%-E9=+KEPG0C4ybDg$WVljQWmS5V3#L{`$ym&1czA2@u z!0q^!mw-}urvBn|oP{phoR8Pt(00-786NH4qJ+5xVowu)d{vCiJd1RRYw>=^2?tY* z1}>O2-LbclaSFs8i#d#xyk}h_@|qqw!LdDhH^Ub!!BT->g97qDDcqY zvGKTI(X_?3KFKp0>NYmd*##$+*B~y^%g_-`vVuTf_Pw-Gz^omR$8? zarZzJAwfM|ll23bDl-`8mUzINGv282pktIYIfEkld0+~4{GDI#a2D?{7#YjH^8&#Y zn=8lL4Oxur@N3h5d1#$7-jVjgwXOW!7L7&>Ldi`0@*x2_ULLd@X)|0$E9yQIoQ9R{ z-fx2DgU}@u2ZPSmPFGga4m6gN6nytTf%ty1W_s}H-Q^_z*X=?9pi%Ke@o+{Q0L?QcNv6`%MGB&wy0EnGk75TkGv&$r$jZ^z`TsqN3JEA(Lq`A@{awtwNPGrCZi6rYi))0qWBTW75(3fs+#ET(1n#i+$fp;DTzrIH2wMTTm=od`FFj{fW0NN@zT>qV3*CCf`5ymt5()u)sPP4`ny5XW)VR)AQ z(|U%_^I`kT2zb!Dfu8{@Fhxs@&V}}2xoMV_#8hE-IoPRf-DzOM(RsBtnl9Q^1W`A> z6eaonYVV@EK4Jp`N*$j5zBJL_aVXzld7509;LOM6(pAo2*O1favWA}6ug%U`si-c3 z;-!8;29>K0Q*tbQ!_ch>5Crv>zRGB6uc-5%@rzw^w&byvkD#1Vy|UXEFsiSHFdHqA zZ;Q2Tkv1rE<-Pg2sY_5VZkg^JuiA`5#!(2d*r&EleQ!|`fXCgk`w&h9H8O&vpzt_s1Bk` zZMwfaU(h|ZD(|#bTgb_Z&a$GPa5~=pjZ^I`0it76^~yf94ATX(r9IGK>s5}Wm%5Zr zp%d$K(i2u)ZT{YU<98@e`m4wpSK}NOr~2dI@mtbR^(M5fXN?t+_%hD`G9E+x@S;U+jhPtl&j!vo^u@p3 zvag!)?p7n8lGMrRrHc%onVj0MeOe(Vt74g-8fxpA-^WY?>YJ>!+CfURZoL?EwQ5klluA|RLSq5< zNZe{rK9}4P8*zUhp6rlsMjg``PH3EGa~XP&V`$_CLJ^IPaHae*Bc#kX+_WWlFhmIf zAf6Bp(rti0m)ax`?oJ|Mb7b#mQGNHuPy8+s~AFT*V zz4MV*jt}PUr1wRhE84trWoZo~rjxM@FIUF^=5A5^fC&;Tz(ZDI&0Ox(A69{!Jyhzq ze7$V+*CY!W96VJl@2=Yg)^1Fcb3Dmg8*MRni@WK`eRhg_Y(PXQq7zv9l8o+ zk=6#CEUIU-;42gF3^wA6;~6q8(nL!du6)S8qxK)(%2l=vxvdF`jMT#`dj^%)OqsVSYlT(aD)*9=DPM$wb6K?Si z9SYZ7ao`hs@x#mHiriI%LZ9rX0LbjkOrX)>6FRR^V2NLdXnDpk-y!LG(SV)qz5ge` zqEEYnY^^mW6AG{VBDs!f&A3^-6OO&+T=hF;G$F4v;g66BFQ`}r=J!6>@c8L)M0V8P zQTfp-OHt&vOq~xy0Z5mxUnHTS$||_r zl_s@bT)4drv%av?YXD3vzWp2%SlTOzS#{e-;K){&OX`rtSPvq%Mh)yZg8R}u8;BrT za>f-^j&G&23e+FOu#m2*N@P8cBxgwDEeO_^?)_>~iu{oi4(6K}yUDo@k&miq& zW=fHZeSz*0EXR5Rm?Oj3LQT>=Ocf=jZMd*gc88Lcm)@(J4+kV0L>=TRc65oi-cFD{ zLC$IT&hDckC`ROW%YzMk>O-CuYkHNRLjcN7aW)2WxK)YvgO4#KAAU1hGuaANOnKL= z3}k-Lfc#LaFixXmQax+)UKGIDnXdCRSh~ZcbHh|cWwhEWD_1@9j4xj2!QbAIUl$(& zG9K>{f#b*r!<$X~^h)S#AR(vnNCFw6?7*5>bm7&RLE9Rr;@mz{9)tcxF_8g+>PLC2 zsG)wubL(vKv6Fkv_uH$yL=v~3&ZWFkUcpi7^pa2x3y}~ z09)g$yX-=oo^Vyu3B!x(ww3OHKR7oa4PG0kfqyM)Clom$h4nrbZ{_{cSPv`j>s(8P zdy#KKzy&80nWXMPe6-z?dq;d1;AP7$h=$OhDNpK)F#Z>#OP{8{Pqk0xi54`6&&L@T zVLXyA`wmM{$iCF+QB$QsN)Gbt6x~wT?@qQV0Ird?0;N0kDvw=|MB7*?X|-I-1@6nu zgbm)ODp!cEGMN)x4Q$S|DECJSK+lqytT2UV`ICELf_Ja^QVk2L`9QS0G@Do-Zc*4P zVL4%^bp0>6V|vQ|r}=!n0@Byx?w@Lq$!*>Y{ES1$r?zzAqq4n_|I1l`YCzyWO~D9l zo*;NVt3#7Lu0Mo_EW@C*%?5MnvRIub>-es@x4YNvoPEcj(BkKmG1#lVOldB!FJW|S z_?v3h&UJgtmeLkyC1W_a@H9?oxrMd3e>^YYN?`2!^B+WU%RJE%U*~n8Ki%uKN(=SB zOl%yCEGa7kV+lk_eOZ}cmQ7gX^efP~=nvpR$7HMea zv%ZA)qi+bcYU=bx65{B-GMrLrAZdOY(dTke^&pZZy#kF?NJC$k*(>NQatNFJx=~a8 z%%!UBR@mN>)cYf1hrQz;focT?bHZwA?~Oe#!fWpmQeVS%T8m%zFVM!WM&1$CiJWrz zMExNnxdW&%V;s|QLv2j@U!D0g+dm7s3g|=4nv6prujTVa;E>Q-36I0>uFjPNhepXj zGjgQV#|`x&kG8g<{m|us9f}c~8cE5CUWe7t4(a97a#{df%#{tbOD{?$pooIcI`_ z3tZSr)M`v|UtoW^e8Nr~(RdQ_u1!GC*w^N`m0AX7a6Z_~e}Bb^i%kqKd{H-?QlRZF zop?(iqPm19B863KBJ=K{R5Oy{Xwnn>BAsGnaOL~Vhk310Xk zKsMF%)F+{&)_%(^E;s%_(%JHB#%sRmWC7q?tj26-qfYkr?DG@hBcpi4H1E1<3?^cS zcmV7~b~`VSNy<3tU~6V3u)zhG=!`O=pGnmj;2yCl3y zgtZ^q*7_{CP8(c@ot#=4dc~Dy3$n$vtu_ok9D_uhFIHNQif8<@@_??2TyBN;ekp-D zqLaVm!l^7QP;_FQk}JQzXLW@VyFOTSIF(HparPIvCMCU9HseFLzr3hYO^5thZ<+b{ zAqB%(XD$z`GNZYCei5Wa$ULFi41G_yh$cw4>YB5}gh)DC5CM^76XotGX%HP*n@w{h zcyKakhE9J)$u;EizKW+uBBAB$C_wT_=Yt3D4N@!p?c9L5uY&8Xf#_R|%@I_d->Tfr zw3KsF3SDR0HYXV$6qD#jUq|$}Qj4y5GJjz^_b%(a(Y3!hK4GqUr$J`1hY@UIEx#+D zOa6<*%0I@UXdV}o#(F;`zq>R4s5wr@*y5cC6Lt|`ggudLTYw-Srw)g zPbEk_Qv&`4=^4#)!D(d%ZwbTR3a{t*Q#k>oouK=oo2YF`1Gh?(0gf~ z8|6A5${w5N@fgW{isv%0Ev%eV65GPDH#A{D4Kd9%2NDSY%4)7bfZ&tC(A{#hAd|TC zpL*ri8Ed__g77A#-q{Z)3YHPFrpns@Zo9AR#iw^)@!;eXB$rIe0Ty?m`G#f86v7@V zS0URK?wzV&qF+9-%O|p0-ODDZw^r9kO5|it5Iiz$0ve33GX-!$gtwxMg58s}bs9lR z)E!5zz`K-YY-Dprk_(9sR~JKGbEP4i+%qBwYAgE>H_(0Esn0lGlQE43h9nr8&CmBr zpnbRfLmm)z2H6A%`0h)3oh}T4oL9|b4*G>6Tiy4YAf;0QZM9-6vm!t<>^KyF;J=Hoe|bH@`YE zX7MO;TWwY`LlsV^0&PNoE#)L3{i8n1ACw}ZW#i(PEoP4Ud?@BlvzCdEY{DvYZ4oq&!vrf}?b<4fEv3T-I5zCbWnLT?v`Q=3fSUGI`h&_WUM#cg%+d+0{2irLCOGy%E-x(tm0?ef_Vaq zU;4+B&fVUt-p-Y%XKnS+Ohjkz0rH0X|1Sla))eArYZ1fy0agvqZE>I+uDN9u2t(`3 zg6ps6DJ6jNBCh^MCAqJD?GtmWnB~*%l^pUG(l-D1Fk85~Z=(gcLA-Le_@nw41Vv7Y z3-*l;#wlceO&B&xcyAOrTWW739R|R*gSCt&%9%rGNdoKQstx3ZU5eM?IAV;cNulQI z6CUA&HoNVG9_b*Zk{u_zsXB|3_UFigulvk;`h%+qDMecB*$MZei2%0vuNjO1 zlY;Bg5oKRxg7ojTiOw!Q#mSXnau^F7iM97OO(F81l9l#)XQZFg(k1FD)6&@kG&=<( z2H#BhCKMX=oXgXfHsFlqb_GVlp7@pYe|odPU{H6e zXF$^AR@wLi!C9N~GT)n1C1j+}-o}1od7w0BB)m9q``r2dCAs!CKmu&v znyRd13=0(zN|2=xCN5~kR<9LRWNPy_9R%>e8jZgg+xBq&Po$@*d3jrYKwS3&H2dbD?Yxv3sP0Pgk(1H4J9h z;yPU8glWgVy2CLOe-f*SbPcD|iDH+j>X&JJSz#D7#T(U_De(AucH-nE>N4oZ}VGaTwKl+lJnzQUuA^cIs@57+l>e%E%;fEp`T{_|xwpCc|v#T!f z$>+Fc?yw(IADY8Q31oC_;;M0KKU)LY>KkXc8u;ulFxBw{n!Bf~{&b}1QAZbpRzm87 zO1*@V6FZfhtOUo+Km~SJfI-+jqphY^tT~MRCNLV9*h`_&wqZR^Bm6ehK>O;uk=R1R zWr4p9P+`pZ#30mys7M&jg~nEJSK#8pR<>U&T~JgtEmN=3K6@XlDt0*b z8mX#Th^4ag*YcGE=6XAT%AyB_b7aPD<)QdZWlVp4%Wkp>aT|)VE?GNFeaH zw~nhQlXgzJM{*saiA=ml3Q%v*n*RD;7)kFo`$;?EObhnwCLYG*9kWqk zATNLPBKXxsB4LPowA;OC@k$pHmXiVuGUa-5ihdl{!T_H^j=sRR5&;G*#~vI3D9o(L^m`)L+C5@Uyz3 zo~Myko`cK77SVH7k^Hvcu6C7fvI-kcqpKsVVhmkO>w4^fby-m=X`ZilE`7)CifNac zI#v^PX$dOIX0LZ2h6a`tf&}0^?%Cdyv<3i2a?#}0s>uPRA&JlzX2|*tu!$^tG`s^8 zIh4Q-S@vL8FNg2o)h**6Y3x*Gx(n$a&dYA=ik{Cp# zc^2ZBuA3Ego#C$xA6D%+^fl^=imJI0iJyH>fl@F9Xb72G0wgmLUmD-bAPky6;mO<3 zB5!at;LG{@)-noYrJAR7(3qLxBIED{$Fo-GnN?1BPs3uXPGvO=Uqs=FU&QlCCo9Yg zJfae&2@RhdwX}7g;efS}VM@;nCH$uu02Rn94o{&^r<(!bj9O${%X_eKLY4!=%M4t8 z@t)sZlwqAF?`UHxf4{S$rP4u-^})VBhQFp0=bL+Ug0V>seV(J|) zw_9@O0p)A!FSR-%bOIHIkT)hdzYu~c0T(;39um}-F(<*2g6l_1C=zYL*qmK2lb4%m zcqeUcG${;Wz5JctW2W4ymQ3h5Ga0!nTyNXXb+q-6RMe`%JGxOe<4K(S}jrZwfVy2Hj`elOnvbPR>tHZbyvZ% z5RI@$nfqlxxv`i%ZA=ldjzsB1TlsX^2BUvV?lsiWR}($Z^342|tgkQko_ad6>oya_ ztw-#7(#a2KT>{{batU~)KcYE7X~U9E`AT?9BgZ9V7x9ak6u`%yfOip10cz2;{T$iXaCi^>yas1UOEWPE%Vl((k(x)dS<;oha3^-9s!X!N!&-T_(x8B z`-5@>7XzN70VU($qV=lzxLScSibHkc)Jc+-BuZ$eS3%S(vuoMye#yw)L(EW#lE&w> z?1d5k&Ol%UTmAwNIDIAKzA=G&eKP&{r%eIcB0;OQp%Z}Fo`8ulVfVwiGv^iCr4vAP zgRy3oPu+(!2-5r`*MC$)0xqz|dJT<%2w^fIiuiyvW+|6y)UD(QE?wQ?{@I0&gz+4$ zSQJ`N_tDhIh74x54eu_6iH`2f_NrXXM|zh}^r8;tFC_Cl!dv%?3t9=-(i1CiI0Tu9 zFp~g4F2gyUJVmtsC=({gZwYG^F$G?Dp$8;IWs+z$a7Olu^^{cM-8{?8jpe=h2&u+S zkkhgWo!f`>a#90_N^ChdZN#SlYD9^|sto<%^0>f2JhxHJMC%j8V@9$Z6@!f4r8aA9 zs)8o>u;p_b*@oHL?Q%35;mTcFJVkVHz2MRpr1Bht6ELprx9_*`f|8Jm^+}^ypeY7& z3ai#&N}a+X$Pzb0mIr`Co9>J$G;e!dU0y(strOJP+qY~lL*v>QVz}5o@PPpR8I&R= zWED5gcl}+&n*szSpLXS_=L$ekur{ogulukfD_x9XJAZjHcwU!HP_gd`prj)o0Tg}t zrTKJ*6u&73M3?GtU7gE~dml?*cV= zwZ=}ZH#c~k-+FW%hUpXIxzJ|fd;g!swu<_{IYoSOrP5Q#DcW$LF|4xYQE()V4=w7w zUMuX+TB8ebS9gpqF2SQ(*+^LA%&MnGWJg7@$v|XV_GcmdY-UnOi9rq&~=w zm!We_xsOoY!b@NtIvJ$F({)Sx`w1#Dxz63!X+c+?F1gMQ!7QJ z)%ZuQzII04ky)bfZP@M1>xNd$*z)MR$<8h&^!SjrF?vLHz&E+aZpjM&cvwvT*tjl4 z(lF8dkvX)6+SN6ITnzE7)l%wAwA2~n;<%EfcvyZj-H;STB#SN>FLMta@uNq_S32##Qd1#vB)VkYt@AInAdBr0y+BCpLcp6x#ps{3f=&-%uIFDf4Pc4$#-$HfqWAUb#La zzCEu=?Plt|qUr;EtLxncWVNLhEgq|4Hrras&}!mUokOB78K}2iiEIHP+-}ussx~d` zS{c>}MSahI6yf}N+z5%f1j6+IxM_3X_{ET6ntlUy0-IBr1c!ltnT=hEWKay+tRZ9W@lHl}M#$IJvPuf~epvi+-MlaTQ$ABfJ28t3ydOrv z_wC75rDI?DCq5bj%bcJP(Ss?wF|x*FQSh>@iU?3%#6RqGcO zLkWv*Ich0yn<-uo?5TF*2pa-1@#V#0s$<)u<>Avmav!8=8MR}*)3n2nI7h}@!~DK7 zXmTXycg=(W`==N{kI7i4xMWiGj{5mBKsZYY}icn5IGy=>(L!Yn_lm zq2c?L)LQI4vJa2 zp5~;#AIhf7g4~pYQE^!q*6<}P1D%%&u%kkqge}eaUajwax6q@{eJ+=H#w1Q2i*23ng?0uhum`dHRV@CTikd@FLyDy%g}vGc zq=s)*4U9hS!^jE2`Yer%9=cmN)MI8*lIvPN&%&-+hz+(yMaT|hbVuP18{)9z57gdf zJ9CT|J(POGuXE7sBa#({f9{{c&O~3IcpG2pT){RIi^w<$3x_n%64Qbbd3>-OvRJRI zr+Aj!1>td7WH#^aI@LI*-WznX5=6Z}-KRXXqQc0gewYiv;RjdUyp1~+7a&|)J;3cP z>~opboWcEf{_kTzscqUQUG~+HHzblMdNW2@e|>VqofJ+RL}AstrU4D9qs7xmX%WTFN zg2p~*cvTWeRhe78ppxt4WoOu-6tJA&Qo;qM1kPqvx3Us2^#XmMu6RFzkJPl z{&Cye)JM1cdFtJK;}p*(=RfMm7ur^k2uhB}S{IdCjUCRP6LLRk&)f@|E2agCJ-yFY z)dZnmq<_N->iYn%J8DBMk5QU3W?P%TcN>#xl0G4EG-)>< zobaBIA?sxD9sE&xFT%})6PTq?f1Ug8xINp5%;z9M0Oio2x56~nAYzPBY$#Oa*OTY( zGT+?HeEQ+OJTNxsqVZgRa`sm!VQDXibGr}=7RiHjFBKv9ptT=ZHdv?;A)^v_Vy%%e zov*z_(t1GWF^HSLOPq7VH2*7(o;I~~rix62%zd<>0L#_;k*Q#cQv_qx7~E?GP^^^v zMT||(ps@A7A9gzLRL3)H3Bra6zKCP7}7`WKpf6!fjRWsI!FL z>9_x|x5^K=+Q9};6siNP#GO_dD~f7V9&Xfc+{Cvmmg}g1b3hBymGEfF_WD(v&o8^o z;g1%x-(7I)hS0z#vtwAt(V7%`FKE<{BT48bn>dZn%`Xo~BE1efq4aXh05JN0n0xD} zsN1e>*h^GIN<|$S5d;)Tkq!Y7kQfD}Vd(Cz0hN;Oju9!5?jE|kVF2lFhR*LCuj{&> z`+dLlJ%4{|u@6vG>oOsWH{HZRX>3&w`TMy5?uDyYE$`y}cgW!NbIX znX1KxAHK_@W}fs|WFv_qxd|j^4#HRX0W?RivX>E_b=KblML=Jh1i2%u-8xJfhzqP& zpqbO7u&{K!`wnNM|Ja2$9zr{6WX?~A1@cBq!+P4wu|4q$08bzRE&r}gejdV7+19~k zA<_BDVG3T>?XSL2V$L;L>)yDmMB#Qk%SmOAsGaj;+*BiKvMTZ>Pf`9hKNp09M%qWA zkYk2_ae8~<+T5w4HP;rB=pue1i5pQ%mKD4IiZuv z6kS?7S-n-^i8BH8xAn9;cfS@M2O5E@j~Cs6tvy9!R^RUN<#m=k#ZOzJ_Z+$f_!3Da zERwhI9WRQdh8bVC`UbDVTPte>U-AfcKL%!e46ts?dek4hpP`V;VUP&74^_W*zyy4} zMofu0{ss}Y>F~=ew2ea@Mlqlm?kK|mS$~0YI9)Y}(d$$k>kp2E=5?@;e92ho%qwr; zy?;$BRd{J+)1N-g=&=WuFV0{-71>J~b&Y~q;_utLzdq3=(hn12+AatOs3pULg$l-y zoE~^4Y_sLZr!U{81&MycXwD8AKZN7-NO)vBZ2umKZS=JH%sTK`bb^ikcIo%&9kIA= z8ax@4wb5B;w|^c>zXkEQUF{t_aL9_tk)j{(zgNv!kAE9_%u8tGys;7V zu-8OHLS;oMRJz`k?1j(gQ57Y!J7_ao$^q7<_T6N(zF6A9C@&nIX^9vB&G5eryKukc zsseRw_vnL=n*{Lqy^(i(;TsZR(O*Z><|Ui{{&42Shi75nkBWYBYfMk`=st2r$llJx z2l`^163f5(I9D9M6`#aiFMOXVoA>nB_;e*R1@y zoCXN5hS!FBb8E~xx%ukp6+V}232a*Prm?c;U4KeUejh&Y*2&Z{V7Nei zO0XE;+_moWU-rT+_<82V{#V_ItDhu)BkzF#uSW%aRFBSyRP*n159CkbG)Rc5e(wco zf0=hK;oO_W1@;Kuv9Ft!EkP7yIeB$GAZeetf&hR!`8B9rP~*!NxxgaqDYDnJl7#WJ zllkdTOOlH!+P9DxpgwhJ(Vu3D_a=$iV>0u7eQy1B<&|(l)k$kM)yYDnn{U0%kFlip zybNV9ZQE7UF!MJ*uMhpV%6|9RNlvU34UgIbr2hwLkG}jHfO-wrhI%XBEfk^}`DTUI z8PxuqpB=`m8b6~=J0YqWt~2#rt`6zc=kY0~Adgf*w?#uc#Fq&uTHEsmUbv+A0u%~? z@z-m#ff}FU?*tnYhi&I4Vs<8&Ybpy~vcarEYxj=1ufl{}~j&?X!AUXv=6-$`rM zWyw~L&dZCCF_66$68 zgG)>bgv_TvjR&1r^!FLiX5X*Kh3>7KCzq4UYaQ?0)8Cz=-(;GdgbpO^v@jAj2xz}%l!;WEo}wVmd?Lh<|eDSPX9b~?4mSXx}uaps5Gc8SZTP{ zt&y(!TN!}N5-?F=bxa06iweyil5XZOukCL_pQNV8VLo2Cxa7x}TWq6!xAi7;G}AXw z)^lyp{$wt>IOfHnC$knmzK*DYx<)IScRh$^zz3g99|bD(BA~6W1f4|B($rilwM#ua zXzOhnV9azDhPB5bp^sOF%%GLbUTYFSUYNbkZ%neI-g}#RIOPL5qjXzjUKl91{1D;( zN4D4UM!rp#8H+AuPGqPICiK!~B>Tx!+UE*JQE$A0a2YnLzfRd=AFu<40s*vsV)n8z z-2Jv|L+#%EoLz|_oOCtU{~BY*`VUy1V#g9aEjTS!M>;Yv(Z%zc#mO|@PDqk}!gZr- zK7{9~+s&^1e>}!gHd1Vr}TY(dgJ+o7$CrON{rE2iUK5s z7b;}P9w1{!OVQK5WKmo&^+mK8g3$0m>m8^YG4u2>YQ3H%W9KHD^U!w7yCM=3@6_kmPYW_jOPMM`GKq7=%fXb67lS z0iE--qL^S>6J>j=pX@1Buc(Hvt?v0%M^kwo<9gJbsl&>e1jkR{J_vjp`n zODB*K)ckWUBQ7estGQc&=!Og^mh%5BQ|g!HH}eRhsY<(-xDe(&R4m{$N~lNdrz?BT^(le)BTZ9zL9& zSqj}S|8+4!46VuS-42MAACt3=VD51GJw0BPcRA zTkc~OQYEFLtQNJIh54F_vf#TSq~YM-DZMAmdY~gLY+Cl&(lGSBEBwL0{9IJ1mso*Z zN$(>rkSN4P*Lk2fw4KNF#g_x`6%v`nVlv7%+b|jBJgS2Gg{n*5WHx$~s`>eve+|i< zJ@sTx8B`}xC~f`vHUH>%9-3cheU>(PdJDq~2mS`UuTs*@@~~C* zWiWjBJyj_sDPVs;2vkZlP&5T07Fg0YbGPI|PhFQ|8AlhjmznFdqm|mp%szJmky`O; z0VnM$-iO?t7*JaDOL&-qas2vqG9oMt(h||w`u!k(c^D|a9)8q9N+0<%&$sBrldV?^y6%nbhMzAM*O0%d z-R8GhtW*OK`8D0dt7g=DKiOz&yB1xMpBJFv(#?l<*|vIhQ?V3}12)axFzaD}%|}kp z2rE17dvc2D=qCaEm1=F~GGHbVxQF}JouK+tqLy}iGkl$c>vxD-f2D|#Ik`*1Y)L}u zZ2DSmM_%XY{@R~OOYc@SB@PN2$v~g(wCl7&mmTIM%~-Je7x{YCDwrXB4nBlbT8~)V z29Qxiu^SJGf!e_!05de86~)K6t0K9!{8!#?h0y0@A|2(ti#Y1Kj&sfW*|}~D!sQ8} zvF|mEV4#N5Usr=~U3`RefQ3z2B6o1oQS?-7{Z85{_iH%DDZ~dky(_4eWS2amIC>YL z)EtE9$(siSM%H&PkZ8Pe+3%{%_FF&rb%6@2$OWEm21Y^p4y@Zf5s6oTFnEcfo4Gg7U2le~E4 zB7Mk8t6`TYp^$c`rl@ji=XxNmi2Ym^?d1F2g>%4%E`ieZcnl-@J>cx%hilGoh+F*| zb?*C)i?d6i?4$@mE)DbA73YBwpHV@ZZTGsKap6SVN6f`spW4Zc5hL^W`L<^E2YXpN zqw?}w4HpNqy4vZ3C9|Profso4x8zXFDP|!RoBq_N@MRM2g%DBDF%pz5Zvk8szYJ3{ zIq;oNOvhwP{~WJVM<6bW0*suopJpK=b7}cAV`T-7W?bi2r(T{si$n4`Shj#cde|<) z(ToN+NgOU;jm`lEepE0xZhFPvduwQ$lx_HqtJ?Sw7suls?-SbD*W+mYUkHD3$1G0fD_P1bq6N?{=08l`<;KUb&#eouJgWN;!O;B z*XL&IQZyX~@4jR?vKU!TJga(s#HC=)1N;ErPoCE2biwV z0Y{*ElU`OGjuqJ6H0-i@_O`-|WwgM0oiR=ADMQ&NSXZgOf_IYJF3z!>9up7#{TSBB zS#N9$f3!BJk_GJx%aC#%pT1g8$lj(ddDBdhrHK1i3_UFNA*ik+~0NvD z-luBHUno|JDqVAUm)r;oPPG@+E_f-6UfQ2)m(DnUS-+J_#mhqNImG_ZCL2XQ*R-bn-JVm8oF+O$aj!LWn;w0sicjJ? z*ohi-_8JQ>W)xK-m(W7^oQ>^U>s1QkpAMH^bXArjiWG%atKl`Swbx^T#QH7;%ZAd> zC`GHoivcY9vc)8(?%(r=?}`V-j_fv$pN`L=Qr36VGI$8M^Jb(s?d!}-U3=plxV4i@ z{Sz%aP*l+_-!R2$p)!@51%m5tW@Qv+LY?lDxNd}_3;(yRujv!m)P(w$%ac|>iy=9G za7s`|yYS7M1!wqEGF3DvCvgsy4VCDTCvNp4p1NT{@g%Q_Q?Np`IIwneqa9vVQ59F^ zy!@zjx16dwz#6@$20c_ShJFBo!^~Fzes7jJPERuW zRc5I3ZPa!K-O+&B68{wBW!+q{1VeE4$`{*>uHJ@u}B3_IE0UgfS~4 zrx_gn=pB@oz>Lty#2d~uW9wP5VuuFn8kMsZ>in>0) zr;%S4sU;W$F2qU>})$Y$>p=>%IX! zkIDL4j$B!Dtj#z>9p~2E5eg3ex4=kg$y;;Il+3^lTNki^jCt$0f|A&}Onf8LA4j$= zmS@`_M&;uXj8cU~6Q3%4JMG=1G;;&Vo`psN2YJ&%s>y#oAOmbGO@8&gZ;Z|qE51HqZdKX05`#e!cp}^^xv)qsdTgyUH0*$^z-5?xCNq zoZo?1=lDKR3gty@Ka0>kmG#3kt>Wt`JeKU&8jw7;=CQPVIv2p%NtQNk;3P^F%;&de zte={WyH$)%9`wBV>8`FxL@s#dckWfm$=^3oOcv`x@d#6jqhe>IciOeNSt8aTQ3h9t zCOioT8_hqF1t{BES@fkyF-bM!P!Rb?KDHG#xt&bEN~^5%wY`4@o0~*MLCTQNq(mr7 z7*)D1$QWIG5GnP{UIFz;kQ+K z*=!^oqTw&z`PxOQ*mc(+GhfB|C6>IAUoA@4rlU z-=6a7W1dtNvLYy>xkOI5Ce>IC!YC$8V)2~-6RGHu`Kh4gC=>kT9gS~z5AQ-=X#%VK4c2Y zh$`6m?0XJmiRp~Om={q%3@a&X9G$8YO`G?qL>t>k1%%@Rk$RHP>^%3p2gn*g9MyeT zHqD07JAyck4O6?Km{KHIkb*2Vn}~}o(jVUeQOdIrYM}X?a<4D7=$WiY2b|tbOaZ|VRFW6&G1Cm$}JiBZr< zj+UG4Q#d5TqH)vc5BwKK?JE~WC6wXk+869VkUWu&p)p&vF3-ig+d^sNCoLCnHD9237@~fT{v68DT?k|308iBWF5ki~teH1{9_RvnA^z%H!F}MP}!d zy>2534!@m#?@^05!4Gm&kA6hT#IV-4?56NxggcG{3+-aO9Oc~9+o0FgCt91$x?oBz zHR6&#`Mw>2qu+|DqBM&@dlYg7IHfG7lYrQlGQCMPT^KBPj^wey?Kn9_l{7;LSN9iX zq$CWwdaQeKcuE{xa*_z{jVfODkEoe#$;_z=DQpyWWn$$UdGI;#BeqH;z@qOW< zs;9lRJNzsN_Zg>Y!dlYa?uv{oS-a61hozn_r`^QWU-HXCnTz&{4vLCKdP>#0zPR&G z*eqx2vfZyPnPFQ#`~FmCr(p_$1L%^_F46nOM==@_xx-RjQ2c?&&5YsBP(t_RhPEs~ zpN)g2ElMXckX`vDrp5tC&XoMc5QCied-YCsNmuLcbOj{w!Ip=2f8Upf;`$r@8RbCQ zsGE^s{q7U#r0)zd{rv=1*HdZ{qmuI#-NAu@Iay9_LFav?9&eDRK-wF*9OeFA4qo=r z=^)I*uLy9Q@19aNF)``!_MAw)(v`o?v(-_al(%s{1|b*^NMm~UK}i1WMhVmYwV->g z=%ev|SKkB3J6xf(sk_9sj7%)G}f;{h_(5btws}lHLg`~GJMpIVn35Vt^`Pqt2^kH^U&#!^V z!&Tph8f6kB-387|A+ z{unoU)+$uHvs53t%TK<}@?bPe@j%0y6l34aL-vO9Ym)IQBnxa;d6CefRa_#KDih~8 zwJb=ihW9Im98;kj4QAxA_K`}^9NXuLjl#}f`*P=aCqGJDej!K?7(9wI+x5r^O%?}# z0+YOhnP2ArsCr(l9qzErCSs(=Pw0MJHC;9T1RBWQD|nPJ7|(4b*Fz^n$z`6vm)lCt zXpXpQHF-`BMF>vG#6%mdDtWIGJ9sTf-HZQ>Fip#&=7=8gY zX4gtgJpoXzj)tx?$;j=r;We+%R6wyCFXdAq zp$0_{j=qg!QK`x}&HRvx7op&-vy2n_8`9b+*0G#2B4|h~SlLx)yk1H_xx4p}v5?H1 zK@f54e06Z1nF%?-7)Mo8)aogHKGPCFv5s5_FMaA55yVH?6`Wl0TsJ)EMDYtcuZA<4 z3;CjHH@T5&VM8hveu?M^6#fmMv&|pFbUmE#IAF=&Wb!Sh-5_sCQvYL~?<!{J%Q0CSu#}X4Y1)Zd5`blO<=#u})R;HV=p%OB2I-U)v{k|5Q_F<$woPOC< zs=Rma>LGfmLNOf4JJ>;RHOr+TKX7C131__+q`QrPk~bmC1iw4IxVJGAejWPPR?W7c z!@v#hx8&_){jgN?d&PUr9r=d+2jj>K>;x7=LX{Cw6IG|KE0e`=z3|!haAUCKA9!(e zRca*8*t74w%NoYjDA;s7dB|meUAsDEW@dg3D|RVk1T6jIq5qkM6@KAWT0t`Y>_{k0 z3E`Q zXt7&IHoNm3oKg&T$~x4qHL_Mx3AkydwZBpp;MQ3q8UMEIy*#JGp2B~S-OIKeY=1FV zoP4GH`x-}OZEBc`y+#td-rydiPDZT60be>KeDv!GfwvY10h!V>YZ(Q?xBNoiR$)_b7)%5GajvM)o|9DZpC^r7lm16ukwZz+s<+MMhy zj`M9Jmm6%g$NK4Yd2@ zNAi@6_4pWJi*92Qxx!Pb%OO?>;(7Rqq;uI}kGBO?R3INOC)w%oU5hC^H%m(wIMTgP zaJlqjds`5m&x)OKo@pKGuUxYhO7i)jd-R)l$l4lYd-@W+_=w$f0bFe=K!Ckvb?&7uisI?lV+T5!-fPPYaxTBu&7q%{|F8lu7x}UZ~gZfKb(AizMb?Eq>bP zeUy4ukvw)nT%e;?c{sHYbJiY~ojvwAv6L}Bv__f$w=>~fI|v;w*U>3L|0a)2 zyl5PG4r55%w>f^rqR&3VImZ(vF0_Wb0D&s zhEStwv#&e3yDXMKrKbXRhEy4el2#slwq=ma>tMw33)QQ>M&=~hH!%>K)6~JK-59JC zMrS0Es`T64Wwq(vSy|h4Y?na^b&;z01$Oda=MrZ=uMc^Fw!4|^v4|TGaz$h_eP`K5 z!mmQdb(^b|=Op8yvv)5P4|<0UuHw&@H#8qlRKd14_&R%iPuoN71Wq^6YP`q6xa+G# zvc2ABWGZctt>CU!2rQMN&%u&y%f$_rA++Iph1VpaM=xac!J_5|{2HrfcLfhZcf5p` zY_D(TDgy3XJC${M?lBDi9gWbJ&sulG?XlOw`)D~haF*~pm!O;_!l$=aUIm(Yo*|sA zV34}JKFUrg8G0Db3tU8W48qeCJAn}DdRW0HG{^6YP8(vwOA)m7|1yj%9#oF+k8s>; zH|-YURYDB+%?7RroW$(giXP|`e&d8e6Z>!sGBDB6v4c^%093 zi3b-&Y8v05k?s6Xxj!g&93>v^eNbK*Q$!SYv6Fwj#ak^1c2XTAH{(RI?bOy8d*a~M z6dwa0d~P+DTns*Yxl{h$b=>|nDgQ|br`~vbuY3=0Gd@8gVq4*Cm8nY3fWx7yy=S+~ z!QrhnBwI$Tq~*@AaZqeExCB}`Dw``hhP8tZoxs%R^ku(m z$hj}Ks9F~Xy#AO9eWdA9N3mQv`mDV1?buW|U59Sc{nYTq6z32-xsU0)Q_#H=_|g2; zkU=v6*)<-4W~j&rJ+}^uWa}YOTI=ie>{x?`dubh1k05@*C5^F=#Mr>e@ykm8eWS2RE4sRIW+8ZdN@cZOyEdcw|DCEwc%RV>Nl)lu3DJ;(=L5{-^;gQlYXD0LV<<7 z1`i9ycP#;8<<{hMe_1MlOOLdX)i^^HFWdQGZISc-ROP1c1_I`~%6S96Q-2^!2jwqd zrKe4C+}sj)vtrIp%V%>+(j$25I@UJn%u?LrfO_Fy(o2k)&K-9hwZ)8T3N<#-Z*)<2 zQ;xj1`}8QuyP-2#P=fu_>3xa}kBS#!uKnk`&8?`vE?T_k5uu6JZ_m~l%|*R&_RtYg zSCelnMf6730+JR^l9>Cgz^XxwJWif*mQ*tDH+2m5VxpH}l2OL{baE5WaFc^4gPoQ? zDJ%ug_m6QL{$mjDKL&B<^0Fe>JSE6%?^4iy7T6>x4o?uyCCO| zLd)n1{xNKQ>T1Hjzr9M6>)GK1%Yfwv>B#1D^7HjW$rf`;SwJH|5zOo{XTmm0sb(;> zD@1Ycv)P03tEh8w##|ya(eWCQ=INB9&{YN|syA zI$4F$maGLQ5igJ+9UQHL^}uxvR>vcqv}Hb|?wDBFbL);lL~6`1$)KED?urHWK6|k3}zoL%`MT(dRU-ZgcGo-wb@J zM#)6E+|Cxq%JR5$ohe&JqZ~!PuoM^$6c%s#H_Bu4ch`&Eo*6s(^mx?wBy*TP>CtQ_ zf0vi=S)i+tCz;{HT`@HM5Qv8jD>if!H_4_hhbPNClHOlf&k!+}I##l6rG)D_>bh#E+N4NUcYU+x;gWOuv+8`zhBIU>rgN(n0nVJ;9{LSxBB*Jd5ViQU! zlgQbo1>uo-YZ1RyOispPj8#tg`LtHWR(@sWTtq_1QK_RNw&><>bFSG`RIPnD{uEVj%$fubfxO7TG;r{Z905h zIKO_Lxa~?`b+Yt{hwT19tdP4Kr(VZLhx2xN_n#fxr|S>{q4U{STgO{=>(-Uj@sqtW z@m$LTkxwJ0YmTOt=RlG%DUgh-hvI53+Cg#k*wq(2qp2g0aVSHJ7({SH_!LT34Bdaw zFfqqpoq`b1eC9|qdWa_NSj`DSpit1F9~ zs9U!`Wxk9vSyH@38BQnjYhV{++?@!R;!h~XEJHd{-u$rGFYa!;Y2gQ3Qxjk2-GRE? zFTr+~S9;Am)hIL~rIieN#QGpU@9&$HT*k&y(-87u*W z%ocqOLDtPx#$_(3S?^)>f&F0yG}vH$R48Kb@39WF>gWD5R$f=l68%jTdR3&h7gno7 zwz7PvNhNhE0pVc6W9cv<(4f4CO{Y~qzRWZ;b*jvwHXIty*=-VjR$(Q7knlLx;vTEv z*B-#>*c7hks>Z<4dG35CU9m42cmE!IXLDo0xp5{Ge>MEi^wVIr;AZjQY$NA9{7H8ouEFCEOEZvKN$HZ%-QOlQ`cYR?ZW#&fxTXP-X5 zD=2z7T6-a|9DIuoJ}(*AML1(bFeh|{hJA&-dk52AluCZN_R@R59kcP{LcQ^_E3pc2 zPfBnfmDhukh$5T9k2^PRgXb!kPboa4LZ>nIQT#o z=pIA`KTFj{;dAA#=-k&13?3L;n)1JV`W!@g`!S2_Q=gk$@WP<|w0pKb?3hJ*i$|tJ z0)B(21n2*F^-3%6cy35VTq*GCNIX~{2EUMzv9Dw-8L@aCVPUXH$oq1;C!Ice%FvvY zJwJ>-q38UswrahxpZFSxLUTQ(6lqlM+Z?^d=jVN`f?;y{LmIUuVR7!iG=2rL8~H!p zY`09AJ!uCYVC4-1HhIl?6~u#FW8lu`o_sADj;&DFC<@+l;ZLXHR4$X7@kdKrrN6vb zM{}xLr)os0V7-ZMr>mbz;SyB3#JKj90*4O2ve?4Pdzp1%+ess8Lb3);G zrCDk@+weRQTmwAu44t18VTowvC+nW0GT9m&La#*h`u03F6Zv3vC;Xt{7|EmZ=A>vg zlH0>}X+4}~_Uy&Opp(p^t_sx`l`ZOY2dmxl@};^Z180spyo(qIMFX;`iCoQf7xUx|hZ-5mq@kS zugc3?bRT~lO>JG@n1>2lvF8vPZ&G?}wDI~MK$2={KMKk~F%uC0*bX!K72{>f#-Ci^ zTvslHNvV<3Eer%352Q+dTHV$8Wjf@tmy6HNt5sTDTuww66ig`)#rU47j&AG4D)$0z z^!!|-SqMTcm@{?+Y=-h8(c@5Y%5FMn?A#-wNTifyw7>t+Vl-^a)_upLQ(a@7${0p3 z)rqlJ91Z`DMUobN68%({e#zi=PEW`F)3%?`_hX7I*o2hUyP%7E(&(*~!Hi%u&Bu|u z$o&FmoRiGtNMZ1C@v8zxVQIQAYL}O;cIgMgIa4|z6v_q#mksFAnZ?2V;`8FdR={4N zIK6W1x7Y%l2WPPu`S+UV)vE~{jnC|lbm|#}laN3`O+c>GFWq)|(j5Je=N_*xWYJ|h zK6Z2JEXYOgH76V5CVMx8nSL5)FMM4qJ}yQ^W_!+`#XiqKf(k-d!CR%f*g;mvQhUmK zwm9WbCB9rfFGlP!uH>e2GLtui#eP-jxzTivmpmLh5?w4z~7r35vS6uORuvGa0My+e=OMbS|?+d(&e18DY`CQYxu z;G~yLh+tAJt?qz<#fat{%~p>etkUU@`za$sXrqxXo47`ouibN7H|8!QdMUwWtAd$g zjl_okCvtVSGK%Wx6AA;o{3s9K;iWO+mNWxrmo@k2?vY-XQbAl}mwusM+0|UTGbc6v z`7f+O&^NMt^n)M;NzkkmRTcyxiOQ1?G7WqG_hm4Sl0S;phTA>4KHqLUi<5$ z*l6(Ae(|1F#Rgi%O=Voib8isrJbi(q2pJ3FOxupSI}YTI#epoIA~27cd+f+-v#{>j zR-dXw3>#=pw7_Gtykr_Z>*s_n)S-fJ>|xl$=kBjy88nS-uB$o+bA!)Be*Q0}s@eAADJm9j z8!uud3+63mL<+oR5CS)dQHu?9eBV3t9bn_BEg{|xYoLvJmY+p>(DZE>sn(wWIAAFm zxTWKF%RPMVOSg!v<&0k9^OMd>(U_8A+-yHT2qo`e;kr(Jfm*{0^+_B#8lvBhaRBF! zm*NC2=tzt&CVuPCd`sbvTPC*q0lx2$H+!BzZd7c*R?*pdT)u$!C0=8nQCpp#Eb=~c zc+k+hl#TSh7sv;@G!b+UV7P(#%DCNg&|g%U&eW*_Bm~V`OuR2BzIw42e4`mrYv5H1 z(PGLrNP_pk%?Xp7mc~u{zSlpTLR{LGOkmwDBm+-@Pk`zfeRN|JcyaS{+P&h_a1aMq z(&LjT-9r-jvgA^7beP}io|9s78~Q=^;~r-fR^~z2FNg>#eD>~`n#0IZ?e?R^R2dH# zeDlB$Jf-I^Jj-*``eytt^Lc-;8gcxlw#^b^%1*JzUYRr$c259rNf+MS;H_l~5f-nxb^BYR-lxHdRil$Tr77-|ND_A)FB8T*aP!GwU~qZZ0W z1s=B8GjlKD?s|vVJ90-v-#Eh)3F3VnbJ*T^Jw)!XCB91C5#(Zd_<*LgdSgHT6W*g6 z&1`d|kuYhC!;Nv0M|@FsM7U(${Q|4SUxv?5&_&PW(<^mQEWxGLb=N$$TnoNr*rI$` zShNdD(p9frd%-LDM)>34Qn$H@7Y-3!IR^`}m?p!g>cfVr9lAS9jo)5doWE4|cvpt& z(|GVn=E;xHx#hX1QfmCnYf8-&6K@~mkM0ha6f?qcnoaaZUHeTtj^8UqsiV_wvr~N* z=)CK5x&{Em#G}O%h(_1yI}UJ)1cm(W4y2stuQJu`ZkA1lN=1t>K(&8YGbSdK8jHkJ zcOf44bMkOVvts@nPv%6yvWKZBaupW4Mwnf`tmJ44TT$VEMg%i*H9}DA@l9>>E+Jh z&Vv7CM4tmZesTnipLybPe=w5i-Fw0@tuMM`+ktD|r3&?$HkT!%mGdCXIzUA@2^`Oy zc2L^7(j2Mm(NM%@q&tlEx+iT4?YQk6=@Gx}O&PqUfMngg-&-#kxb72T@4F4R&@Xk^ z=8IIkagAO#6J*Tto(sIt_H*1&BJ4OO*%PA~hE598P+y#0kh$v?@Y`JaJ?&smKI(^Ie~;t_#) zzCC`^@CZC!sJopFD%l}=yszzM>}Ke>&md%K|2q_#eN7-VXI3f6HYP>w}PK=yCQr$PgWKcxq@v{xhZ_`a^TYhmOD#uzprMCRx zu?4(W%`OqWY)2H6YVJ~R^3LBcKGIUr^VhvJ2L^5-pnVepxx6F%99g@U(4uMZ~cO_h`VKgeLIWynXi@4 zwYdor9kq+Yj1hx*+aUlIdh23+YoP! z?q*C1HFS+$sd(kobovsjC)&e@zyOr3PG>bX+P+9GPG)cFpxhHH@@09ryM_l-FdHv? zwd{`vIe6;%;$>N|qBEa{TXVOC=)^Ygq*!!DqCdbE!yA?g2%$_G0g4T{`OHmAX`3Xu zP`l=JygdF1)M0rcb!|qeMXxsj#hNZ?jA-d0D}4#Q%QviNbJ%#l`RVQ{La7=djfD z>g{!?*-cjsBD`Nf|lOtEHQ z==%84VoE!Q+<|uL*r02@-`Q9`iJ4CtQT`T$^V-qs$v#{&dHBrz;6xPt|^E zZmPg*+4p_pF9t{Q71K4VFeV)go|Oh1MUIZ=aB{(W+Prn=#ZN4JY{jk|v2TBAd{fyt zv4x#%_H?v#m!Et-k2OGat`7W&A^t28yU;>)HI~+_Kb&P=(M&-jn;xFJb`QB{RE;!I zw`;j1+dCs&rAC%xHz`5(=E>^C`<1Pdh%9#Er0c~xo*H6v}t>Tka5U?9wXAIR%r_M&AK z?X%w8A+FW7qwCR`Z}?P!T-;45!D=O6i>Fqk&DF1iLvG(yFXSLnn=4&Zm1MWO3};`c zt&cuU`s+=J&_`}MR?_7E7+bJs)V68BjV$a<5||KB4tMIv4}M|z#%20Lay!1F@UO;?7Xwx2%*}-AA79`*ZYy7GHQ2MdyW7-mteXZ_LMmQcL4}% z5~0C@hmOsNK1qcl$t;gX_lhYQ41m<&_?cT0`Q0gT)-Id{KiEGqxZ$VxhL{gMIc=kN z*}q76Kr{Bvs^aZf=!e+1en|@64_w6Tmb?bGyjG#@cBrfw(D4(Q*szJJ%oWtAl)D?h8FvHoV54UVtqz z^v9njf|%aIC1Gx}_E6%Toz?ZLpg6zrv%QT@K_Wv&v*7Z9ZYCL)31hJOXq8we;``Mh7?w{f5DChfyrMuus zZspqZjH8~a?Zti9zHLG?q)uz+7O@q3BJHQ(z7EAV-Zvc=NBEG1(+6mT!5LvS)yCj8 zF4Bo4!)fvN1Rq6t!NETGPL0L5>HCoGmx%Y5Yjte)nLg4p)v&OcP*FwSZ_fF zAVxkZRDZk4(-Mkd=Vs#T+5gxh^@pm*;33Yv(Ed3?I2AnuB)vUzGQr!|?WL zP?N`ip_PA%j-;rKBzdV{uEPYad={em!3Zp4ttY-il(3ry7s`XP6{(JH*pDo47Y$yMm+nIYds34t}sXbv!tFa})hz=T4?!qLEd>UOTI>UgKj6P`OxdOI^Gl z7;^G0l6uHZETpt9Z>wfhfVwG+gk7NS{M8Eo(K(t&xs47!*1Bc-i1bWQ+wCRmUrpBFoWZGN$%O8_yPOq`$l>bM%6 zC-^j^xr4s338O?QC0O+e5wsK_SuV1K7|Mypw&2_&*VMiPT_5$_yAs80a-{MwrUOq?c z2X!Gv#or;}XLXcu3Kaz zj6xnH{zx6m6{8n}AeP)M7rv>MiFd@|Lk*n(Kf9>*R@ln zPL437lF@w1`_0i19Mc^$DK6nN2e(#1UEfsHH}Zdyy7r3bncnSH!_DvQx}+pjjTy`S zj3W1Ho*2Vy3HcJC|q8#35ITsy! zCXqSzAn~o7ztFSFQD&tX+x)yZkcd+m=TK(C0MTbiPg_8bFU=JQbDLp<$DFQ-RIUkzsgHt zzx$kOaemz(j)hHx*AN8%3*M2PRxh}W2v%EmR*eqsGxD`lxm2smmWtL2yRp`?lJ&P`nA5 z{)zmiaT`I|pdv&A*iDqv6aAtnBrZrS3~*}QQX+93%by+h#353vguqZALQkGQ`a=_^ zgfQGTO|eunxI8~Grw!EM|FQ6QeomS(e6aMDnzw8x`ru@~a~p8O?d^Ibejz`kCbHX3 zTRH~6WmNg&vQ+osJ5x7yY=vl@1zXLxRLsN9_qKi}jSxIeGkX=gB=tN3V)mEk74gp| zz%m29>Oqmp?P1($*4SGLt_T4cuA4a;+IsXnr#Ko~bI=(#FoxbObdu1ZKHcMSr zsxcqj^CFeTwXHY&uJPPr(%bKNT`F?%;^W`bGJ>1{{>kh}80yXu5)^FTZWSv#AsuTA z9)dW(^vsgXHsDT1cOctWuK;G08XcG5;YrFOWZ>C5KW5HMub^xTlr+h9T|vfUMB^7G zpT~`dft>>DE!>pqULKJu{X4$(9avSwJf-eSGJ?DhStH7gF~?(r9?*rCwKTdW0; z8Df_;VefVaIqw?$R};u`rE(v=SVtqjdxQMz0{`G4BF@^C1-zpp&#ktNv^LP&OrV(^qb z%Dyj?B}w5jge3h`W*2ge>bA{xZbz(?o&6@%UJ>Z4{*xx=!M&4%0n8#n3sfl z^KY*`Gy0vs<$%r5A1b>S?W=VDrBa)4A0^+k8JJA@i5=-Xo?ZZiNE!KsH|}m;=e|EQ z>F$PYAE)+ke|<`P$|tyugn= ze%2S@q*fUIgcO4K_<3DIc#rF9A|Y*~HoNQe0Z(qhrE??LuKTlu^Y2UCr_4H%1hv9f zILl`Te5be56D+S!Bp-=lFN3_(Sdr>a7~nI}l>UUNR_E=-0T(w8dH(R&j1tW^w*(Anb6)_LhD) zx0;#qxd6sUAHK!?y2h4?tGTVAke4G-6xGilWm3+%(R4xi&*y)e>iY# zjtx|ykSrs@cBiTA_-f&1S>h1kUoG&_ypLcYd)kc7F690U8KV zL61S<1O4d%lw+<* zE5ly(klY9x|J*Qs(G)hpA>b82@exLv_8Rgfk(R!WB290Rl(oDBjoYfSS`Jdn172(r zWoJ{`LW~%^tNKRE8?1jom_OUBcSt*T8c_13PDea&zfe~h!(@S4#RRp;(a3o(mZfoq zdONlm(H#j=rMAa6-q4&;Q9cXo1MIakiy$jBVL@3;P*%;I6RK+gZJoAHg zwj9W*HScAqVjHG;EV(xDCgM%nvY*Cxvt#V)w$Z*|_eOMX%kk#%Ui&n#Sj+5!*)qYS zvsIaO=Xuws+M_xC+x2hFm`n`uP(i;=+SNUZyUje?22?Gss?qY1{BlP)?}9(Q7LEKz zW!ZSzAli?YuzXN#gAD}H${c+VZzvh0Pjz_w+)|PVO2xToM=}?Ks+0&y4HVfb&EAVt&f_Rr5enBuZ#5}gj zd*VMHqt(uN%TY~)^0n#hcfJC{vZdU+(Yc6F__ZJWNC}brzE1;zJ13eDWl?3-945ci z5VT-X`CT$ERqzOF>D-)ZofZG%Ayf%CZF0&~XjErtGd2t7SYi4OxoWy934a(i zVv-lKU&U#K?jW*hh192b_u6b=yQZMLkbJ_UM?THMBDL2PoDM(#Cj7LPn=BR8zH@AJ&D z#a;1CP+>_YDRi7=@ymFc4{p=n_uTpf{ykf<0ubiE@~^}%X!NzgV+{<%Q#)!%y&+2) zJ+0Zc#yH0FYgWsQm$%xb%g1l;qT6O%|DZ!Ld!U|UjAEOn!`TX*BQ}SBwQbiTneD4ieM=JZ04+;e1kF zq+x5v=nwwNT$S7Zy!2?BS6(i9tIK+o+4^XIqr{>tLU^1>%ge4e)u6l{AiNS#=$krmx@%muU&4Km!)LIprC~g~r6nbhUc`eZ4yBfWMyvq}!DLCzQ z<7jcu*aNP)e7^i!D`ePRI{!thS{)(V^lG1?(&IYwrJL{BrC>kaP_s!v(!eS38X(ao zn~nZt`|gwT!5qVali6#P@tCgeyEXnW!7cFqbV>ecr?m(SmmdTzWa^b-fUj@g`SEIg z@G(CkIb-RelhBHN56s$C6NCS?yMv#OS+D|`?d*6pwnqq`g9KP^da0xKFCs3g>3G`> z@?Qe!_9p&PdYEKS%4c8Wqz&Vxt7=9LlsZ)f+VE%e(tb&5za^4WB`5*}6EqdDCt@TM zsiKt9Oqt7`pEo-=#!x4Gu#TBF4ae1ijLQ$VPO&@G;gm?Wp2uvTUdq7_MlF9PVcy9m zC7_h&zHi!L=(TR$KGt>=yfEDL8)!XN5LkdK$zEY^_M^pLOw7Aj36>BrGbOFWq%cf2 z!Q!|!3O-q`HPuCuarGgMR@1z(x@G3p;Iw8Dhsll(KS7%49A$LR)?J4Ec-oavgdF3Xko?=Wfj{~^pa$a#M2=D;l z{_$!9pjPy6-*GIHm9{*#5@hsch%zFX5O}9|ej<5Yp-=TKb(g=@*+;4nzB$s%IYkN6 zB_vkn7jikq+H8X+9y!DrhJ$uuhfSXH$CPP=Jbp?Yi^tOq5bD!^jK5c0^OJ$V~(`$bIVU=-wL(WeQy5Fr#^0hT{ zGAq^!^?xO?N?r&?xJgPv;&&^K4R6)%Sw)=QRE0PA`&ZT{KQ8*vDw< z=tG?Wpiio&QudGP(na7ktlh?Hl(!{KOzMPx2KBEr_pbfm*CwQ#iwm}Q*xE|zW$>4( z-W5CxcWGLc%8%feoj4_{XRA-Tj+GP;Qr#Cfm7RE2{f~*N%z62;>+Xq3(S3H0 zF@uTxi(UMNeqdpVXO)%0e0Zdxj2vgCJyX}qeGEL4w8FX2M;jx5 z_m8W|LT8=)L-B?GSb7Tgnf@Bngkg#?<4_Al)vvg3IOTn5ErbdRABbI<0tdc4|KPi@Lf7XK#L zoLRZ&2HBsXV)P{q$qs^ld)JOPsM*}GRK&XH-a>9%?5qOsgMi(Dr^MR|GQz`lhvi#Q z6=9p2cjnt*9pj>ZSsrFKx%RdemVo3_62I&p;_0Ek{773muPJBAM6rASkOJvynUOmiYA}0#=+MaSy!9^Cl84T^rFdXaa zTEuF3rro&ZrUt!5&1syJg(z&=)%OnY#E$sJLB7?5e>zZF7%Dg@t67zi9BJt$syz)7 zQY^sONaVoaCi{tuQJNS!xZRIQ>amRU$r|PI|3?a1d=<hSA13JTh$S*E^nXh^#!k{ns}*d9yGo zRK2wvWsx)~D-+)L@!>8NDt2b8ivk>A%shD>%bJt3qr2GoK_=#vL^!-EP(|i)$>Axo z3C%=x?KD;qVZ)BC?vhZhUX4~loSp1m?xKUkZk3E+HYay(js>YC)V2}t95G|_YD6#% zEjSn{@!9$FoIDsc$FW2Dq=iO-jg=JwGc)Zm7MF^yogZ6n^n6r_CIr-GG7EQx2T*Wf z8a&d@Z-sp=+c!ZFKh5K+MQewtx`2(E>asl-d)Y5l1vd$2bQI@M-&%tpQe|jVZDhGC zci05{p8gF8*vYaMYyNOv$Y5Zn?zKe73~eih!mFH~&1-a8f`9n`-gg*4H1awY8t5JQQ9gD+3&76&>HiN3(;89FHHJieg$GkX~paWd@ z%e}gOt``a~@-2$;GQJ3sxx}0>cdh5dD?ELA^t@w8n?>SvepRn(*C5Ru=KSPjCa;-} z4Zukedx$pBP>N2@2gx<0W4fsW#tqB)2domR93h= z{^Qx+jS1@Hu1cy2rsMoTm7Ok3WX3%!q-UsT^U>zYreKL{2Ur@EfCzgCIeswl@RNa2 zwHAC{D>rp@g1%d0SyWjn^K&v+X%o6fP8i`>C8NQmPcE=9N^*CreJ?Fp>XD^Dg7D8L z%7t31d#+u)$U3nalkCs3QJ!MaE=Yhckah#KD^1Rer(G4r z^!+nLUF13%!GFeEM(kANf-A`c%i-sqm|ylx@90|NBphXLHju|dV&+YlzdpH0`~feMX1**Jm^<2NwhXj_^FwI*H;-B5b4gpgaQ4&O~;9y3nQyKtR!x{>@DH@fpD zd;rq(&%a~EGAGO2J1!!gSB&K4=--?l%+UlcP+RjkJG`$!K0pyWbdYIR$z(0%gtNbY zv+SdV0N?Yhm-z6=iHFIeeo+_z4kZ;pZfk>%LRJ` zYU-`17NP0>3EdsG>_APkkZ&t7R2x7LrVa9q&k7_Q0Sfzi0s9d#H%U&t^gzs>( zurysumnL<3qD|D-Tx(f$eCTX9EvecoPOS^-Oof&D(Zk3OlrxErIUl=tK`J;l-o?^=M17lS45%ZAA@atJBsk2 zTDQp7M+VdfYEm>p;3?;XkFUoR@!wsxPqBICL$#bJ>laXcU8%T<%KuPuNg3au zr;yT{JEE^Uf{InQeroGT%4K3ML#+R(0t}>!??qQHW#Y4s-`e=R{qHbpnR9{st#V1| z?<-q7ty^2iw0HrJ+osU70-&mBPw6@IaNuXh_rZ+q8m@a`qa-kx-vp1oz63`EIO?D( zJLde~^Bxc5vWVa=6UK@<3sx5Eq!JT5)(^;4n!TUI>~oiHm!wFG%I*$ytTjO_3cO`B z$v>r&_nyi2hRCZ#bflkMS}m^KvvZ&S+B=3!2r$2vz`xdlbE4~IF7{6q^OY@c1W-!r`uzVg!j+$ayQv>$W#4`bMVFX(Fx*zzcQMtO1PZnu?HD6AlUx#dv zrbGLaGgB#jq%3m2aAnR8hEgyWjV(n5oZSpKq^%Rh&dlZtEc<46R!kJp&goW#u=xxQ`iE}vfiN_$s4Bx zjs*@}(76oM?;#kqlQ+DqQ}Cw~Uj_2P;7cu(!+!00>Z+whW(=BBAqoz+1eTqbbc}kn z<(KVuayYOR@(3-PIouLVU(4(=1lwxrUB;>{0naPZo zDb`;;N>yo7UAicO^i_5U-(+jJQQu;Dhu2w`kLm$gy4n%}=)hk_}&tooQX{HED2h)Vh(DfmToAP z+MjalNiJSvY4qw@6vBHz_i~B*ztw?~5@Rt{pu_MXv5; z{-lDPBrl|&jOmv9jf@yI)^VQvN_~HH_kTYCN!J4u0gsx%D)^zKtwGlq8f_oR zuTzTNZ8*GsA+6k6Y`eGlWYrc}v%Zc4Ut8&k0|_66A(1R@P?L7(pNgJT1=}5cD?epo zbM&%;hX^O@gn4qqNDU6-;P2hbz@O?;7K%64HB9E=JP}EQJh~?$ujD|&7%hED-bUUb z%_kf-6WmGP5&zP2isk7|(Dow`>T9gm{nz9c$M?S;R%WnXYy(XZnAVcn<$Q$>x1cAf zP5Xl{h#Pm*OU99t7F>`h{%v}rn$dtgE~<00>~0HjOj5O} jbpW$r$M5e8(g_r!c@~G;9ll>lz?Zu61ErF?51;=Jp1ECU literal 0 HcmV?d00001 diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/gui/tracermi/launcher/AbstractTraceRmiLaunchOffer.java b/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/gui/tracermi/launcher/AbstractTraceRmiLaunchOffer.java index 9346064010..b05a06f34f 100644 --- a/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/gui/tracermi/launcher/AbstractTraceRmiLaunchOffer.java +++ b/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/gui/tracermi/launcher/AbstractTraceRmiLaunchOffer.java @@ -441,9 +441,11 @@ public abstract class AbstractTraceRmiLaunchOffer implements TraceRmiLaunchOffer PtyParent parent = pty.getParent(); PtyChild child = pty.getChild(); - Terminal terminal = terminalService.createWithStreams(Charset.forName("UTF-8"), + Terminal terminal = terminalService.createWithStreams(plugin, Charset.forName("UTF-8"), parent.getInputStream(), parent.getOutputStream()); - terminal.setSubTitle(ShellUtils.generateLine(commandLine)); + + List withoutPath = ShellUtils.removePath(commandLine); + terminal.setSubTitle(ShellUtils.generateLine(withoutPath)); TerminalListener resizeListener = new TerminalListener() { @Override public void resized(short cols, short rows) { @@ -491,7 +493,7 @@ public abstract class AbstractTraceRmiLaunchOffer implements TraceRmiLaunchOffer PtyParent parent = pty.getParent(); PtyChild child = pty.getChild(); - Terminal terminal = terminalService.createWithStreams(Charset.forName("UTF-8"), + Terminal terminal = terminalService.createWithStreams(plugin, Charset.forName("UTF-8"), parent.getInputStream(), parent.getOutputStream()); TerminalListener resizeListener = new TerminalListener() { @Override diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/service/tracermi/TraceRmiHandler.java b/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/service/tracermi/TraceRmiHandler.java index 92766db32e..49bd096cd9 100644 --- a/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/service/tracermi/TraceRmiHandler.java +++ b/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/service/tracermi/TraceRmiHandler.java @@ -481,6 +481,14 @@ public class TraceRmiHandler implements TraceRmiConnection { private interface Dispatcher { RootMessage.Builder dispatch(RootMessage req, RootMessage.Builder rep) throws Exception; + default String exceptionMessage(Throwable exc) { + String msg = exc.getMessage(); + if (msg == null) { + return exc.getClass().getCanonicalName(); + } + return exc.getClass().getCanonicalName() + ": " + msg; + } + default RootMessage handle(RootMessage req) { String desc = toString(req); if (desc != null) { @@ -494,7 +502,7 @@ public class TraceRmiHandler implements TraceRmiConnection { catch (Throwable e) { Msg.error(this, "Exception caused by back end", e); return rep.setError(ReplyError.newBuilder() - .setMessage(e.getMessage())) + .setMessage(exceptionMessage(e))) .build(); } } diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/screen/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerPluginScreenShots.java b/Ghidra/Debug/Debugger-rmi-trace/src/screen/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerPluginScreenShots.java new file mode 100644 index 0000000000..c740d85948 --- /dev/null +++ b/Ghidra/Debug/Debugger-rmi-trace/src/screen/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerPluginScreenShots.java @@ -0,0 +1,75 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.debug.gui.tracermi.connection; + +import java.net.InetSocketAddress; + +import org.junit.Test; + +import ghidra.app.plugin.core.debug.gui.objects.components.DebuggerMethodInvocationDialog; +import ghidra.app.plugin.core.debug.gui.tracermi.connection.TraceRmiConnectionManagerProviderTest.Cx; +import ghidra.app.plugin.core.debug.gui.tracermi.connection.tree.TraceRmiConnectionNode; +import ghidra.app.plugin.core.debug.gui.tracermi.connection.tree.TraceRmiConnectionTreeHelper; +import ghidra.app.plugin.core.debug.service.tracermi.DefaultTraceRmiAcceptor; +import ghidra.app.plugin.core.debug.service.tracermi.TraceRmiPlugin; +import help.screenshot.GhidraScreenShotGenerator; + +public class TraceRmiConnectionManagerPluginScreenShots extends GhidraScreenShotGenerator { + private TraceRmiPlugin servicePlugin; + private TraceRmiConnectionManagerPlugin managerPlugin; + + @Test + public void testCaptureTraceRmiConnectionManagerPlugin() throws Throwable { + servicePlugin = addPlugin(tool, TraceRmiPlugin.class); + managerPlugin = addPlugin(tool, TraceRmiConnectionManagerPlugin.class); + + TraceRmiConnectionManagerProvider provider = + waitForComponentProvider(TraceRmiConnectionManagerProvider.class); + + servicePlugin.startServer(); + DefaultTraceRmiAcceptor acceptor = + servicePlugin.acceptOne(new InetSocketAddress("localhost", 0)); + DefaultTraceRmiAcceptor forCx = + servicePlugin.acceptOne(new InetSocketAddress("localhost", 0)); + try (Cx cx = Cx.complete(forCx, "demo-dbg")) { + cx.client().createTrace(0, "bash"); + + TraceRmiConnectionNode node = + TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) + .get(cx.connection()); + provider.tree.expandTree(node); + waitForTasks(); + + captureIsolatedProvider(provider, 400, 300); + } + finally { + acceptor.cancel(); + } + } + + @Test + public void testCaptureConnectDialog() throws Throwable { + servicePlugin = addPlugin(tool, TraceRmiPlugin.class); + managerPlugin = addPlugin(tool, TraceRmiConnectionManagerPlugin.class); + + TraceRmiConnectionManagerProvider provider = + waitForComponentProvider(TraceRmiConnectionManagerProvider.class); + + performAction(provider.actionConnectOutbound, provider, false); + + captureDialog(DebuggerMethodInvocationDialog.class); + } +} diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/test/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerProviderTest.java b/Ghidra/Debug/Debugger-rmi-trace/src/test/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerProviderTest.java index b499c1b8ff..fbcd3d62f8 100644 --- a/Ghidra/Debug/Debugger-rmi-trace/src/test/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerProviderTest.java +++ b/Ghidra/Debug/Debugger-rmi-trace/src/test/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerProviderTest.java @@ -208,7 +208,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor)); } - record Cx(SocketChannel channel, TestTraceRmiClient client, + public record Cx(SocketChannel channel, TestTraceRmiClient client, TraceRmiConnection connection) implements AutoCloseable { public static Cx complete(TraceRmiAcceptor acceptor, String description) diff --git a/Ghidra/Debug/Debugger/certification.manifest b/Ghidra/Debug/Debugger/certification.manifest index 659589c6fa..9d341db90b 100644 --- a/Ghidra/Debug/Debugger/certification.manifest +++ b/Ghidra/Debug/Debugger/certification.manifest @@ -33,6 +33,8 @@ src/main/help/help/topics/DebuggerMemoryBytesPlugin/DebuggerMemoryBytesPlugin.ht src/main/help/help/topics/DebuggerMemoryBytesPlugin/images/DebuggerMemoryBytesPlugin.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/DebuggerModelPlugin/DebuggerModelPlugin.html||GHIDRA||||END| +src/main/help/help/topics/DebuggerModelPlugin/images/DebuggerModelPlugin.png||GHIDRA||||END| src/main/help/help/topics/DebuggerModelServicePlugin/DebuggerModelServicePlugin.html||GHIDRA||||END| src/main/help/help/topics/DebuggerModulesPlugin/DebuggerModulesPlugin.html||GHIDRA||||END| src/main/help/help/topics/DebuggerModulesPlugin/images/DebuggerModuleMapProposalDialog.png||GHIDRA||||END| @@ -42,20 +44,6 @@ src/main/help/help/topics/DebuggerObjectsPlugin/DebuggerObjectsPlugin.html||GHID src/main/help/help/topics/DebuggerObjectsPlugin/images/DebuggerBreakpointDialog.png||GHIDRA||||END| src/main/help/help/topics/DebuggerObjectsPlugin/images/DebuggerMethodInvocationDialog_ForLaunch.png||GHIDRA||||END| src/main/help/help/topics/DebuggerObjectsPlugin/images/DebuggerObjectsPlugin.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/breakpoint-set.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/display_as_graph.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/display_as_table.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/display_as_tree.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/display_as_xml.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/display_filtered_graph.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/display_filtered_table.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/display_filtered_tree.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/display_filtered_xml.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/export_as_facts.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/export_as_xml.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/import_from_facts.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/import_from_xml.png||GHIDRA||||END| -src/main/help/help/topics/DebuggerObjectsPlugin/images/stop.png||GHIDRA||||END| src/main/help/help/topics/DebuggerPcodeStepperPlugin/DebuggerPcodeStepperPlugin.html||GHIDRA||||END| src/main/help/help/topics/DebuggerPcodeStepperPlugin/images/DebuggerPcodeStepperPlugin.png||GHIDRA||||END| src/main/help/help/topics/DebuggerPlatformPlugin/DebuggerPlatformPlugin.html||GHIDRA||||END| diff --git a/Ghidra/Debug/Debugger/data/debugger.theme.properties b/Ghidra/Debug/Debugger/data/debugger.theme.properties index dd36191376..03d71281da 100644 --- a/Ghidra/Debug/Debugger/data/debugger.theme.properties +++ b/Ghidra/Debug/Debugger/data/debugger.theme.properties @@ -134,6 +134,7 @@ icon.debugger.provider.registers = registers.png icon.debugger.provider.stack = stack.png icon.debugger.provider.breakpoints = breakpoint-mixed.png icon.debugger.provider.modules = modules.png +icon.debugger.provider.mappings = icon.content.handler.program icon.debugger.provider.pcode = stepinto.png icon.debugger.provider.regions = memory16.gif icon.debugger.provider.time = time.png @@ -157,6 +158,8 @@ icon.debugger.map.identically = doubleArrow.png icon.debugger.map.modules = modules.png icon.debugger.map.sections = icon.debugger.map.modules icon.debugger.map.regions = icon.debugger.map.modules +icon.debugger.map.auto = icon.debugger.config +icon.debugger.map.manual = icon.debugger.provider.mappings icon.debugger.block = icon.debugger.map.sections icon.debugger.select.addresses = text_align_justify.png icon.debugger.data.types = dataTypes.png 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 0e27f90481..992d5f9500 100644 --- a/Ghidra/Debug/Debugger/src/main/help/help/TOC_Source.xml +++ b/Ghidra/Debug/Debugger/src/main/help/help/TOC_Source.xml @@ -54,7 +54,7 @@ target="help/topics/Debugger/Debugger.html" > + + - diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/Debugger.html b/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/Debugger.html index 3f1569a122..8bb0bc0473 100644 --- a/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/Debugger.html +++ b/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/Debugger.html @@ -15,38 +15,37 @@

The Debugger is a collection of plugins comprising Ghidra's Dynamic Analysis Framework. This includes a platform for connecting to and controlling debuggers. Ghidra is not a debugger in - itself, but rather, it relies on existing 3rd-party debuggers, their APIs, wire protocols, - and/or command-line interfaces. Such connectors are pluggable, allowing Ghidra to be extended - and integrated with additional debuggers.

+ itself, but rather, it relies on existing 3rd-party ("back end") debuggers, their APIs, wire + protocols, and/or command-line interfaces. Such back ends are pluggable, allowing Ghidra to be + extended and integrated with additional debuggers.

-

When Ghidra recognizes the platform of a target in a connected debugger, it can record that - target into a local database and display the target state. Without recording, the UI will at - least allow interaction through a generic model and/or the debugger's command-line interface. - The recording, called a Trace in Ghidra, logs all the observations made by the framework or the - user. The user can rewind this recording at any point and the UI will recall those - observations, displaying the recorded machine state instead of the present machine state. These - traces can also be saved, loaded, and analyzed after a target has terminated or been - disconnected. Furthermore, they can be committed to a Ghidra Server for sharing and revision - control; however, conflicting changes cannot be merged.

+

Once a target is launched in the back end, the debugger can record that target into a Ghidra + Trace database, and the UI will display the target state. The user can command the debugger + using it's command-line interface (CLI) or the actions provided in Ghidra's Debugger UI. The + trace logs all the observations made by the framework or the user. The user can rewind this + recording during or after a session, and the UI will recall those observations, displaying the + recorded machine state instead of the present machine state. These traces can also be saved, + loaded, and analyzed after a target has terminated or been disconnected. Furthermore, they can + be committed to a Ghidra Server for sharing and revision control; however, conflicting changes + cannot be merged.

A system of mappings, which is usually populated automatically, tracks the relationship of - imported Ghidra programs to modules recorded in a trace. By default, Ghidra will synchronize - the cursor in the dynamic listing with that in the static listing, and encourage the user to - import missing modules. In this way, existing static analysis is readily at hand during a - dynamic analysis session, and the user can further populate program databases during a + imported Ghidra Program databases to modules recorded in a trace. By default, Ghidra will + synchronize the cursor in the dynamic listing with that in the static listing, and encourage + the user to import missing modules. In this way, existing static analysis is readily at hand + during a dynamic analysis session, and the user can further populate program databases during a debugging session. However, target memories contain more spaces than program images, e.g., stack and heap space, and some of those spaces are modified at runtime, e.g., .bss or .data. This information, if observed, is dutifully recorded into the trace for immediate or offline analysis.

-

A variety of plugins allow the user to interact with the target directly, view and - manipulate machine state, set breakpoints, view recordings, etc. See the table of contents for - a comprehensive list of current plugins. Plugins generally fall into one of these - categories:

+

A variety of plugins allow the user to interact with the target, view and manipulate machine + state, set breakpoints, view recordings, etc. See the table of contents for a comprehensive + list of current plugins. Plugins generally fall into one of these categories:

    -
  1. Target manipulation - those used for managing connections and interacting with targets, - regardless of tracing
  2. +
  3. Target manipulation - those used for managing connections and interacting with + targets.
  4. Trace manipulation - those used for viewing and manipulating the trace database, including machine state inspection. Most of these behave differently when the view is "at the diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/GettingStarted.html b/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/GettingStarted.html index cacfe49fff..4eb7e1b4ef 100644 --- a/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/GettingStarted.html +++ b/Ghidra/Debug/Debugger/src/main/help/help/topics/Debugger/GettingStarted.html @@ -13,156 +13,133 @@

    Debugger: Getting Started

    -

    The debugger is poised to support debugging native user-mode applications for Windows and - Linux on 64-bit x86. This is accomplished by "connecting" to the respective debugger for each - platform: MS dbgeng.dll on Windows, and GDB/MI on Linux. A variety of configurations are - possible, and we are already developing more connectors, but native desktop applications are - the target for this release.

    +

    The debugger supports debugging native user-mode applications for Linux, macOS, and Windows + on 64-bit x86 and often arm64, e.g., when on "Apple Silicon." While not official, it also + supports a variety of other platforms, so long as Ghidra can connect to a debugger that + supports it. Launching is accomplished by connecting to the respective debugger for the target + platform: GDB on Linux, LLDB on macOS, and the Windows Debugger (dbgeng.dll) on + Windows. Several launch configurations are already included, and new launchers are fairly + easily added by writing shell scripts.

    Pay Attention to Errors

    Many actions are taken automatically on behalf of the user, e.g., reading registers when a - target is paused. In most cases, errors on automatic actions are dropped to the Debug Console, - as displaying them in a dialog could become a pest. That said, if things still don't seem - right, please check the application log messages.

    + target is paused. In most cases, errors on automatic actions are dropped to the Debug Console, as displaying + them in a dialog could become a pest. That said, if things still don't seem right, please check + the terminal or Ghidra's application log.

    Launching a Target

    -

    Starting up the Ghidra Debugger for the simplest use case, user-mode debugging of a local - process, entails two steps:

    +

    Starting up the Ghidra Debugger for user-mode debugging of a local process usually entails + just two steps:

    1. Open (or import) your program into the Debugger tool
    2. -
    3. Click the "Debug" button ("bug" icon) in the main toolbar
    4. +
    5. Click the Launch (bug icon) button in the main + toolbar
    -

    To load the default Debugger tool, from the main Ghidra application window select Tools → Import Default Tools... from the menus. Select - "defaultTools/Debugger.tool", and hit "OK". The Debugger tool will be added to the Tool +

    The first time you launch a given program, you may be asked to select and configure a + specific launcher. To load the default Debugger tool, from the main Ghidra application window + select Tools → Import Default Tools... from the menus. Select + "defaultTools/Debugger.tool", and hit OK. The Debugger tool will be added to the Tool Chest.

    To launch the tool, you have several options, identical to those you might use to launch the CodeBrowser tool. You can click the Debugger icon to launch an empty Debugger tool. You can drag a program that you have already imported from the Active Project window onto the tool icon - in the Tool Chest, or you can right-click on one of the project programs and pick Open With → Debugger. If you open an empty Debugger tool, you can add - programs to it later in the usual ways, e.g. via File → Import - File... or by dragging-and-dropping programs onto the running tool.

    + in the Tool Chest, or you can right-click on one of the programs in the project and pick + Open With → Debugger. If you open an empty Debugger tool, you can add programs to + it later in the usual ways, e.g. via File → Import File... or by + dragging-and-dropping programs onto the running tool.

    -

    The default tool is pre-configured with a collection of plugins relevant for the Listing and - for Debugger-related operations. As always, there is some chance that the tool will launch with - some portion of the plugins not displayed or with a less-than-optimal layout. To verify which - plugins you have, you can select File → Configure. "Debugger" - should already be selected. Choosing "Configure All Plugins" (the plug icon near the top - right), should show the full list of pre-selected plugins. Debugger-related plugins all begin - with "Debugger". At a bare minimum, you will need the "DebuggerTargetsPlugin" and the - "DebuggerObjectsPlugin", and the plugins on which they depend.

    +

    The default tool is pre-configured with a collection of plugins relevant to both dynamic and + static analysis. As always, there is some chance that the tool will launch with some portion of + the plugins not displayed or with a less-than-optimal layout. To verify which plugins you have, + you can select File → Configure. "Debugger" should already be selected. Choosing + Configure All Plugins (the plug icon) near + the top right should show the full list of pre-selected plugins. Debugger-related plugins all + begin with "Debugger" or "TraceRmi."

    -

    For the "Debug" button to work, you must (a) have the program you wish to run visible and - selected in the static Listing window, and (b) have imported the program from the place it +

    For the Launch button to work, you must (a) have the program you wish to run visible + and selected in the static Listing window, and (b) have imported the program from the place it lives on the local system. In other words, the file path associated with the program should be - the path to the executable for the current file system. You can verify this using the Help → About my_program menu item in the main tool bar. For example, - on a Linux system, if you've imported "xclock", Help → About - xclock... should have an entry at the bottom of the page for "Executable Location: - /usr/bin/xclock".

    - -

    Alternative launch options may be available using the dropdown next to the "Debug" button. - Furthermore, to access additional configuration options, use the Debugger - → Debug program → ... menu options. The options selected here are saved and - applied for later launches, whether from the button or the menu.

    + the path to the executable for the current file system. You can verify this using the Help + → About my_program menu item in the main tool bar. For example, on a Linux system, if + you've imported "xclock", Help → About xclock... should have an entry at the bottom + of the page for "Executable Location: /usr/bin/xclock".

    When you launch the target by this method, a number of changes should be evident in the GUI. - A blank "Agent" window may appear, indicating the agent status and connection port (if GADP was - selected). An interpreter console will appear, potentially including various information about - the launch. A connection will be added to the Targets window. A new tree + A Terminal should appear, containing the actual back end debugger, likely including some + initialization messages and diagnostics. A new trace will appears in the Listing. A new tree structure will be populated within the Objects window. The - remaining windows will be populated with current trace information. Please be patient, on some - platforms it may still take some time for things to populate and settle. The Debug Console - should provide some hints as to ongoing activity.

    + "help/topics/DebuggerModelPlugin/DebuggerModelPlugin.html">Model window. The remaining + windows will be populated with current trace information. Please be patient, on some platforms + it may still take some time for things to populate and settle. The Debug Console should provide + some hints as to ongoing activity.

    Debugger Components

    -

    Some of the more commonly-access components are explained below. Many also have their own +

    Some of the more commonly accessed components are explained below. They also have their own help pages.

    -

    Debugging Agent

    +

    Terminal

    -

    An "agent" is a process running on the local system, which acts as a mediator between the - Ghidra GUI and the native debugger. For systems such as Linux that support GDB, the agent wraps - the native GDB functionality via a Java container that implements the GDB machine interface - (GDB/MI). For Windows, the agent wraps the native dbgeng.dll functionality in a similar - fashion. The blank "Agent" window allows you to see the current status of the agent. If the - agent dies or is killed, the debugging session will be terminated. Of particular note, the - protocol used to communicate between the GUI and the agent is the Ghidra Asynchronous Debug - Protocol (GADP). It is not the native protocol associated with the debugger. Direct - communication with a native target is not currently supported, although that functionality may - be added in the future. If you choose an IN-VM connector, Ghidra will access the native - debugger directly, so no agent window will appear. This may be faster, but it also introduces - the risk of crashing Ghidra and losing data.

    +

    The terminal window allows a user command-line access to the native debugger. For Linux, + this means the standard GDB command line interface; for macOS, the LLDB command line interface; + and for Windows, the WinDbg/kd command set. While basic tasks may not require using the command + line interface, more complicated debugging scenarios invariably require commands specific to + the target which have not or cannot be implemented generically in the GUI. Additionally, if for + some reason the connection to Ghidra fails, the terminal will still provide command-line access + for diagnostics and/or manual recovery.

    -

    Interpreter

    +

    Model

    -

    The interpreter window allows a user command-line access to the native debugger. For Linux, - this means the standard GDB command line interface; for Windows, the WinDbg/kd command set. - While basic tasks may not require using the command line interface, more complicated debugging - scenarios invariably require commands specific to the target which have not or cannot be - implemented generically in the GUI.

    +

    The Model window + displays a directory of objects in a 3d-party debugging session using a structure determined by + its back-end plugin. In some cases, e.g., when the back end does not recognize the target's + architecture, other displays may struggle to display meaningful information. Even then, this + window should provide a good overview of the debugger's and its target's current state. It may + also provide some useful commands for diagnostics, but the terminal may be a better choice.

    -

    Targets / Connections

    +

    Listing

    -

    The "Debugger Targets" window adds an entry for every new debugger connection. These may be - added directly from this window using the "Connect" button. This allows the user to select - non-default connection options and/or to initiate a connection without launching or attaching - to a target. Using this method of starting a connection requires the additional step of - launching or attaching to a specific target.

    +

    The back end uses its connection to Ghidra to create a trace and record target information + into it. The Debugger's various windows all derive their contents from the current trace. + Perhaps the most important of these is the Listing window. Analogous to + the static listing, it displays the raw bytes in the target's memory and allows the user to + mark them up, e.g., disassemble, place data types, comment. Unlike the static listing, this + window shows live bytes in all valid memory, including stacks and heaps. When it can, the + Ghidra debugger keeps the cursor locations in the Static and Dynamic Listings synchronized.

    -

    Objects

    +

    Controls and Miscellany

    -

    To launch or attach to a target without using the "Debug" button, you will need to use the - "Objects" window. The "Objects" window provides a default tree-structured list of everything - the debugger knows about the target. On its tool bar are buttons for "Quick Launch', "Launch", - and "Attach". "Quick Launch", like the "Debug" button on the main tool bar, runs the executable - associated with the active program in the Listing view. "Launch" allows you to specify a target - and its parameters, typically, in the form of a command line. This target can be any executable - on the system and need not be associated with an imported program. The "Attach" button - populates a list with potential targets from the running process list for the system, which the - user may select and attach to.

    +

    The main toolbar provides your standard debugging controls, e.g., resume, step, interrupt. + They apply to the current thread or frame as defined by the back end's command set. For + details, see the Control plugin. During or + after a session, the user can examine trace history or emulate by changing control mode.

    -

    Traces and Threads

    - -

    The Targets, Objects, and Interpreter windows are the only windows populated directly using - information gleaned directly from the target. All other windows derive information from the - current trace. Once triggered, Ghidra captures information from the current debugging session - and uses this information to fill the other windows. The most important of these is the - "Threads" provider. The Threads window has two parts: one on the left listing the set of traced - target threads and one on the right indicating the current position in the trace by thread. If - no process is being traced or no thread is selected, all of the remaining windows will be - empty. If the current position (indicated by the draggable caret at the top of the right - display) lies outside the bounds of the current trace, all of the remaining windows will be - empty. Selecting a thread and a position causes the trace-based windows to display information - for that thread and time. From this window, the "step" buttons can be used to simulate target - execution to some extent.

    - -

    Commands / Miscellany

    - -

    The control buttons in the Objects window or commands issued in the Interpreter cause the - target to advance in the usual ways. (The control buttons in the Thread window, by contrast, - cause the trace to move forward or backward without affecting the target.) Breakpoints can be - set from either the "Breakpoints" window or the listing. The "Registers" and "Stack" display - reflect the state of the selected thread from the "Threads" window. Typically, the thread - selected for the trace in the Threads display is kept in sync with the active thread for the - debugger selected in the Objects view, but this need not be the case. Similarly, the "Dynamic - Listing" shows the bytes from the target's actual memory, which may or may not match the bytes - from the imported executable in the primary "Listing". When it can, the Ghidra debugger keeps - the Static and Dynamic Listings synchronized.

    +

    Breakpoints can be set from either the Breakpoints window + or the Listing. + The Registers + and Stack windows + reflect the state of the current thread, which can be selected in the Threads window. Typically, + the thread selected for the trace in the Threads window is kept in sync with the + active/selected/focused thread in the back-end debugger, but not always.

    Console

    -

    This console is a central place for reporting activity, errors, and suggesting actions. This - is the first place to look when troubleshooting.

    +

    The Debug Console + is a central place for reporting activity, errors, and suggesting actions. This and the + Terminal are the first places to look when troubleshooting.

    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 8617d48425..c646dfda9c 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,68 +15,79 @@

    Often, it's a good idea to troubleshoot by using the target platform's recommended debugger without connecting it to Ghidra. If it doesn't work there, it's not likely to work in Ghidra, - since it relies on that debugger. For Linux, use gdb; for Windows, use WinDbg; for macOS, use - LLDB.

    + since it relies on that debugger. For Linux, use gdb; for macOS, use LLDB; for Windows, use + WinDbg.

    + +

    Terminal

    + +

    The first place to look when you're having trouble is the debugger's terminal. If you do not + see one, check the Window → Terminals menu. If there is not one there, then there + is no back-end debugger running — unless, perhaps, you are trying to use a Recorder-based + target. See Plugin Configuration if you suspect this is the + case.

    + +

    If you already have the correct set of TraceRmi-based plugins enabled, but there is still no + terminal after attempting to launch, then the launcher is sorely mis-configured, or your system + or installation is broken. Use Debugger → Configure and Launch ... in the menus to + examine and modify your configuration and try again. This menu is also avaible in the drop-down + next to the Launch button.

    + +

    If you do have a terminal, then examine it, starting at the very top, for errors and + warnings.

    Error Console

    -

    The first place to look when you're having trouble is the Debug Console. Second, if you're - running from 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 component. - These typically offer clues to exactly what has gone wrong.

    +

    The next place to look is the Debug Console. Launchers and + plugins for the Debugger often direct their diagnostic messages to this console, and sometimes + offer remedies.

    -

    Settings and Toggles

    +

    Application Log

    -

    This list is not exhaustive, but here are some options to examine if you're having trouble. - In the FrontEnd tool, under Edit → Tool Options, select - "Debugger.Workflow."

    +

    The next place to look is Ghidra's application log. From the main project window (not the + Debugger tool window), select Help → Show Log in the menus. This is Ghidra's full + application log, so you may need to sift through it for debugger-related entries. Usually + searching for "debugger", "launch", "tracermi", or the name of your platform's debugger, etc., + will help. If you're running from Eclipse, you can check its "Console" window.

    + +

    Plugin Configuration

    + +

    It is possible you have an old Debugger tool still configured for Recorder-based targets. + Recorder-based targets are being replaced by TraceRmi-based targets. Try re-importing the + default Debugger tool.

    + +

    Alternatively, use File → Configure then click the plug icon near the top right to check your tool configuration. The + following should be enabled:

      -
    • "Map modules..." and "Map sections..." control how the debugger attempts to map static - and dynamic memory.
    • +
    • TraceRmiPlugin
    • -
    • "Disassemble..." triggers automatic disassembly in the dynamic view.
    • +
    • TraceRmiLauncherServicePlugin
    • -
    • "Show debugger interpreter..." automatically provides access to the command line.
    • +
    • TraceRmiConnectionManagerPlugin
    • + +
    • DebuggerModelPlugin
    -

    In the Dynamic Listing:

    +

    The following should be disabled:

      -
    • "Sync to Static Listing" controls the tracking of the Static listing.
    • +
    • DebuggerModelServicePlugin
    • + +
    • DebuggerModelServiceProxyPlugin
    • + +
    • DebuggerInterpretersPlugin
    • + +
    • DebuggerObjectsPlugin
    • + +
    • DebuggerTargetsPlugin
    -

    In the Objects provider:

    +

    It is possible to leave both sets of plugins enabled, but this is by all means NOT + recommended.

    -
      -
    • "Record Automatically" causes a trace to be started when a Process object comes into - view. If the process object is not exposed automatically, you may have to expand the tree to - trigger the trace. If auto-record is toggled off, you'll need to hit "Record (R)" with the - process selected to start a trace.
    • - -
    • "Subscribe to..." causes a particular object to be tracked by the trace. Processes, - threads, registers, memory, stack, and so forth are tracked automatically, but you may wish - to add other objects ad hoc.
    • -
    - -

    In the Threads provider:

    - -
      -
    • The "Track the tool to the latest snap" toggle determines whether the caret (and all - resulting information) should track the current thread position as it updates.
    • - -
    • The "Synchronize trace activation..." toggle attempts to maintain synchronization between - the Object provider (i.e. the active target information) and the trace.
    • -
    - -

    In the Debugger menu:

    - -
      -
    • The "Save Traces By Default" toggle causes traces to be saved into the Ghidra project - database at the end of a session. (Open sessions will be re-opened with the tool in the - Threads window, reflected in the thin tabs at its top.)
    • -
    +

    Tutorial

    Additional troubleshooting recommendations are given in the Debugger course materials.

    diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerBreakpointMarkerPlugin/DebuggerBreakpointMarkerPlugin.html b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerBreakpointMarkerPlugin/DebuggerBreakpointMarkerPlugin.html index e23b219d47..76d6fffe76 100644 --- a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerBreakpointMarkerPlugin/DebuggerBreakpointMarkerPlugin.html +++ b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerBreakpointMarkerPlugin/DebuggerBreakpointMarkerPlugin.html @@ -13,14 +13,9 @@

    Debugger: Breakpoints in the Listings

    - - - - - - -
    +
    + +

    For a description of how breakpoints are managed logically in Ghidra, please read about the Breakpoints @@ -37,14 +32,9 @@

    In the Function Graph

    - - - - - - -
    +
    + +

    When active in the Debugger, the Function Graph will display @@ -55,14 +45,9 @@

    In the Decompiler

    - - - - - - -
    +
    + +

    When active in the Debugger, the Decompiler will display breakpoints in @@ -86,8 +71,8 @@ other address-based contexts, but not all of those contexts include visual breakpoint indicators.

    -

    Toggle - Breakpoint (K)

    +

    + Toggle Breakpoint (K)

    This action is always available, and it is suitable for almost all cases. If there is a breakpoint at the cursor, this simply toggles its state. If there is no breakpoint at the @@ -99,7 +84,7 @@ actions to force specific commands. NOTE: The default parameters are not guaranteed to be accepted by the connected debugger.

    -

    Set +

    Set Breakpoint

    This menu is available on the dynamic listing when the target supports at least one @@ -107,18 +92,12 @@ breakpoint actions for each reasonable combination of kinds supported by the target. In the static listing, all reasonable combinations are available, regardless of target support; however, only those kinds supported by the target will be included in the resulting command. - NOTE: Breakpoints in the static listing can only be mapped to targets which are recorded - into a trace. Selecting one of the actions will display a prompt allowing adjustments to the - parameters before issuing the command.

    + Selecting one of the actions will display a prompt allowing adjustments to the parameters + before issuing the command.

    - - - - - - -
    +
    + +
    • Address - the address of the breakpoint. It defaults to the address of the instruction or @@ -136,19 +115,19 @@ static location, if applicable.
    -

    Enable +

    Enable Breakpoint

    This action is available when there is at least one disabled breakpoint at the cursor. It enables those logical breakpoints.

    -

    Disable - Breakpoint

    +

    + Disable Breakpoint

    This action is available when there is at least one enabled breakpoint at the cursor. It disables those logical breakpoints.

    -

    Clear +

    Clear (Delete) Breakpoint

    This action is available when there is at least one breakpoint (in any state) at the cursor. diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerBreakpointsPlugin/DebuggerBreakpointsPlugin.html b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerBreakpointsPlugin/DebuggerBreakpointsPlugin.html index 40912e874d..d4681846f3 100644 --- a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerBreakpointsPlugin/DebuggerBreakpointsPlugin.html +++ b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerBreakpointsPlugin/DebuggerBreakpointsPlugin.html @@ -13,154 +13,147 @@

    Debugger: Breakpoints

    - - - - - - -
    +
    + +

    The breakpoints window tabulates and manipulates breakpoints among all traces, including live targets. Only address-based breakpoints are tabulated. For other traps, e.g., "break on exception," see the Objects Window. Breakpoints - can also be manipulated from address-based views, especially the disassembly listings. See Model window. Breakpoints can + also be manipulated from address-based views, especially the disassembly listings. See Breakpoints in the Listings.

    Individual breakpoint locations from among the traces are consolidated into logical - breakpoints, based on their addresses in the static listing. The static locations are typically - stored as bookmarks in their respective Ghidra programs, comprising the current breakpoint set. - See the Static Mappings - window for the finer details of address mapping. A breakpoint which cannot be mapped to a - static address becomes its own logical breakpoint at its dynamic address. The top table of the - provider displays logical breakpoints; the bottom table displays individual trace breakpoint - locations. NOTE: The breakpoints window cannot display or manipulate breakpoints from a - live target until that target is recorded into a trace. Only those breakpoints visible at the - current snapshot of each trace are included. For live targets, this is typically the latest - snapshot, i.e., the present.

    + breakpoints, based on their addresses in the static listing. The current breakpoint set + comprises the static locations, stored as bookmarks in their respective program databases. See + the Static + Mappings window for the finer details of address mapping. A breakpoint which cannot be + mapped to a static address becomes its own logical breakpoint at its dynamic address. The top + table of the provider displays logical breakpoints; the bottom table displays individual + breakpoint locations. NOTE: Only those breakpoints visible at the current snapshot of + each trace are included. For live targets, this is typically the latest snapshot, i.e., the + present.

    Depending on what is supported by the connected debugger, breakpoints can trap a target when an address or range is executed, read, or written; using software or hardware mechanisms. In - the case of "read" or "write" breakpoints, debuggers may differ in terminology. For example, - GDB might call them "watchpoints," but Ghidra still calls these "breakpoints." Some debuggers - allow the user to specify a breakpoint location other than by address, but ultimately each - specification is realized by 0 or more addressable locations. To accommodate this, the Objects window will - typically display a list of specifications, each listing its locations as children. However, - the grouping of breakpoint locations into logical breakpoints by Ghidra's breakpoint manager is - done without respect to the debugger's specifications. A specification may be at a - higher stratum than Ghidra natively understands, e.g., the source filename and line number, and - so such specifications are not relevant. Also note that the debugger might not permit locations - to be manipulated independently of their specifications. This may limit how Ghidra can operate, - since in that case, it must configure the specification, which may affect more locations than + the case of read or write breakpoints, debuggers may differ in terminology. + For example, GDB might call them watchpoints, but Ghidra still calls these + breakpoints. Some debuggers allow the user to specify a breakpoint location other than + by address, but ultimately each specification is realized by 0 or more addressable locations. + To accommodate this, the Model window will typically + display a list of specifications, each listing its locations as children. However, the grouping + of breakpoint locations into logical breakpoints by Ghidra's breakpoint manager is done + without respect to the debugger's specifications. A specification may be at a higher + stratum than Ghidra natively understands, e.g., the source filename and line number, and so + such specifications are not relevant. Also note that the debugger might not permit locations to + be toggled independently of their specifications. This may limit how Ghidra can operate, since + in that case, it must toggle the specification, which may affect more locations than intended.

    When the control - mode is set to "trace" or "emulator," it is possible to rewind the trace to past snapshots - and examine old breakpoints. You may also emulate from those snapshots, even if the target is - no longer alive. By default, those historical breakpoints are disabled in the integrated - emulator, but they can be toggled in the usual ways. In addition, the locations can be - manipulated independently, since the emulator has its own breakpoint set. Emulated breakpoints - can be configured with conditions expressed in Sleigh using the Set - Condition action, or configured to replace the instruction's semantics altogether using the - Set Injection action.

    + mode is set to Trace or Emulator, it is possible to rewind the trace to past + snapshots and examine old breakpoints. You may also emulate from those snapshots, even if the + target is no longer alive. By default, those historical breakpoints are disabled in the + integrated emulator, but they can be toggled in the usual ways. In addition, the locations can + be manipulated independently, since the emulator has its own breakpoint set. Emulated + breakpoints can be configured with conditions expressed in Sleigh using the Set Condition action, or configured to replace the instruction's semantics + altogether using the Set Injection action.

    Because of the logical grouping of breakpoints, it is possible for a breakpoint to be in a mixed or inconsistent state. This happens quite commonly, e.g., when a breakpoint is placed in - a Ghidra program before that program is mapped to any trace. Once mapped, the location of that - breakpoint in the trace is computed and noted as missing. A logical breakpoint without any - location in a trace is called ineffective and is drawn in grey, e.g.: . An enabled logical breakpoint having a disabled location - is called inconsistent and its icon will include an exclamation mark: . A disabled logical breakpoint having an enabled - location is similarly inconsistent. Toggling an ineffective or inconsistent logical breakpoint - enables and/or places all its mapped locations, aiming for a consistent enabled state. Toggling - it again disables all locations.

    + the Static Listing before that program is mapped to any trace. Once mapped, the dynamic + location of that breakpoint is computed and noted as missing. A logical breakpoint without any + location in a target is called ineffective and is drawn in grey, e.g.: . An enabled logical breakpoint + having a disabled location is called inconsistent and its icon will include an + exclamation mark: . A disabled + logical breakpoint having an enabled location is similarly inconsistent. Toggling an + ineffective or inconsistent logical breakpoint enables and/or places all its mapped locations, + aiming for a consistent enabled state. Toggling it again disables all locations.

    Tables and Columns

    The top table, which lists logical breakpoints, has the following columns:

      -
    • State: displays an icon indicating the state of the breakpoint. If rendered in - grey, the breakpoint has no locations, i.e., it is ineffective. If rendered with an - exclamation mark overlay, the breakpoint is inconsistent. Clicking the icon toggles the - breakpoint.
    • +
    • State - displays an icon indicating the state of the breakpoint. If rendered in grey, the + breakpoint has no locations, i.e., it is ineffective. If rendered with an exclamation mark + overlay, the breakpoint is inconsistent. Clicking the icon toggles the breakpoint.
      • -
      • Enabled: The logical - breakpoint, including all its locations, is enabled.
      • +
      • Enabled: The + logical breakpoint, including all its locations, is enabled.
      • -
      • Disabled: The logical - breakpoint, including all its locations, is disabled.
      • +
      • Disabled: The + logical breakpoint, including all its locations, is disabled.
      • -
      • Mixed: (Listing only) Two - logical breakpoints at the same address have different states.
      • +
      • Mixed: (Listing + only) Two logical breakpoints at the same address have different states.
      -
    • Name: gives the user-defined name of the breakpoint. This cell is only populated - and modifiable when the breakpoint is bookmarked in a program, since the name is associated - with the static location.
    • +
    • Name - gives the user-defined name of the breakpoint. This cell is only populated and + modifiable when the breakpoint is bookmarked in a program, since the name is associated with + the static location.
    • -
    • Address: gives the address of the breakpoint. This is typically the static - address. If the breakpoint cannot be mapped to a static address, this is its dynamic - address.
    • +
    • Address - gives the address of the breakpoint. This is typically the static address. If + the breakpoint cannot be mapped to a static address, this is its dynamic address.
    • -
    • Image: gives the name of the static image, i.e., Ghidra program. If the breakpoint +
    • Image - gives the name of the static image, i.e., Ghidra program. If the breakpoint cannot be mapped to a static location, this is blank.
    • -
    • Length: usually 1. For access breakpoints, this is the length in bytes of the - address range.
    • +
    • Length - usually 1. For access breakpoints, this is the length in bytes of the address + range.
    • -
    • Kinds: indicates the kind(s) of breakpoint: SW_EXECUTE, HW_EXECUTE, READ, and/or +
    • Kinds - indicates the kind(s) of breakpoint: SW_EXECUTE, HW_EXECUTE, READ, and/or WRITE.
    • -
    • Locations: counts the number of locations included in this logical breakpoint, - applying the trace filter if active. Note that a logical breakpoint with 0 locations is +
    • Locations - counts the number of locations included in this logical breakpoint, applying + the trace filter if active. Note that a logical breakpoint with 0 locations is ineffective.
    • -
    • Sleigh: indicates whether or not the breakpoint has a customized Sleigh - configuration. This is only relevant for emulation.
    • +
    • Sleigh - indicates whether or not the breakpoint has a customized Sleigh configuration. + This is only relevant for emulation.

    The bottom table, which lists breakpoint locations, has the following columns:

      -
    • State: displays an icon indicating the state of the location. If rendered with an +
    • State - displays an icon indicating the state of the location. If rendered with an exclamation mark overlay, the location does not agree with its logical breakpoint, or it cannot be bookmarked. Clicking the icon toggles the location.
      • -
      • Enabled: The location is - enabled.
      • +
      • Enabled: The + location is enabled.
      • -
      • Disabled: The location is - disabled.
      • +
      • Disabled: The + location is disabled.
      • -
      • Mixed: (Listing only) Two - locations at the same address have different states.
      • +
      • Mixed: (Listing + only) Two locations at the same address have different states.
      -
    • Name: displays the name given to the location by the connected debugger. This +
    • Name - displays the name given to the location by the connected debugger. This field is + user modifiable.
    • + +
    • Address - gives the dynamic address of this location.
    • + +
    • Trace - gives the name of the location's trace.
    • + +
    • Threads - (hidden by default) if the breakpoint applies to a limited set of threads, + gives the list of threads.
    • + +
    • Comment - gives a user comment — the specification's expression by default. This field is user modifiable.
    • -
    • Address: gives the dynamic address of this location.
    • - -
    • Trace: gives the name of the location's trace.
    • - -
    • Threads: (hidden by default) if the breakpoint applies to a limited set of - threads, gives the list of threads.
    • - -
    • Comment: gives a user comment — the specification's expression by default. - This field is user modifiable.
    • - -
    • Sleigh: (hidden by default) indicates whether or not the location has a customized - Sleigh configuration. This is only relevant for emulation.
    • +
    • Sleigh - indicates whether or not the location has a customized Sleigh configuration. + This is only relevant for emulation.

    Breakpoint Actions

    @@ -170,44 +163,45 @@ "help/topics/DebuggerBreakpointMarkerPlugin/DebuggerBreakpointMarkerPlugin.html">Breakpoint Marker Actions in the listings.

    -

    +

    Enable

    This action is available when one or more breakpoints or locations are selected. It enables each selected breakpoint. For any breakpoint that is already enabled, no action is taken.

    -

    +

    Enable All Breakpoints

    This action is always available. It enables every breakpoint. For any breakpoint that is already enabled, no action is taken.

    -

    +

    Disable

    This action is available when one or more breakpoints or locations are selected. It disables each selected breakpoint. For any breakpoint that is already disabled, no action is taken.

    -

    - Disable All Breakpoints

    +

    Disable All Breakpoints

    This action is always available. It disables every breakpoint. For any breakpoint that is already disabled, no action is taken.

    Make Breakpoints Effective

    + "icon.debugger.breakpoint.make.effective"> Make Breakpoints Effective

    This action is available whenever there are mapped breakpoints with 0 locations, i.e., it corresponds to a target location where the breakpoint is still missing. It places such breakpoints where possible. This action is also offered as a resolution in the console. It appears in the log any time this action is available.

    -

    Clear

    +

    + Clear

    This action is available when one or more breakpoints or locations are selected. It clears (deletes) each selected breakpoint.

    -

    +

    Clear All Breakpoints

    This action is always available. Use with caution! It deletes every @@ -335,14 +329,14 @@ emu_skip_decoded();

    For organizing breakpoints the manager provides the following actions:

    -

    Filter to +

    Filter to Current Trace

    This toggle is always available. It filters the bottom table to those locations in the current trace only. Additionally, the "Locations" column of the top table will only count those in the current trace.

    -

    Filter to +

    Filter to Breakpoint Selection

    This action is always available. It filters the bottom table to those locations belonging to diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerBreakpointsPlugin/images/DebuggerBreakpointsPlugin.png b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerBreakpointsPlugin/images/DebuggerBreakpointsPlugin.png index 46fcfafe1e0e62509d43b009bf5d00b121c7827e..4188c674e017d986b3e5192fc4b4af1e45d66981 100644 GIT binary patch literal 28715 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 E2RyT9`v3p{ 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 index a01c5b64af..70f0a05958 100644 --- a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerConsolePlugin/DebuggerConsolePlugin.html +++ b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerConsolePlugin/DebuggerConsolePlugin.html @@ -13,31 +13,26 @@

    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. 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.

    +

    The console logs messages from Ghidra related to the debugger. This no longer includes + messages sent to the application log, but only messages that plug-ins deliberately deliver to + this console. 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. Some messages communicate progress of a background + task. These may have a progress bar, and the associated message may change over time. These + entries may offer a cancel action.

    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.

    + we anticipate a command-line input in the future, which we would like to place at the + bottom.

    Table Columns

    @@ -55,8 +50,7 @@

    Actions

    -

    Not considering extension actions from other plugins, the console provides the - following:

    +

    Not considering actions for "actionable" messages, the console provides the following:

    Clear

    @@ -68,7 +62,7 @@

    Cancel

    -

    Some experimental features may display progress entries in the log for background tasks they - run. This action is displayed in the Actions column and will cancel the task.

    +

    For a tasks displaying a progress message in the console, this action will cancel the + task.

    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 index fb80f866687571e59809ae9cddca9d84cd895586..da192195c2e512f8be73c1d7db4e49c71def9736 100644 GIT binary patch literal 18571 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 KT-G@yGywo{Jru71 literal 17075 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 z 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 diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerControlPlugin/DebuggerControlPlugin.html b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerControlPlugin/DebuggerControlPlugin.html index 05ebc6adf4..6e4c3283c2 100644 --- a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerControlPlugin/DebuggerControlPlugin.html +++ b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerControlPlugin/DebuggerControlPlugin.html @@ -31,32 +31,32 @@ are: