diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java index 9934e98b8c..aa1beb54ef 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java @@ -1038,7 +1038,7 @@ public class DebuggerTraceManagerServicePlugin extends Plugin } if (current.getTrace() != newTrace) { /** - * The snap needs to match upon re-activating this trace, lset it look like the user + * The snap needs to match upon re-activating this trace, lest it look like the user * intentionally navigated to the past. That may cause the control mode to switch * off of "Target." */ 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 e4ce97c0bd..7bab3581a8 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 @@ -150,7 +150,7 @@ public class DBTraceObject extends DBAnnotatedObject implements TraceObject { } }; private CachedLifespanValues cachedLifespanValues = null; - private MutableLifeSet cachedLife = null; + private volatile MutableLifeSet cachedLife = null; public DBTraceObject(DBTraceObjectManager manager, DBCachedObjectStore store, DBRecord record) { @@ -223,11 +223,11 @@ public class DBTraceObject extends DBAnnotatedObject implements TraceObject { } } MutableLifeSet result = new DefaultLifeSet(); - // NOTE: connected ranges should already be coalesced - // No need to apply discreet domain getCanonicalParents(Lifespan.ALL).forEach(v -> result.add(v.getLifespan())); cachedLife = result; - return result; + synchronized (result) { + return DefaultLifeSet.copyOf(result); + } } } diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueRStarTree.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueRStarTree.java index b6acb4af3a..301a566ff7 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueRStarTree.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueRStarTree.java @@ -23,6 +23,8 @@ import java.util.function.Predicate; import db.DBRecord; import ghidra.program.model.address.AddressFactory; import ghidra.program.model.address.AddressSetView; +import ghidra.trace.database.target.ValueSpace.AddressDimension; +import ghidra.trace.database.target.ValueSpace.EntryKeyDimension; import ghidra.trace.model.Lifespan; import ghidra.util.database.*; import ghidra.util.database.spatial.AbstractConstraintsTree; @@ -58,7 +60,14 @@ public class DBTraceObjectValueRStarTree extends AbstractHyperRStarTree< // public AddressSetView getAddressSetView(Lifespan at, Predicate predicate) { - return new DBTraceObjectValueMapAddressSetView(factory, lock, this, predicate); + return new DBTraceObjectValueMapAddressSetView(factory, lock, + this.reduce(TraceObjectValueQuery.intersecting( + EntryKeyDimension.INSTANCE.absoluteMin(), + EntryKeyDimension.INSTANCE.absoluteMax(), + at, + AddressDimension.INSTANCE.absoluteMin(), + AddressDimension.INSTANCE.absoluteMax())), + predicate); } } diff --git a/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/database/memory/AbstractDBTraceMemoryManagerRegionsTest.java b/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/database/memory/AbstractDBTraceMemoryManagerRegionsTest.java index ab9f6f06cb..4534d56479 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/database/memory/AbstractDBTraceMemoryManagerRegionsTest.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/database/memory/AbstractDBTraceMemoryManagerRegionsTest.java @@ -15,7 +15,8 @@ */ package ghidra.trace.database.memory; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import java.io.IOException; import java.util.Set; @@ -23,6 +24,7 @@ import java.util.Set; import org.junit.*; import db.Transaction; +import ghidra.program.model.address.AddressSet; import ghidra.program.model.lang.LanguageID; import ghidra.test.AbstractGhidraHeadlessIntegrationTest; import ghidra.trace.database.ToyDBTraceBuilder; @@ -151,8 +153,9 @@ public abstract class AbstractDBTraceMemoryManagerRegionsTest Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE)); } - assertEquals(b.set(b.range(0x1000, 0x1fff)), memory.getRegionsAddressSet(0)); - assertEquals(b.set(), memory.getRegionsAddressSet(-1)); + assertEquals(b.set(b.range(0x1000, 0x1fff)), + new AddressSet(memory.getRegionsAddressSet(0))); + assertEquals(b.set(), new AddressSet(memory.getRegionsAddressSet(-1))); } @Test @@ -164,8 +167,9 @@ public abstract class AbstractDBTraceMemoryManagerRegionsTest Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE)); } - assertEquals(b.set(b.range(0x1000, 0x1fff)), memory.getRegionsAddressSetWith(0, r -> true)); - assertEquals(b.set(), memory.getRegionsAddressSetWith(-1, r -> true)); - assertEquals(b.set(), memory.getRegionsAddressSetWith(0, r -> false)); + assertEquals(b.set(b.range(0x1000, 0x1fff)), + new AddressSet(memory.getRegionsAddressSetWith(0, r -> true))); + assertEquals(b.set(), new AddressSet(memory.getRegionsAddressSetWith(-1, r -> true))); + assertEquals(b.set(), new AddressSet(memory.getRegionsAddressSetWith(0, r -> false))); } } diff --git a/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbMethodsTest.java b/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbMethodsTest.java index 9fa38dfdc1..bdbe1b2bd3 100644 --- a/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbMethodsTest.java +++ b/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbMethodsTest.java @@ -1274,8 +1274,7 @@ public class GdbMethodsTest extends AbstractGdbTraceRmiTest { tb = new ToyDBTraceBuilder((Trace) mdo.get()); waitStopped(); long snap = 0; - long pcOff = - Integer.decode(conn.executeCapture("print/x $pc").split("=")[1].strip()); + long pcOff = Long.decode(conn.executeCapture("print/x $pc").split("=")[1].strip()); TraceObject inf1 = Objects.requireNonNull(tb.obj("Inferiors[1]")); readMem.invoke(Map.ofEntries( @@ -1306,8 +1305,7 @@ public class GdbMethodsTest extends AbstractGdbTraceRmiTest { try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); waitStopped(); - long pcOff = - Integer.decode(conn.executeCapture("print/x $pc").split("=")[1].strip()); + long pcOff = Long.decode(conn.executeCapture("print/x $pc").split("=")[1].strip()); TraceObject inf1 = Objects.requireNonNull(tb.obj("Inferiors[1]")); writeMem.invoke(Map.ofEntries( diff --git a/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbCommandsTest.java b/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbCommandsTest.java index af98e3291e..dc05dbeb86 100644 --- a/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbCommandsTest.java +++ b/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbCommandsTest.java @@ -887,6 +887,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { assertEquals( """ Parent Key Span Value Type + Test.Objects[1] vaddr [0,+inf) ram:deadbeef ADDRESS Test.Objects[1] vbool [0,+inf) True BOOL Test.Objects[1] vboolarr [0,+inf) [True, False] BOOL_ARR Test.Objects[1] vbyte [0,+inf) 1 BYTE @@ -900,8 +901,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { Test.Objects[1] vobj [0,+inf) Test.Objects[1] OBJECT Test.Objects[1] vshort [0,+inf) 2 SHORT Test.Objects[1] vshortarr [0,+inf) [1, 2, 3] SHORT_ARR - Test.Objects[1] vstring [0,+inf) '"Hello"' STRING - Test.Objects[1] vaddr [0,+inf) ram:deadbeef ADDRESS""" + Test.Objects[1] vstring [0,+inf) '"Hello"' STRING""" .replaceAll(" ", "") .replaceAll("\n", ""), extractOutSection(out, "---GetValues---").replaceAll(" ", "").replaceAll("\n", "")); diff --git a/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbMethodsTest.java b/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbMethodsTest.java index 1601c47609..8da5dbc91c 100644 --- a/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbMethodsTest.java +++ b/Ghidra/Test/DebuggerIntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbMethodsTest.java @@ -188,6 +188,7 @@ public class LldbMethodsTest extends AbstractLldbTraceRmiTest { .getValuePaths(Lifespan.at(0), PathPredicates.parse("Processes[].Watchpoints[]")) .map(p -> p.getLastEntry()) + .sorted(Comparator.comparing(TraceObjectValue::getEntryKey)) .toList(); assertEquals(3, procWatchLocVals.size()); AddressRange rangeMain0 =