GP-5494: Fix byte cache and increase number of cached pages (memory viewer).

This commit is contained in:
Dan
2025-04-15 18:22:42 +00:00
parent f00de10f31
commit e4024bc8cf
3 changed files with 117 additions and 35 deletions
@@ -17,6 +17,7 @@ package ghidra.app.plugin.core.debug.gui.memory;
import static ghidra.lifecycle.Unfinished.TODO;
import static org.junit.Assert.*;
import static org.junit.Assume.assumeFalse;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
@@ -62,13 +63,16 @@ import ghidra.program.model.lang.RegisterValue;
import ghidra.program.util.ProgramLocation;
import ghidra.trace.database.ToyDBTraceBuilder;
import ghidra.trace.database.memory.DBTraceMemoryManager;
import ghidra.trace.database.memory.DBTraceMemorySpace;
import ghidra.trace.database.stack.DBTraceStackManager;
import ghidra.trace.database.time.DBTraceTimeManager;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.*;
import ghidra.trace.model.modules.TraceModule;
import ghidra.trace.model.stack.TraceStack;
import ghidra.trace.model.target.TraceObject;
import ghidra.trace.model.thread.TraceThread;
import ghidra.util.SystemUtilities;
@Category(NightlyCategory.class)
public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebuggerIntegrationTest {
@@ -1184,4 +1188,33 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
rmiCx.withdrawTarget(tool, tb.trace);
}
@Test
public void testPerformanceManuallyWithManyManySnaps() throws Exception {
assumeFalse(SystemUtilities.isInTestingBatchMode());
createAndOpenTrace();
// LATER (GP-5594): 100_000 without checkStateMapIntegrity will crash.
final long snapCount = 100_000;
try (Transaction tx = tb.startTransaction()) {
tb.trace.getMemoryManager()
.addRegion("Processes[1].Memory[exe:.text]", Lifespan.nowOn(0L),
tb.range(0x55550000, 0x5555ffff), TraceMemoryFlag.READ,
TraceMemoryFlag.EXECUTE);
DBTraceTimeManager time = tb.trace.getTimeManager();
DBTraceMemorySpace space = tb.trace.getMemoryManager()
.getForSpace(tb.host.getAddressFactory().getDefaultAddressSpace(), true);
for (int i = 0; i < snapCount; i++) {
time.getSnapshot(i, true);
space.putBytes(i, tb.addr(0x55550000 + (i & 0xffff)), tb.buf(i & 0xff));
if (i % 1000 == 0) {
space.checkStateMapIntegrity();
}
}
}
traceManager.activateTrace(tb.trace);
traceManager.activateSnap(snapCount - 1);
Thread.sleep(1); // breakpoint here
}
}