diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValue.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValue.java index 61dbf11050..b0248e6a5b 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValue.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValue.java @@ -147,6 +147,11 @@ public class DBTraceObjectValue implements TraceObjectValue { this.wrapped = wrapped; } + @Override + public String toString() { + return wrapped.toString(); + } + void setWrapped(TraceObjectValueStorage wrapped) { this.wrapped = wrapped; if (wrapped instanceof DBTraceObjectValueData data) { diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueBehind.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueBehind.java index 19596f24e6..0882cece6f 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueBehind.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueBehind.java @@ -43,6 +43,12 @@ public class DBTraceObjectValueBehind implements TraceObjectValueStorage { this.wrapper = new DBTraceObjectValue(manager, this); } + @Override + public String toString() { + return "<%s parent=%s entryKey=%s lifespan=%s value=%s>".formatted( + getClass().getSimpleName(), parent, entryKey, lifespan, value); + } + @Override public String getEntryKey() { return entryKey; diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueWriteBehindCache.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueWriteBehindCache.java index 57387f52d3..7437dd65b5 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueWriteBehindCache.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/target/DBTraceObjectValueWriteBehindCache.java @@ -222,18 +222,17 @@ class DBTraceObjectValueWriteBehindCache { public Stream streamCanonicalParents(DBTraceObject child, Lifespan lifespan) { TraceObjectKeyPath path = child.getCanonicalPath(); - if (path.isRoot()) { + TraceObjectKeyPath parentPath = path.parent(); + if (parentPath == null) { // child is the root + return Stream.of(); + } + DBTraceObject parent = manager.getObjectByCanonicalPath(parentPath); + if (parent == null) { + // Not inserted yet, or someone deleted the parent object return Stream.of(); } String entryKey = path.key(); - // TODO: Better indexing? - return cachedValues.values() - .stream() - .flatMap(v -> v.entrySet() - .stream() - .filter(e -> entryKey.equals(e.getKey())) - .map(e -> e.getValue())) - .flatMap(v -> streamSub(v, lifespan, true)); + return streamValues(parent, entryKey, lifespan, true); } public Stream streamValues(DBTraceObject parent, Lifespan lifespan) { 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 723e5e049b..6f30014ee3 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 @@ -108,7 +108,6 @@ public class GdbMethodsTest extends AbstractGdbTraceRmiTest { file bash ghidra trace start %s - ghidra trace tx-open "Fake" 'ghidra trace create-obj Breakpoints' starti""" .formatted(INSTRUMENT_STOPPED)); RemoteMethod refreshBreakpoints = conn.getMethod("refresh_breakpoints");