From cb16d8dd9e70363d28f08b8d706f13f5a325efc3 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Mon, 12 Sep 2022 09:01:55 -0400 Subject: [PATCH] GP-1585: Change TargetBreakpointLocation to range, not address,length --- .../DbgModelTargetBreakpointLocation.java | 4 +- .../iface2/DbgModelTargetBreakpointSpec.java | 35 +- .../DbgModelTargetBreakpointSpecImpl.java | 26 +- .../dbgmodel/model/impl/dbgmodel_schema.xml | 1122 ++++++++--------- .../GdbModelTargetBreakpointLocation.java | 38 +- .../LldbModelTargetBreakpointLocation.java | 4 +- ...LldbModelTargetBreakpointLocationImpl.java | 43 +- .../LldbModelTargetBreakpointSpecImpl.java | 15 +- .../gui/objects/DebuggerObjectsProvider.java | 20 +- .../breakpoint/LogicalBreakpointInternal.java | 13 +- .../model/DefaultBreakpointRecorder.java | 27 +- .../service/model/TraceObjectManager.java | 10 +- .../interfaces/ManagedBreakpointRecorder.java | 7 +- .../dbg/target/TargetBreakpointLocation.java | 49 +- .../dbg/model/TestDebuggerObjectModel.java | 4 +- .../dbg/model/TestTargetBreakpoint.java | 15 +- .../model/TestTargetBreakpointContainer.java | 3 +- .../AbstractDebuggerModelBreakpointsTest.java | 8 +- .../ghidra/dbg/model/test_schema.xml | 791 ++++++------ .../breakpoint/DBTraceBreakpointManager.java | 7 +- .../DBTraceObjectBreakpointLocation.java | 12 +- .../trace/database/target/DBTraceObject.java | 46 +- .../TraceObjectBreakpointLocation.java | 5 +- 23 files changed, 1143 insertions(+), 1161 deletions(-) diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointLocation.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointLocation.java index cfeeff35bc..449bd14cab 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointLocation.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointLocation.java @@ -16,12 +16,12 @@ package agent.dbgeng.model.iface2; import ghidra.dbg.target.TargetBreakpointLocation; -import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressRange; public interface DbgModelTargetBreakpointLocation extends DbgModelTargetObject, TargetBreakpointLocation { @Override - public Address getAddress(); + public AddressRange getRange(); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointSpec.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointSpec.java index f623f8498f..a941038397 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointSpec.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointSpec.java @@ -24,6 +24,7 @@ import agent.dbgeng.model.iface1.DbgModelTargetBptHelper; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetBreakpointSpecContainer.TargetBreakpointKindSet; import ghidra.program.model.address.*; +import ghidra.util.Msg; public interface DbgModelTargetBreakpointSpec extends // DbgModelTargetObject, // @@ -99,12 +100,13 @@ public interface DbgModelTargetBreakpointSpec extends // setBreakpointId(idstr); //String uidstr = unique.getCachedAttribute(VALUE_ATTRIBUTE_NAME).toString(); String enstr = enabled.getCachedAttribute(VALUE_ATTRIBUTE_NAME).toString(); + Address address = null; try { - Address address = space.getAddress(addstr); - map.put(ADDRESS_ATTRIBUTE_NAME, address); + address = space.getAddress(addstr); + //map.put(ADDRESS_ATTRIBUTE_NAME, address); } catch (AddressFormatException e) { - e.printStackTrace(); + Msg.error(this, "Could not parse breakpoint address", e); } map.put(SPEC_ATTRIBUTE_NAME, this); map.put(EXPRESSION_ATTRIBUTE_NAME, addstr); @@ -113,7 +115,15 @@ public interface DbgModelTargetBreakpointSpec extends // map.put(ENABLED_ATTRIBUTE_NAME, enstr.equals("-1")); setEnabled(enstr.equals("-1"), "Refreshed"); int size = getBreakpointInfo().getSize(); - map.put(LENGTH_ATTRIBUTE_NAME, size); + //map.put(LENGTH_ATTRIBUTE_NAME, size); + if (address != null) { + try { + map.put(RANGE_ATTRIBUTE_NAME, new AddressRangeImpl(address, size)); + } + catch (AddressOverflowException e) { + Msg.error(this, "Address overflow in breakpoint range", e); + } + } String oldval = (String) getCachedAttribute(DISPLAY_ATTRIBUTE_NAME); String display = "[" + idstr + "] " + addstr; @@ -125,9 +135,13 @@ public interface DbgModelTargetBreakpointSpec extends // private long orZero(Long l) { if (l == null) { - return 0; + Msg.warn(this, "Breakpoint had null offset. Defaulting to ram:00000000"); } - return l; + return l == null ? 0 : l; + } + + private int orOne(Integer i) { + return i == null ? 1 : i; } public default Address doGetAddress() { @@ -135,6 +149,14 @@ public interface DbgModelTargetBreakpointSpec extends // return getModel().getAddress("ram", orZero(info.getOffset())); } + public default AddressRange doGetRange() { + DbgBreakpointInfo info = getBreakpointInfo(); + AddressSpace ram = getModel().getAddressSpace("ram"); + Address min = ram.getAddress(orZero(info.getOffset())); + Address max = min.add(orOne(info.getSize()) - 1); + return new AddressRangeImpl(min, max); + } + public default void updateInfo(DbgBreakpointInfo oldInfo, DbgBreakpointInfo newInfo, String reason) { synchronized (this) { @@ -147,6 +169,7 @@ public interface DbgModelTargetBreakpointSpec extends // /** * Update the enabled field * + *

* This does not actually toggle the breakpoint. It just updates the field and calls the proper * listeners. To actually toggle the breakpoint, use {@link #toggle(boolean)} instead, which if * effective, should eventually cause this method to be called. diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointSpecImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointSpecImpl.java index 1914d5af14..8ae2c8ac9f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointSpecImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointSpecImpl.java @@ -67,20 +67,18 @@ public class DbgModelTargetBreakpointSpecImpl extends DbgModelTargetObjectImpl protected boolean enabled; public void changeAttributeSet(String reason) { - this.changeAttributes(List.of(), List.of(), Map.of( // - DISPLAY_ATTRIBUTE_NAME, "[" + info.getNumber() + "] " + info.getExpression(), // - ADDRESS_ATTRIBUTE_NAME, doGetAddress(), // - LENGTH_ATTRIBUTE_NAME, info.getSize(), // - SPEC_ATTRIBUTE_NAME, this, // - EXPRESSION_ATTRIBUTE_NAME, info.getExpression(), // - KINDS_ATTRIBUTE_NAME, getKinds() // - ), reason); - this.changeAttributes(List.of(), List.of(), Map.of( // - BPT_TYPE_ATTRIBUTE_NAME, info.getType().name(), // - BPT_DISP_ATTRIBUTE_NAME, info.getDisp().name(), // - BPT_PENDING_ATTRIBUTE_NAME, info.getPending(), // - BPT_TIMES_ATTRIBUTE_NAME, info.getTimes() // - ), reason); + this.changeAttributes(List.of(), List.of(), Map.of( + DISPLAY_ATTRIBUTE_NAME, "[" + info.getNumber() + "] " + info.getExpression(), + RANGE_ATTRIBUTE_NAME, doGetRange(), + SPEC_ATTRIBUTE_NAME, this, + EXPRESSION_ATTRIBUTE_NAME, info.getExpression(), + KINDS_ATTRIBUTE_NAME, getKinds(), + + BPT_TYPE_ATTRIBUTE_NAME, info.getType().name(), + BPT_DISP_ATTRIBUTE_NAME, info.getDisp().name(), + BPT_PENDING_ATTRIBUTE_NAME, info.getPending(), + BPT_TIMES_ATTRIBUTE_NAME, info.getTimes()), + reason); } private final ListenerSet actions = diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/resources/agent/dbgmodel/model/impl/dbgmodel_schema.xml b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/resources/agent/dbgmodel/model/impl/dbgmodel_schema.xml index f569593d26..f2015b2110 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/resources/agent/dbgmodel/model/impl/dbgmodel_schema.xml +++ b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/resources/agent/dbgmodel/model/impl/dbgmodel_schema.xml @@ -1,550 +1,549 @@ - + - - - - - - - - - - + + + + + + + + + + diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointLocation.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointLocation.java index e6e1bd7e31..0a2949c17b 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointLocation.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointLocation.java @@ -28,7 +28,7 @@ import ghidra.dbg.target.TargetBreakpointLocation; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; -import ghidra.program.model.address.Address; +import ghidra.program.model.address.*; import ghidra.util.Msg; @TargetObjectSchemaInfo( @@ -55,8 +55,7 @@ public class GdbModelTargetBreakpointLocation protected final GdbModelImpl impl; protected final GdbBreakpointLocation loc; - protected Address address; - protected Integer length; + protected AddressRange range; protected String display; public GdbModelTargetBreakpointLocation(GdbModelTargetBreakpointSpec spec, @@ -67,8 +66,8 @@ public class GdbModelTargetBreakpointLocation impl.addModelObject(loc, this); if (!spec.info.getType().isWatchpoint()) { - this.address = doGetAddress(); - this.length = 1; + Address addr = impl.space.getAddress(loc.addrAsLong()); + this.range = new AddressRangeImpl(addr, addr); doChangeAttributes("Initialized"); } } @@ -76,8 +75,7 @@ public class GdbModelTargetBreakpointLocation protected void doChangeAttributes(String reason) { this.changeAttributes(List.of(), Map.of( SPEC_ATTRIBUTE_NAME, parent, - ADDRESS_ATTRIBUTE_NAME, address, - LENGTH_ATTRIBUTE_NAME, length, + RANGE_ATTRIBUTE_NAME, range, DISPLAY_ATTRIBUTE_NAME, display = computeDisplay()), reason); placeLocations(); @@ -112,29 +110,26 @@ public class GdbModelTargetBreakpointLocation throw new AssertionError("Unexpected result count: " + result); } - address = impl.space.getAddress(vals.get(0)); - length = vals.get(1).intValue(); + range = makeRange(impl.space.getAddress(vals.get(0)), vals.get(1).intValue()); doChangeAttributes("Initialized"); }).exceptionally(ex -> { Msg.warn(this, "Could not evaluated breakpoint location and/or size: " + ex); - address = impl.space.getAddress(0); - length = 1; + Address addr = impl.space.getAddress(0); + range = new AddressRangeImpl(addr, addr); doChangeAttributes("Defaulted for eval/parse error"); return null; }); } protected String computeDisplay() { - return String.format("%d.%d %s", parent.info.getNumber(), loc.getSub(), address); + return String.format("%d.%d %s", parent.info.getNumber(), loc.getSub(), + range.getMinAddress()); } - protected Address doGetAddress() { - return impl.space.getAddress(loc.addrAsLong()); - } - - @Override - public Integer getLength() { - return length; + // Avoid the checked exception on new AddressRangeImpl(min, length) + protected static AddressRange makeRange(Address min, int length) { + Address max = min.add(length - 1); + return new AddressRangeImpl(min, max); } protected void placeLocations() { @@ -161,6 +156,11 @@ public class GdbModelTargetBreakpointLocation } } + @Override + public AddressRange getRange() { + return range; + } + @Override public GdbModelTargetBreakpointSpec getSpecification() { return parent; diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/iface2/LldbModelTargetBreakpointLocation.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/iface2/LldbModelTargetBreakpointLocation.java index a98e183315..9a41e4155d 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/iface2/LldbModelTargetBreakpointLocation.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/iface2/LldbModelTargetBreakpointLocation.java @@ -16,13 +16,13 @@ package agent.lldb.model.iface2; import ghidra.dbg.target.TargetBreakpointLocation; -import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressRange; public interface LldbModelTargetBreakpointLocation extends LldbModelTargetObject, TargetBreakpointLocation { @Override - public Address getAddress(); + AddressRange getRange(); public int getLocationId(); } diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointLocationImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointLocationImpl.java index 8969f48389..a39e72a69c 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointLocationImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointLocationImpl.java @@ -25,7 +25,7 @@ import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.TargetAttributeType; import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.dbg.util.PathUtils; -import ghidra.program.model.address.Address; +import ghidra.program.model.address.*; @TargetObjectSchemaInfo( name = "BreakpointLocation", @@ -46,11 +46,9 @@ public class LldbModelTargetBreakpointLocationImpl extends LldbModelTargetObject protected LldbModelTargetAbstractXpointSpec spec; protected SBBreakpointLocation loc; - protected Address address; - protected Integer length; + protected AddressRange range; protected String display; - public LldbModelTargetBreakpointLocationImpl(LldbModelTargetAbstractXpointSpec spec, SBBreakpointLocation loc) { super(spec.getModel(), spec, keyLocation(loc), loc, "BreakpointLocation"); @@ -60,21 +58,28 @@ public class LldbModelTargetBreakpointLocationImpl extends LldbModelTargetObject doChangeAttributes("Initialization"); } + // TODO: A separate class for Impl wrapping SBWatchpoint? public LldbModelTargetBreakpointLocationImpl(LldbModelTargetAbstractXpointSpec spec, SBWatchpoint wpt) { super(spec.getModel(), spec, keyLocation(wpt), wpt, "BreakpointLocation"); this.loc = null; - address = getModel().getAddress("ram", wpt.GetWatchAddress().longValue()); + Address address = getModel().getAddress("ram", wpt.GetWatchAddress().longValue()); + long length = wpt.GetWatchSize(); this.changeAttributes(List.of(), Map.of( SPEC_ATTRIBUTE_NAME, parent, - ADDRESS_ATTRIBUTE_NAME, address, - LENGTH_ATTRIBUTE_NAME, length = (int) wpt.GetWatchSize(), + RANGE_ATTRIBUTE_NAME, range = makeRange(address, length), DISPLAY_ATTRIBUTE_NAME, display = getDescription(1)), "Initialization"); placeLocations(); } + protected static AddressRange makeRange(Address min, long length) { + Address max = min.add(length - 1); + return new AddressRangeImpl(min, max); + } + + @Override public String getDescription(int level) { Object modelObject = getModelObject(); SBStream stream = new SBStream(); @@ -91,12 +96,10 @@ public class LldbModelTargetBreakpointLocationImpl extends LldbModelTargetObject } protected void doChangeAttributes(String reason) { - address = getModel().getAddress("ram", loc.GetLoadAddress().longValue()); - length = 1; + Address address = getModel().getAddress("ram", loc.GetLoadAddress().longValue()); this.changeAttributes(List.of(), Map.of( SPEC_ATTRIBUTE_NAME, parent, - ADDRESS_ATTRIBUTE_NAME, address, - LENGTH_ATTRIBUTE_NAME, length, + RANGE_ATTRIBUTE_NAME, range = new AddressRangeImpl(address, address), DISPLAY_ATTRIBUTE_NAME, display = getDescription(1)), reason); placeLocations(); @@ -104,7 +107,8 @@ public class LldbModelTargetBreakpointLocationImpl extends LldbModelTargetObject protected void placeLocations() { LldbModelTargetSession parentSession = getParentSession(); - Map cachedElements = parentSession.getProcesses().getCachedElements(); + Map cachedElements = + parentSession.getProcesses().getCachedElements(); for (TargetObject obj : cachedElements.values()) { if (obj instanceof LldbModelTargetProcess) { LldbModelTargetProcessImpl process = (LldbModelTargetProcessImpl) obj; @@ -123,21 +127,18 @@ public class LldbModelTargetBreakpointLocationImpl extends LldbModelTargetObject TargetObject modelObject = getModel().getModelObject(getManager().getCurrentProcess()); if (modelObject instanceof LldbModelTargetProcess) { LldbModelTargetProcess targetProcess = (LldbModelTargetProcess) modelObject; - LldbModelTargetBreakpointLocationContainer locs = (LldbModelTargetBreakpointLocationContainer) targetProcess.getCachedAttribute("Breakpoints"); + LldbModelTargetBreakpointLocationContainer locs = + (LldbModelTargetBreakpointLocationContainer) targetProcess + .getCachedAttribute("Breakpoints"); locs.removeBreakpointLocation(this); } } - - @Override - public Integer getLength() { - return length; - } @Override - public Address getAddress() { - return address; + public AddressRange getRange() { + return range; } - + @Override public int getLocationId() { return loc.GetID(); diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointSpecImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointSpecImpl.java index 9ff4607982..59e1fa3682 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointSpecImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetBreakpointSpecImpl.java @@ -56,6 +56,7 @@ public class LldbModelTargetBreakpointSpecImpl extends LldbModelTargetAbstractXp super(breakpoints, info, "BreakpointSpec"); } + @Override public String getDescription(int level) { SBStream stream = new SBStream(); SBBreakpoint bpt = (SBBreakpoint) getModelObject(); @@ -63,16 +64,17 @@ public class LldbModelTargetBreakpointSpecImpl extends LldbModelTargetAbstractXp return stream.GetData(); } + @Override protected TargetBreakpointKindSet computeKinds(Object from) { if (from instanceof SBBreakpoint) { SBBreakpoint bpt = (SBBreakpoint) from; - return bpt.IsHardware() ? - TargetBreakpointKindSet.of(TargetBreakpointKind.HW_EXECUTE) : - TargetBreakpointKindSet.of(TargetBreakpointKind.SW_EXECUTE); + return bpt.IsHardware() ? TargetBreakpointKindSet.of(TargetBreakpointKind.HW_EXECUTE) + : TargetBreakpointKindSet.of(TargetBreakpointKind.SW_EXECUTE); } return TargetBreakpointKindSet.of(); } + @Override public void updateInfo(Object info, String reason) { setModelObject(info); updateAttributesFromInfo(reason); @@ -91,13 +93,14 @@ public class LldbModelTargetBreakpointSpecImpl extends LldbModelTargetAbstractXp }); } + @Override public void updateAttributesFromInfo(String reason) { SBBreakpoint bpt = (SBBreakpoint) getModelObject(); String description = getDescription(1); String[] split = description.split(","); if (split[1].contains("regex")) { expression = split[1]; - expression = expression.substring(expression.indexOf("'")+1); + expression = expression.substring(expression.indexOf("'") + 1); expression = expression.substring(0, expression.indexOf("'")); } this.changeAttributes(List.of(), List.of(), Map.of( // @@ -118,15 +121,17 @@ public class LldbModelTargetBreakpointSpecImpl extends LldbModelTargetAbstractXp LldbModelTargetBreakpointLocationImpl loc = (LldbModelTargetBreakpointLocationImpl) elements[0]; this.changeAttributes(List.of(), List.of(), Map.of( // - TargetBreakpointLocation.ADDRESS_ATTRIBUTE_NAME, loc.address // + TargetBreakpointLocation.RANGE_ATTRIBUTE_NAME, loc.range // ), reason); } } + @Override public ListenerSet getActions() { return actions; } + @Override public LldbModelTargetBreakpointLocation findLocation(Object obj) { if (!(obj instanceof BigInteger)) { return null; diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java index 3d879552da..41319d864f 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java @@ -70,7 +70,8 @@ import ghidra.framework.options.annotation.*; import ghidra.framework.plugintool.*; import ghidra.framework.plugintool.annotation.AutoConfigStateField; import ghidra.framework.plugintool.annotation.AutoServiceConsumed; -import ghidra.program.model.address.*; +import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressRange; import ghidra.program.model.listing.Program; import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramSelection; @@ -2097,9 +2098,9 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter if (listingService == null || listingService == null) { return; } + // TODO: Could probably inspect schema for any attribute of type Address[Range], or String if (value == null) { - value = - object.getCachedAttribute(TargetBreakpointLocation.ADDRESS_ATTRIBUTE_NAME); + value = object.getCachedAttribute(TargetObject.PREFIX_INVISIBLE + "address"); } if (value == null) { value = object.getCachedAttribute(TargetObject.PREFIX_INVISIBLE + "range"); @@ -2112,19 +2113,16 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter } Address addr = null; - if (value instanceof Address) { - addr = (Address) value; + if (value instanceof Address a) { + addr = a; } - else if (value instanceof AddressRangeImpl) { - AddressRangeImpl range = (AddressRangeImpl) value; + else if (value instanceof AddressRange range) { addr = range.getMinAddress(); } - else if (value instanceof Long) { - Long lval = (Long) value; + else if (value instanceof Long lval) { addr = object.getModel().getAddress("ram", lval); } - else if (value instanceof String) { - String sval = (String) value; + else if (value instanceof String sval) { addr = stringToAddress(object, addr, sval); } if (addr != null) { diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LogicalBreakpointInternal.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LogicalBreakpointInternal.java index 64900ff352..9984273f3c 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LogicalBreakpointInternal.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LogicalBreakpointInternal.java @@ -23,8 +23,7 @@ import ghidra.app.services.LogicalBreakpoint; import ghidra.app.services.TraceRecorder; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; -import ghidra.program.model.address.Address; -import ghidra.program.model.address.AddressSet; +import ghidra.program.model.address.*; import ghidra.program.model.listing.*; import ghidra.program.util.ProgramLocation; import ghidra.trace.model.Trace; @@ -394,10 +393,11 @@ public interface LogicalBreakpointInternal extends LogicalBreakpoint { Set tKinds = TraceRecorder.traceToTargetBreakpointKinds(kinds); Address targetAddr = computeTargetAddress(); for (TargetBreakpointLocation loc : recorder.collectBreakpoints(null)) { - if (!targetAddr.equals(loc.getAddress())) { + AddressRange range = loc.getRange(); + if (!targetAddr.equals(range.getMinAddress())) { continue; } - if (length != loc.getLength().longValue()) { + if (length != range.getLength()) { continue; } TargetBreakpointSpec spec = loc.getSpecification(); @@ -413,10 +413,11 @@ public interface LogicalBreakpointInternal extends LogicalBreakpoint { Set tKinds = TraceRecorder.traceToTargetBreakpointKinds(kinds); Address targetAddr = computeTargetAddress(); for (TargetBreakpointLocation loc : recorder.collectBreakpoints(null)) { - if (!targetAddr.equals(loc.getAddress())) { + AddressRange range = loc.getRange(); + if (!targetAddr.equals(range.getMinAddress())) { continue; } - if (length != loc.getLength().longValue()) { + if (length != range.getLength()) { continue; } TargetBreakpointSpec spec = loc.getSpecification(); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultBreakpointRecorder.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultBreakpointRecorder.java index 38da4dd81c..c3909d86c7 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultBreakpointRecorder.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultBreakpointRecorder.java @@ -31,18 +31,6 @@ import ghidra.util.exception.DuplicateNameException; public class DefaultBreakpointRecorder implements ManagedBreakpointRecorder { - public static AddressRange range(Address min, Integer length) { - if (length == null) { - length = 1; - } - try { - return new AddressRangeImpl(min, length); - } - catch (AddressOverflowException e) { - throw new AssertionError(e); - } - } - protected static String nameBreakpoint(TargetBreakpointLocation bpt) { if (bpt instanceof TargetBreakpointSpec) { return bpt.getIndex(); @@ -93,8 +81,7 @@ public class DefaultBreakpointRecorder implements ManagedBreakpointRecorder { } String path = PathUtils.toString(loc.getPath()); String name = nameBreakpoint(loc); - Address traceAddr = recorder.getMemoryMapper().targetToTrace(loc.getAddress()); - AddressRange traceRange = range(traceAddr, loc.getLength()); + AddressRange traceRange = recorder.getMemoryMapper().targetToTrace(loc.getRange()); try { TargetBreakpointSpec spec = loc.getSpecification(); boolean enabled = spec.isEnabled(); @@ -151,11 +138,9 @@ public class DefaultBreakpointRecorder implements ManagedBreakpointRecorder { }, path); } - protected void doBreakpointLocationChanged(long snap, int length, Address traceAddr, - String path) { + protected void doBreakpointLocationChanged(long snap, AddressRange traceRng, String path) { for (TraceBreakpoint traceBpt : breakpointManager.getBreakpointsByPath(path)) { - AddressRange range = range(traceAddr, length); - if (traceBpt.getRange().equals(range)) { + if (traceBpt.getRange().equals(traceRng)) { continue; // Nothing to change } // TODO: Verify all other attributes match? @@ -167,7 +152,7 @@ public class DefaultBreakpointRecorder implements ManagedBreakpointRecorder { traceBpt.setClearedSnap(snap - 1); } TraceBreakpoint newtraceBpt = - breakpointManager.placeBreakpoint(path, snap, range, + breakpointManager.placeBreakpoint(path, snap, traceRng, traceBpt.getThreads(), traceBpt.getKinds(), traceBpt.isEnabled(snap), traceBpt.getComment()); // placeBreakpoint resets the name - maybe pass name in? @@ -182,11 +167,11 @@ public class DefaultBreakpointRecorder implements ManagedBreakpointRecorder { } @Override - public void breakpointLocationChanged(int length, Address traceAddr, String path) + public void breakpointLocationChanged(AddressRange traceRng, String path) throws AssertionError { long snap = recorder.getSnap(); recorder.parTx.execute("Breakpoint length changed", () -> { - doBreakpointLocationChanged(snap, length, traceAddr, path); + doBreakpointLocationChanged(snap, traceRng, path); }, path); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/TraceObjectManager.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/TraceObjectManager.java index 2218f01f6f..4ea30c6071 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/TraceObjectManager.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/TraceObjectManager.java @@ -30,7 +30,7 @@ import ghidra.async.AsyncLazyMap; import ghidra.dbg.target.*; import ghidra.dbg.util.PathUtils; import ghidra.dbg.util.PathUtils.PathComparator; -import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressRange; import ghidra.trace.model.breakpoint.TraceBreakpoint; import ghidra.trace.model.breakpoint.TraceBreakpointKind; import ghidra.trace.model.memory.TraceMemoryRegion; @@ -496,12 +496,10 @@ public class TraceObjectManager { public void attributesChangedBreakpointLocation(TargetObject obj, Map added) { TargetBreakpointLocation loc = (TargetBreakpointLocation) obj; - if (added.containsKey(TargetBreakpointLocation.LENGTH_ATTRIBUTE_NAME) || - added.containsKey(TargetBreakpointLocation.ADDRESS_ATTRIBUTE_NAME)) { - Address traceAddr = recorder.getMemoryMapper().targetToTrace(loc.getAddress()); + if (added.containsKey(TargetBreakpointLocation.RANGE_ATTRIBUTE_NAME)) { + AddressRange traceRng = recorder.getMemoryMapper().targetToTrace(loc.getRange()); String path = loc.getJoinedPath("."); - int length = loc.getLengthOrDefault(1); - recorder.breakpointRecorder.breakpointLocationChanged(length, traceAddr, path); + recorder.breakpointRecorder.breakpointLocationChanged(traceRng, path); } } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/interfaces/ManagedBreakpointRecorder.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/interfaces/ManagedBreakpointRecorder.java index 6c772fdcf0..4bf6cf69d0 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/interfaces/ManagedBreakpointRecorder.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/interfaces/ManagedBreakpointRecorder.java @@ -19,7 +19,7 @@ import java.util.Collection; import java.util.Set; import ghidra.dbg.target.*; -import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressRange; import ghidra.trace.model.breakpoint.TraceBreakpoint; import ghidra.trace.model.breakpoint.TraceBreakpointKind; import ghidra.trace.model.thread.TraceThread; @@ -41,11 +41,10 @@ public interface ManagedBreakpointRecorder { /** * The range of a breakpoint location has changed * - * @param length the new length - * @param traceAddr the address of the location in the trace + * @param traceRng the address range of the location in the trace * @param path the dot-separated path of the breakpoint location in the model */ - void breakpointLocationChanged(int length, Address traceAddr, String path); + void breakpointLocationChanged(AddressRange traceRng, String path); /** * A breakpoint specification has changed (typically, toggled) diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointLocation.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointLocation.java index b82eb1bdab..c1224ab0b2 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointLocation.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointLocation.java @@ -18,6 +18,7 @@ package ghidra.dbg.target; import ghidra.dbg.DebuggerTargetObjectIface; import ghidra.dbg.target.schema.TargetAttributeType; import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressRange; /** * The location of a breakpoint @@ -31,20 +32,33 @@ import ghidra.program.model.address.Address; @DebuggerTargetObjectIface("BreakpointLocation") public interface TargetBreakpointLocation extends TargetObject { - String ADDRESS_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "address"; - // NOTE: address and length are treated separately (not using AddressRange) - // On GDB, e.g., the length may not be offered immediately. - String LENGTH_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "length"; + String RANGE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "range"; String SPEC_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "spec"; + /** + * The range covered by this location + * + *

+ * Typically, watchpoints (or access breakpoints) have a length, so the range would cover all + * addresses in the variable being watched. Execution breakpoints likely have a "length" of 1, + * meaning they cover only the address of the trap. + * + * @return the address range of the location + */ + @TargetAttributeType(name = RANGE_ATTRIBUTE_NAME, hidden = true) + public default AddressRange getRange() { + return getTypedAttributeNowByName(RANGE_ATTRIBUTE_NAME, AddressRange.class, null); + } + /** * The minimum address of this location * * @return the address + * @deprecated use {@link #getRange()} instead */ - @TargetAttributeType(name = ADDRESS_ATTRIBUTE_NAME, required = true, hidden = true) + @Deprecated(forRemoval = true, since = "10.2") public default Address getAddress() { - return getTypedAttributeNowByName(ADDRESS_ATTRIBUTE_NAME, Address.class, null); + return getRange().getMinAddress(); } /** @@ -53,18 +67,26 @@ public interface TargetBreakpointLocation extends TargetObject { *

* In most cases, where the length is not available, a length of 1 should be presumed. * - *

- * TODO: Should this be Long? - * * @return the length, or {@code null} if not known + * @deprecated use {@link #getRange()} instead */ - @TargetAttributeType(name = LENGTH_ATTRIBUTE_NAME, hidden = true) + @Deprecated(forRemoval = true, since = "10.2") public default Integer getLength() { - return getTypedAttributeNowByName(LENGTH_ATTRIBUTE_NAME, Integer.class, null); + AddressRange range = getRange(); + return range == null ? null : (int) range.getLength(); } + /** + * Get the length, defaulting to a given fallback, usually 1 + * + * @param fallback the fallback value + * @return the length, or the fallback + * @deprecated use {@link #getRange()} instead + */ + @Deprecated(forRemoval = true, since = "10.2") public default int getLengthOrDefault(int fallback) { - return getTypedAttributeNowByName(LENGTH_ATTRIBUTE_NAME, Integer.class, fallback); + Integer length = getLength(); + return length == null ? 1 : length; } /** @@ -72,7 +94,8 @@ public interface TargetBreakpointLocation extends TargetObject { * *

* If the debugger does not separate specifications from actual breakpoints, then the - * "specification" is this breakpoint. Otherwise, the specification is the parent. + * "specification" is this breakpoint. Otherwise, the specification is identified by an + * attribute, usually a link. * * @return the reference to the specification */ diff --git a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestDebuggerObjectModel.java b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestDebuggerObjectModel.java index deeaaf2c05..43479a5430 100644 --- a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestDebuggerObjectModel.java +++ b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestDebuggerObjectModel.java @@ -92,8 +92,8 @@ public class TestDebuggerObjectModel extends EmptyDebuggerObjectModel { } protected TestTargetBreakpoint newTestTargetBreakpoint(TestTargetBreakpointContainer container, - int num, Address address, int length, Set kinds) { - return new TestTargetBreakpoint(container, num, address, length, kinds); + int num, AddressRange range, Set kinds) { + return new TestTargetBreakpoint(container, num, range, kinds); } protected TestTargetMemory newTestTargetMemory(TestTargetProcess process, AddressSpace space) { diff --git a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestTargetBreakpoint.java b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestTargetBreakpoint.java index 9632fa1baa..4d15f853d1 100644 --- a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestTargetBreakpoint.java +++ b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestTargetBreakpoint.java @@ -21,24 +21,23 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetBreakpointSpecContainer.TargetBreakpointKindSet; import ghidra.dbg.util.PathUtils; -import ghidra.program.model.address.Address; +import ghidra.program.model.address.*; public class TestTargetBreakpoint extends DefaultTestTargetObject implements TargetBreakpointSpec, TargetBreakpointLocation, TargetDeletable { - public TestTargetBreakpoint(TestTargetBreakpointContainer parent, int num, Address address, - int length, Set kinds) { + public TestTargetBreakpoint(TestTargetBreakpointContainer parent, int num, AddressRange range, + Set kinds) { super(parent, PathUtils.makeKey(PathUtils.makeIndex(num)), "Breakpoint"); changeAttributes(List.of(), Map.of( SPEC_ATTRIBUTE_NAME, this, - ADDRESS_ATTRIBUTE_NAME, address, + RANGE_ATTRIBUTE_NAME, range, ENABLED_ATTRIBUTE_NAME, true, - EXPRESSION_ATTRIBUTE_NAME, address.toString(), - KINDS_ATTRIBUTE_NAME, TargetBreakpointKindSet.copyOf(kinds), - LENGTH_ATTRIBUTE_NAME, length // - ), "Initialized"); + EXPRESSION_ATTRIBUTE_NAME, range.getMinAddress().toString(), + KINDS_ATTRIBUTE_NAME, TargetBreakpointKindSet.copyOf(kinds)), + "Initialized"); } @Override diff --git a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestTargetBreakpointContainer.java b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestTargetBreakpointContainer.java index 6234660e7c..71b299ede5 100644 --- a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestTargetBreakpointContainer.java +++ b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/model/TestTargetBreakpointContainer.java @@ -57,8 +57,7 @@ public class TestTargetBreakpointContainer public CompletableFuture placeBreakpoint(AddressRange range, Set kinds) { TestTargetBreakpoint bpt = - getModel().newTestTargetBreakpoint(this, counter.getAndIncrement(), - range.getMinAddress(), (int) range.getLength(), kinds); + getModel().newTestTargetBreakpoint(this, counter.getAndIncrement(), range, kinds); changeElements(List.of(), List.of(bpt), "Breakpoint Added"); return getModel().future(null); } diff --git a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/test/AbstractDebuggerModelBreakpointsTest.java b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/test/AbstractDebuggerModelBreakpointsTest.java index 4a52f1e704..056d57062a 100644 --- a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/test/AbstractDebuggerModelBreakpointsTest.java +++ b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/test/AbstractDebuggerModelBreakpointsTest.java @@ -16,7 +16,8 @@ package ghidra.dbg.test; import static org.junit.Assert.*; -import static org.junit.Assume.*; +import static org.junit.Assume.assumeNotNull; +import static org.junit.Assume.assumeTrue; import java.util.*; import java.util.Map.Entry; @@ -31,7 +32,6 @@ import ghidra.dbg.target.TargetBreakpointSpecContainer.TargetBreakpointKindSet; import ghidra.dbg.target.schema.TargetObjectSchema; import ghidra.dbg.util.DebuggerCallbackReorderer; import ghidra.program.model.address.AddressRange; -import ghidra.program.model.address.AddressRangeImpl; import ghidra.util.Msg; /** @@ -141,10 +141,10 @@ public abstract class AbstractDebuggerModelBreakpointsTest extends AbstractDebug if (spec == null) { // Mid construction? continue; } - if (l.getAddress() == null || l.getLength() == null) { + AddressRange actualRange = l.getRange(); + if (actualRange == null) { continue; } - AddressRange actualRange = new AddressRangeImpl(l.getAddress(), l.getLength()); if (!actualRange.contains(range.getMinAddress()) || !actualRange.contains(range.getMaxAddress())) { continue; diff --git a/Ghidra/Debug/Framework-Debugging/src/test/resources/ghidra/dbg/model/test_schema.xml b/Ghidra/Debug/Framework-Debugging/src/test/resources/ghidra/dbg/model/test_schema.xml index 9b44aa0920..9f586e8c5e 100644 --- a/Ghidra/Debug/Framework-Debugging/src/test/resources/ghidra/dbg/model/test_schema.xml +++ b/Ghidra/Debug/Framework-Debugging/src/test/resources/ghidra/dbg/model/test_schema.xml @@ -1,398 +1,397 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/breakpoint/DBTraceBreakpointManager.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/breakpoint/DBTraceBreakpointManager.java index 5a7e8e6c43..d7a505799e 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/breakpoint/DBTraceBreakpointManager.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/breakpoint/DBTraceBreakpointManager.java @@ -24,6 +24,7 @@ import java.util.concurrent.locks.ReadWriteLock; import com.google.common.collect.Range; import db.DBHandle; +import ghidra.dbg.target.TargetBreakpointLocation; import ghidra.program.model.address.*; import ghidra.program.model.lang.Language; import ghidra.trace.database.DBTrace; @@ -142,7 +143,8 @@ public class DBTraceBreakpointManager public Collection getBreakpointsAt(long snap, Address address) { if (trace.getObjectManager().hasSchema()) { return trace.getObjectManager() - .getObjectsContaining(snap, address, TraceObjectBreakpointLocation.KEY_RANGE, + .getObjectsContaining(snap, address, + TargetBreakpointLocation.RANGE_ATTRIBUTE_NAME, TraceObjectBreakpointLocation.class); } return delegateRead(address.getAddressSpace(), m -> m.getBreakpointsAt(snap, address), @@ -154,7 +156,8 @@ public class DBTraceBreakpointManager AddressRange range) { if (trace.getObjectManager().hasSchema()) { return trace.getObjectManager() - .getObjectsIntersecting(span, range, TraceObjectBreakpointLocation.KEY_RANGE, + .getObjectsIntersecting(span, range, + TargetBreakpointLocation.RANGE_ATTRIBUTE_NAME, TraceObjectBreakpointLocation.class); } return delegateRead(range.getAddressSpace(), m -> m.getBreakpointsIntersecting(span, range), diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/breakpoint/DBTraceObjectBreakpointLocation.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/breakpoint/DBTraceObjectBreakpointLocation.java index fbfde599a5..4f9b83dae1 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/breakpoint/DBTraceObjectBreakpointLocation.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/breakpoint/DBTraceObjectBreakpointLocation.java @@ -44,7 +44,7 @@ public class DBTraceObjectBreakpointLocation protected class BreakpointChangeTranslator extends Translator { protected BreakpointChangeTranslator(DBTraceObject object, TraceBreakpoint iface) { - super(KEY_RANGE, object, iface); + super(TargetBreakpointLocation.RANGE_ATTRIBUTE_NAME, object, iface); } @Override @@ -64,7 +64,7 @@ public class DBTraceObjectBreakpointLocation @Override protected boolean appliesToKey(String key) { - return KEY_RANGE.equals(key) || + return TargetBreakpointLocation.RANGE_ATTRIBUTE_NAME.equals(key) || TargetObject.DISPLAY_ATTRIBUTE_NAME.equals(key) || TargetBreakpointSpec.ENABLED_ATTRIBUTE_NAME.equals(key) || KEY_COMMENT.equals(key); @@ -122,7 +122,7 @@ public class DBTraceObjectBreakpointLocation @Override public void setRange(Range lifespan, AddressRange range) { try (LockHold hold = object.getTrace().lockWrite()) { - object.setValue(lifespan, KEY_RANGE, range); + object.setValue(lifespan, TargetBreakpointLocation.RANGE_ATTRIBUTE_NAME, range); this.range = range; } } @@ -133,8 +133,8 @@ public class DBTraceObjectBreakpointLocation if (object.getLife().isEmpty()) { return range; } - return range = TraceObjectInterfaceUtils.getValue(object, getPlacedSnap(), KEY_RANGE, - AddressRange.class, range); + return range = TraceObjectInterfaceUtils.getValue(object, getPlacedSnap(), + TargetBreakpointLocation.RANGE_ATTRIBUTE_NAME, AddressRange.class, range); } } @@ -325,7 +325,7 @@ public class DBTraceObjectBreakpointLocation } public TraceAddressSpace getTraceAddressSpace() { - return spaceForValue(computeMinSnap(), KEY_RANGE); + return spaceForValue(computeMinSnap(), TargetBreakpointLocation.RANGE_ATTRIBUTE_NAME); } @Override diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObject.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObject.java index ffa3f42f13..5c6918d36b 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObject.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObject.java @@ -27,11 +27,10 @@ import com.google.common.collect.*; import db.DBRecord; import db.StringField; -import ghidra.dbg.target.TargetBreakpointLocation; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.TargetObjectSchema; import ghidra.dbg.util.*; -import ghidra.program.model.address.*; +import ghidra.program.model.address.AddressSpace; import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTraceUtils; import ghidra.trace.database.breakpoint.DBTraceObjectBreakpointLocation; @@ -728,47 +727,6 @@ public class DBTraceObject extends DBAnnotatedObject implements TraceObject { return manager.doCreateValue(lifespan, this, key, value); } - // HACK: Because breakpoint uses address,length instead of range. FIXME! - protected void applyBreakpointRangeHack(Range lifespan, String key, Object value, - ConflictResolution resolution) { - /** - * NOTE: This should only be happening in Target/TraceBreakpointLocation, but I suppose - * anything using this scheme should be hacked. - */ - Address address; - int length; - if (key == TargetBreakpointLocation.ADDRESS_ATTRIBUTE_NAME && - value instanceof Address) { - address = (Address) value; - InternalTraceObjectValue lengthObj = getValue(DBTraceUtils.lowerEndpoint(lifespan), - TargetBreakpointLocation.LENGTH_ATTRIBUTE_NAME); - if (lengthObj == null || !(lengthObj.getValue() instanceof Integer)) { - return; - } - length = (Integer) lengthObj.getValue(); - } - else if (key == TargetBreakpointLocation.LENGTH_ATTRIBUTE_NAME && - value instanceof Integer) { - length = (Integer) value; - InternalTraceObjectValue addressObj = getValue(DBTraceUtils.lowerEndpoint(lifespan), - TargetBreakpointLocation.ADDRESS_ATTRIBUTE_NAME); - if (addressObj == null || !(addressObj.getValue() instanceof Address)) { - return; - } - address = (Address) addressObj.getValue(); - } - else { - return; - } - try { - setValue(lifespan, TraceObjectBreakpointLocation.KEY_RANGE, - new AddressRangeImpl(address, length), resolution); - } - catch (AddressOverflowException e) { - Msg.warn(this, "Could not set range: " + e); - } - } - @Override public InternalTraceObjectValue setValue(Range lifespan, String key, Object value, ConflictResolution resolution) { @@ -812,8 +770,6 @@ public class DBTraceObject extends DBAnnotatedObject implements TraceObject { }; InternalTraceObjectValue result = setter.set(lifespan, value); - // NB. This hack will cause more value events. good. - applyBreakpointRangeHack(lifespan, key, value, resolution); DBTraceObject child = setter.canonicalLifeChanged; if (child != null) { child.emitEvents( diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/breakpoint/TraceObjectBreakpointLocation.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/breakpoint/TraceObjectBreakpointLocation.java index f16167fbd4..26c1684338 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/breakpoint/TraceObjectBreakpointLocation.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/breakpoint/TraceObjectBreakpointLocation.java @@ -31,14 +31,11 @@ import ghidra.util.exception.DuplicateNameException; shortName = "breakpoint location", fixedKeys = { TargetObject.DISPLAY_ATTRIBUTE_NAME, - TargetBreakpointLocation.ADDRESS_ATTRIBUTE_NAME, - TargetBreakpointLocation.LENGTH_ATTRIBUTE_NAME, + TargetBreakpointLocation.RANGE_ATTRIBUTE_NAME, TraceObjectBreakpointLocation.KEY_COMMENT, - TraceObjectBreakpointLocation.KEY_RANGE, }) public interface TraceObjectBreakpointLocation extends TraceBreakpoint, TraceObjectInterface { String KEY_COMMENT = "_comment"; - String KEY_RANGE = "_range"; // Duplicates address,length TraceObjectBreakpointSpec getSpecification();