diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/commands.py b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/commands.py
index 3d5ca98918..ae0dcad242 100644
--- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/commands.py
+++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/commands.py
@@ -1074,10 +1074,10 @@ def put_single_breakpoint(bp, ibobj, nproc: int, ikeys: List[str]) -> None:
if bp.GetType()[0] == DbgEng.DEBUG_BREAKPOINT_DATA:
width, prot = bp.GetDataParameters()
width = str(width)
- prot = {4: 'HW_EXECUTE', 2: 'READ', 1: 'WRITE'}[prot]
+ prot = {4: 'X', 2: 'R', 1: 'W'}[prot]
else:
width = ' '
- prot = 'SW_EXECUTE'
+ prot = 'x'
if address is not None: # Implies execution break
base, addr = mapper.map(nproc, address)
diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py
index c14668f920..376db6d4c5 100644
--- a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py
+++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py
@@ -1103,22 +1103,22 @@ def put_single_breakpoint(b: gdb.Breakpoint, ibobj: TraceObject,
brkobj.set_value('Enabled', b.enabled)
if b.type == gdb.BP_BREAKPOINT:
brkobj.set_value('Expression', b.location)
- brkobj.set_value('Kinds', 'SW_EXECUTE')
+ brkobj.set_value('Kinds', 'x')
elif b.type == gdb.BP_HARDWARE_BREAKPOINT:
brkobj.set_value('Expression', b.location)
- brkobj.set_value('Kinds', 'HW_EXECUTE')
+ brkobj.set_value('Kinds', 'X')
elif b.type == gdb.BP_WATCHPOINT:
brkobj.set_value('Expression', b.expression)
- brkobj.set_value('Kinds', 'WRITE')
+ brkobj.set_value('Kinds', 'W')
elif b.type == gdb.BP_HARDWARE_WATCHPOINT:
brkobj.set_value('Expression', b.expression)
- brkobj.set_value('Kinds', 'WRITE')
+ brkobj.set_value('Kinds', 'W')
elif b.type == gdb.BP_READ_WATCHPOINT:
brkobj.set_value('Expression', b.expression)
- brkobj.set_value('Kinds', 'READ')
+ brkobj.set_value('Kinds', 'R')
elif b.type == gdb.BP_ACCESS_WATCHPOINT:
brkobj.set_value('Expression', b.expression)
- brkobj.set_value('Kinds', 'READ,WRITE')
+ brkobj.set_value('Kinds', 'RW')
else:
brkobj.set_value('Expression', '(unknown)')
brkobj.set_value('Kinds', '')
diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py
index 49868e3930..9b8dbd5faf 100644
--- a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py
+++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py
@@ -1536,10 +1536,10 @@ def put_single_breakpoint(b: lldb.SBBreakpoint, proc: lldb.SBProcess) -> None:
bpt_obj = trace.create_object(bpt_path)
if b.IsHardware():
bpt_obj.set_value('Expression', util.get_description(b))
- bpt_obj.set_value('Kinds', 'HW_EXECUTE')
+ bpt_obj.set_value('Kinds', 'X')
else:
bpt_obj.set_value('Expression', util.get_description(b))
- bpt_obj.set_value('Kinds', 'SW_EXECUTE')
+ bpt_obj.set_value('Kinds', 'x')
cmdList = lldb.SBStringList()
if b.GetCommandLineCommands(cmdList):
list = []
@@ -1580,11 +1580,11 @@ def put_single_watchpoint(w: lldb.SBWatchpoint, proc: lldb.SBProcess) -> None:
wpt_obj = trace.create_object(wpt_path)
desc = util.get_description(w, level=0)
wpt_obj.set_value('Expression', desc)
- wpt_obj.set_value('Kinds', 'WRITE')
+ wpt_obj.set_value('Kinds', 'W')
if "type = r" in desc:
- wpt_obj.set_value('Kinds', 'READ')
+ wpt_obj.set_value('Kinds', 'R')
if "type = rw" in desc:
- wpt_obj.set_value('Kinds', 'READ,WRITE')
+ wpt_obj.set_value('Kinds', 'RW')
base, addr = mapper.map(proc, w.GetWatchAddress())
if base != addr.space:
trace.create_overlay_space(base, addr.space)
diff --git a/Ghidra/Debug/Debugger-agent-x64dbg/src/main/py/src/ghidraxdbg/commands.py b/Ghidra/Debug/Debugger-agent-x64dbg/src/main/py/src/ghidraxdbg/commands.py
index 441909881f..51e82b542d 100644
--- a/Ghidra/Debug/Debugger-agent-x64dbg/src/main/py/src/ghidraxdbg/commands.py
+++ b/Ghidra/Debug/Debugger-agent-x64dbg/src/main/py/src/ghidraxdbg/commands.py
@@ -967,12 +967,12 @@ def put_single_breakpoint(bp, bpath, nproc: int, ikeys: List[int]) -> None:
brkobj.set_value('Range', addr.extend(bp.hwSize))
brkobj.set_value('HitCount', bp.hitCount)
if bp.type == BreakpointType.BpNormal:
- brkobj.set_value('Kinds', 'SW_EXECUTE')
+ brkobj.set_value('Kinds', 'x')
if bp.type == BreakpointType.BpHardware:
- prot = {0: 'READ', 1: 'WRITE', 2: 'HW_EXECUTE'}[bp.typeEx]
+ prot = {0: 'R', 1: 'W', 2: 'X'}[bp.typeEx]
brkobj.set_value('Kinds', prot)
if bp.type == BreakpointType.BpMemory:
- prot = {0: 'READ', 1: 'WRITE', 2: 'HW_EXECUTE', 3: 'ACCESS'}[bp.typeEx]
+ prot = {0: 'R', 1: 'W', 2: 'X', 3: 'RW'}[bp.typeEx]
brkobj.set_value('Kinds', prot)
brkobj.insert()
diff --git a/Ghidra/Debug/Debugger-api/src/main/java/ghidra/debug/flatapi/FlatDebuggerAPI.java b/Ghidra/Debug/Debugger-api/src/main/java/ghidra/debug/flatapi/FlatDebuggerAPI.java
index 40b0183c2d..e4f1e4e8e8 100644
--- a/Ghidra/Debug/Debugger-api/src/main/java/ghidra/debug/flatapi/FlatDebuggerAPI.java
+++ b/Ghidra/Debug/Debugger-api/src/main/java/ghidra/debug/flatapi/FlatDebuggerAPI.java
@@ -45,6 +45,7 @@ import ghidra.program.model.lang.*;
import ghidra.program.model.listing.Program;
import ghidra.program.util.ProgramLocation;
import ghidra.trace.model.*;
+import ghidra.trace.model.breakpoint.TraceBreakpointKind.CommonSet;
import ghidra.trace.model.breakpoint.TraceBreakpointKind.TraceBreakpointKindSet;
import ghidra.trace.model.guest.TracePlatform;
import ghidra.trace.model.memory.TraceMemoryOperations;
@@ -2174,7 +2175,7 @@ public interface FlatDebuggerAPI {
*/
default Set 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 @@ -52,9 +51,8 @@
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.
+It is possible you have an old or misconfigured Debugger tool. 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
@@ -70,23 +68,6 @@
The following should be disabled:
- -It is possible to leave both sets of plugins enabled, but this is by all means NOT - recommended.
-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 13b8fd7d2e..7160e660ae 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 @@ -88,11 +88,10 @@This menu is available on the dynamic listing when the target supports at least one breakpoint kind. This menu is always available on the static listing. It displays set - 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. - Selecting one of the actions will display a prompt allowing adjustments to the parameters - before issuing the command.
+ breakpoint actions for each kind supported by the target. In the static listing, all kinds are + available, regardless of target support; however, only those kinds supported by the target will + be included in the resulting command. Selecting one of the actions will display a prompt + allowing adjustments to the parameters before issuing the command.
@@ -106,9 +105,9 @@
to 1 — often the required value. For access breakpoints, this defaults to the size of
the data at the cursor.
- This action is available whenever at least one trace is open and active. It prompts for a + destination file in the current project and saves the current trace to it.
+This action is available whenever at least one trace is open and active. It closes the diff --git a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerWatchesPlugin/DebuggerWatchesPlugin.html b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerWatchesPlugin/DebuggerWatchesPlugin.html index b5906deb9d..6b060f478e 100644 --- a/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerWatchesPlugin/DebuggerWatchesPlugin.html +++ b/Ghidra/Debug/Debugger/src/main/help/help/topics/DebuggerWatchesPlugin/DebuggerWatchesPlugin.html @@ -72,6 +72,8 @@
+ * For backwards compatibility, this can also accept a comma-separated list of kind names.
+ * The backwards compatibility will eventually be removed. In the meantime, no string can
+ * exceed 3 flags, as this has to be able to distinguish which encoding to decode, and the
+ * shortest name is {@link #READ}.
*
* @param encoded the encoded list
* @param strict true to report unrecognized kinds, false to ignore
* @return the decoded set
*/
public static TraceBreakpointKindSet decode(String encoded, boolean strict) {
- Set
* The list is always encoded in order of the declaration of kinds (enum order).
*
* @param col the set
@@ -86,14 +113,9 @@ public enum TraceBreakpointKind {
*/
public static String encode(CollectionINT3 on x86. There are also hardware execution breakpoints
-indicated by “HW_EXECUTE,” and access breakpoints indicated by “HW_READ”
-and/or “HW_WRITE”. NOTE: GDB would call access
-breakpoints watchpoints. An advantage to software breakpoints
-is that you can have a practically unlimited number of them. Some
-disadvantages are they can be detected easily, and they are limited to
-execution breakpoints.x. That is, they are implemented
+by patching the target’s memory with a special instruction that traps
+execution — INT3 on x86. There are also hardware execution
+breakpoints indicated by (upper case) X and access
+breakpoints indicated by R and/or W.
+NOTE: GDB would call access breakpoints
+watchpoints. An advantage to software breakpoints is that you
+can have a practically unlimited number of them. Some disadvantages are
+they can be detected easily, and they are limited to execution
+breakpoints.