GP-1543: Replace Range<Long> with Lifespan, ULongSpan, KeySpan,

FieldSpan
This commit is contained in:
Dan 2022-10-20 09:38:55 -04:00
parent d0b55e1d33
commit 776413921f
349 changed files with 6102 additions and 4225 deletions

View file

@ -18,7 +18,7 @@ package agent.dbgeng.manager;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import com.google.common.collect.RangeSet; import generic.ULongSpan.ULongSpanSet;
public interface DbgMemoryOperations { public interface DbgMemoryOperations {
@ -30,7 +30,7 @@ public interface DbgMemoryOperations {
* @param len the length of data to read * @param len the length of data to read
* @return a future which completes giving the ranges successfully read * @return a future which completes giving the ranges successfully read
*/ */
CompletableFuture<RangeSet<Long>> readMemory(long addr, ByteBuffer buf, int len); CompletableFuture<ULongSpanSet> readMemory(long addr, ByteBuffer buf, int len);
/** /**
* Read memory * Read memory
@ -41,7 +41,7 @@ public interface DbgMemoryOperations {
* @param buf the buffer to read into * @param buf the buffer to read into
* @return a future which completes giving the ranges successfully read * @return a future which completes giving the ranges successfully read
*/ */
default CompletableFuture<RangeSet<Long>> readMemory(long addr, ByteBuffer buf) { default CompletableFuture<ULongSpanSet> readMemory(long addr, ByteBuffer buf) {
return readMemory(addr, buf, buf.remaining()); return readMemory(addr, buf, buf.remaining());
} }

View file

@ -0,0 +1,50 @@
/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package agent.dbgeng.manager.cmd;
import java.nio.ByteBuffer;
import agent.dbgeng.manager.impl.DbgManagerImpl;
import generic.ULongSpan;
import generic.ULongSpan.ULongSpanSet;
public abstract class AbstractDbgReadCommand extends AbstractDbgCommand<ULongSpanSet> {
private final long addr;
private final ByteBuffer buf;
private final int len;
private int readLen;
protected AbstractDbgReadCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, int len) {
super(manager);
this.addr = addr;
this.buf = buf;
this.len = len;
}
protected abstract int doRead(long addr, ByteBuffer buf, int len);
@Override
public void invoke() {
readLen = doRead(addr, buf, len);
}
@Override
public ULongSpanSet complete(DbgPendingCommand<?> pending) {
return ULongSpanSet.of(ULongSpan.extent(addr, readLen));
}
}

View file

@ -17,46 +17,29 @@ package agent.dbgeng.manager.cmd;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import com.google.common.collect.*;
import agent.dbgeng.manager.DbgThread; import agent.dbgeng.manager.DbgThread;
import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.manager.impl.DbgManagerImpl;
/** /**
* Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)} * Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)}
*/ */
public class DbgReadBusDataCommand extends AbstractDbgCommand<RangeSet<Long>> { public class DbgReadBusDataCommand extends AbstractDbgReadCommand {
private final long addr;
private final ByteBuffer buf;
private final int len;
private final int busDataType; private final int busDataType;
private final int busNumber; private final int busNumber;
private final int slotNumber; private final int slotNumber;
private int readLen;
public DbgReadBusDataCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, int len, public DbgReadBusDataCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, int len,
int busDataType, int busNumber, int slotNumber) { int busDataType, int busNumber, int slotNumber) {
super(manager); super(manager, addr, buf, len);
this.addr = addr;
this.buf = buf;
this.len = len;
this.busDataType = busDataType; this.busDataType = busDataType;
this.busNumber = busNumber; this.busNumber = busNumber;
this.slotNumber = slotNumber; this.slotNumber = slotNumber;
} }
@Override @Override
public RangeSet<Long> complete(DbgPendingCommand<?> pending) { protected int doRead(long addr, ByteBuffer buf, int len) {
RangeSet<Long> rangeSet = TreeRangeSet.create(); return manager.getDataSpaces()
rangeSet.add(Range.closedOpen(addr, addr + readLen)); .readBusData(busDataType, busNumber, slotNumber, addr, buf, len);
return rangeSet;
}
@Override
public void invoke() {
readLen =
manager.getDataSpaces().readBusData(busDataType, busNumber, slotNumber, addr, buf, len);
} }
} }

View file

@ -17,41 +17,24 @@ package agent.dbgeng.manager.cmd;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import com.google.common.collect.*;
import agent.dbgeng.manager.DbgThread; import agent.dbgeng.manager.DbgThread;
import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.manager.impl.DbgManagerImpl;
/** /**
* Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)} * Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)}
*/ */
public class DbgReadControlCommand extends AbstractDbgCommand<RangeSet<Long>> { public class DbgReadControlCommand extends AbstractDbgReadCommand {
private final long addr; private final int processor;
private final ByteBuffer buf;
private final int len;
private int processor;
private int readLen;
public DbgReadControlCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, int len, public DbgReadControlCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, int len,
int processor) { int processor) {
super(manager); super(manager, addr, buf, len);
this.addr = addr;
this.buf = buf;
this.len = len;
this.processor = processor; this.processor = processor;
} }
@Override @Override
public RangeSet<Long> complete(DbgPendingCommand<?> pending) { protected int doRead(long addr, ByteBuffer buf, int len) {
RangeSet<Long> rangeSet = TreeRangeSet.create(); return manager.getDataSpaces().readControl(processor, addr, buf, len);
rangeSet.add(Range.closedOpen(addr, addr + readLen));
return rangeSet;
}
@Override
public void invoke() {
readLen = manager.getDataSpaces().readControl(processor, addr, buf, len);
} }
} }

View file

@ -17,38 +17,20 @@ package agent.dbgeng.manager.cmd;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import com.google.common.collect.*;
import agent.dbgeng.manager.DbgThread; import agent.dbgeng.manager.DbgThread;
import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.manager.impl.DbgManagerImpl;
/** /**
* Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)} * Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)}
*/ */
public class DbgReadDebuggerDataCommand extends AbstractDbgCommand<RangeSet<Long>> { public class DbgReadDebuggerDataCommand extends AbstractDbgReadCommand {
private final long addr;
private final ByteBuffer buf;
private final int len;
private int readLen;
public DbgReadDebuggerDataCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, int len) { public DbgReadDebuggerDataCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, int len) {
super(manager); super(manager, addr, buf, len);
this.addr = addr;
this.buf = buf;
this.len = len;
} }
@Override @Override
public RangeSet<Long> complete(DbgPendingCommand<?> pending) { protected int doRead(long addr, ByteBuffer buf, int len) {
RangeSet<Long> rangeSet = TreeRangeSet.create(); return manager.getDataSpaces().readDebuggerData((int) addr, buf, len);
rangeSet.add(Range.closedOpen(addr, addr + readLen));
return rangeSet;
}
@Override
public void invoke() {
readLen = manager.getDataSpaces().readDebuggerData((int) addr, buf, len);
} }
} }

View file

@ -17,46 +17,29 @@ package agent.dbgeng.manager.cmd;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import com.google.common.collect.*;
import agent.dbgeng.manager.DbgThread; import agent.dbgeng.manager.DbgThread;
import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.manager.impl.DbgManagerImpl;
/** /**
* Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)} * Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)}
*/ */
public class DbgReadIoCommand extends AbstractDbgCommand<RangeSet<Long>> { public class DbgReadIoCommand extends AbstractDbgReadCommand {
private final long addr;
private final ByteBuffer buf;
private final int len;
private final int interfaceType; private final int interfaceType;
private final int busNumber; private final int busNumber;
private final int addressSpace; private final int addressSpace;
private int readLen;
public DbgReadIoCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, int len, public DbgReadIoCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, int len,
int interfaceType, int busNumber, int addressSpace) { int interfaceType, int busNumber, int addressSpace) {
super(manager); super(manager, addr, buf, len);
this.addr = addr;
this.buf = buf;
this.len = len;
this.interfaceType = interfaceType; this.interfaceType = interfaceType;
this.busNumber = busNumber; this.busNumber = busNumber;
this.addressSpace = addressSpace; this.addressSpace = addressSpace;
} }
@Override @Override
public RangeSet<Long> complete(DbgPendingCommand<?> pending) { protected int doRead(long addr, ByteBuffer buf, int len) {
RangeSet<Long> rangeSet = TreeRangeSet.create(); return manager.getDataSpaces()
rangeSet.add(Range.closedOpen(addr, addr + readLen)); .readIo(interfaceType, busNumber, addressSpace, addr, buf, len);
return rangeSet;
}
@Override
public void invoke() {
readLen =
manager.getDataSpaces().readIo(interfaceType, busNumber, addressSpace, addr, buf, len);
} }
} }

View file

@ -17,40 +17,20 @@ package agent.dbgeng.manager.cmd;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import com.google.common.collect.*;
import agent.dbgeng.dbgeng.DebugDataSpaces;
import agent.dbgeng.manager.DbgThread; import agent.dbgeng.manager.DbgThread;
import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.manager.impl.DbgManagerImpl;
/** /**
* Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)} * Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)}
*/ */
public class DbgReadMemoryCommand extends AbstractDbgCommand<RangeSet<Long>> { public class DbgReadMemoryCommand extends AbstractDbgReadCommand {
private final long addr;
private final ByteBuffer buf;
private final int len;
private int readLen;
public DbgReadMemoryCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, int len) { public DbgReadMemoryCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, int len) {
super(manager); super(manager, addr, buf, len);
this.addr = addr;
this.buf = buf;
this.len = len;
} }
@Override @Override
public RangeSet<Long> complete(DbgPendingCommand<?> pending) { protected int doRead(long addr, ByteBuffer buf, int len) {
RangeSet<Long> rangeSet = TreeRangeSet.create(); return manager.getDataSpaces().readVirtual(addr, buf, len);
rangeSet.add(Range.closedOpen(addr, addr + readLen));
return rangeSet;
}
@Override
public void invoke() {
DebugDataSpaces dataSpaces = manager.getDataSpaces();
readLen = dataSpaces.readVirtual(addr, buf, len);
} }
} }

View file

@ -17,39 +17,21 @@ package agent.dbgeng.manager.cmd;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import com.google.common.collect.*;
import agent.dbgeng.manager.DbgThread; import agent.dbgeng.manager.DbgThread;
import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.manager.impl.DbgManagerImpl;
/** /**
* Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)} * Implementation of {@link DbgThread#readMemory(long, ByteBuffer, int)}
*/ */
public class DbgReadPhysicalMemoryCommand extends AbstractDbgCommand<RangeSet<Long>> { public class DbgReadPhysicalMemoryCommand extends AbstractDbgReadCommand {
private final long addr;
private final ByteBuffer buf;
private final int len;
private int readLen;
public DbgReadPhysicalMemoryCommand(DbgManagerImpl manager, long addr, ByteBuffer buf, public DbgReadPhysicalMemoryCommand(DbgManagerImpl manager, long addr, ByteBuffer buf,
int len) { int len) {
super(manager); super(manager, addr, buf, len);
this.addr = addr;
this.buf = buf;
this.len = len;
} }
@Override @Override
public RangeSet<Long> complete(DbgPendingCommand<?> pending) { protected int doRead(long addr, ByteBuffer buf, int len) {
RangeSet<Long> rangeSet = TreeRangeSet.create(); return manager.getDataSpaces().readPhysical(addr, buf, len);
rangeSet.add(Range.closedOpen(addr, addr + readLen));
return rangeSet;
}
@Override
public void invoke() {
readLen = manager.getDataSpaces().readPhysical(addr, buf, len);
} }
} }

View file

@ -15,7 +15,7 @@
*/ */
package agent.dbgeng.manager.impl; package agent.dbgeng.manager.impl;
import static ghidra.async.AsyncUtils.*; import static ghidra.async.AsyncUtils.sequence;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.*; import java.util.*;
@ -23,13 +23,12 @@ import java.util.concurrent.CompletableFuture;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.google.common.collect.RangeSet;
import agent.dbgeng.dbgeng.*; import agent.dbgeng.dbgeng.*;
import agent.dbgeng.dbgeng.DebugClient.DebugAttachFlags; import agent.dbgeng.dbgeng.DebugClient.DebugAttachFlags;
import agent.dbgeng.manager.*; import agent.dbgeng.manager.*;
import agent.dbgeng.manager.DbgManager.ExecSuffix; import agent.dbgeng.manager.DbgManager.ExecSuffix;
import agent.dbgeng.manager.cmd.*; import agent.dbgeng.manager.cmd.*;
import generic.ULongSpan.ULongSpanSet;
import ghidra.async.TypeSpec; import ghidra.async.TypeSpec;
import ghidra.comm.util.BitmaskSet; import ghidra.comm.util.BitmaskSet;
import ghidra.dbg.target.TargetAttachable; import ghidra.dbg.target.TargetAttachable;
@ -332,7 +331,7 @@ public class DbgProcessImpl implements DbgProcess {
} }
@Override @Override
public CompletableFuture<RangeSet<Long>> readMemory(long addr, ByteBuffer buf, int len) { public CompletableFuture<ULongSpanSet> readMemory(long addr, ByteBuffer buf, int len) {
// I can't imagine this working without a thread.... // I can't imagine this working without a thread....
return preferThread(t -> t.readMemory(addr, buf, len), return preferThread(t -> t.readMemory(addr, buf, len),
() -> manager.execute(new DbgReadMemoryCommand(manager, addr, buf, len))); () -> manager.execute(new DbgReadMemoryCommand(manager, addr, buf, len)));

View file

@ -20,8 +20,6 @@ import java.nio.ByteBuffer;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import com.google.common.collect.RangeSet;
import agent.dbgeng.dbgeng.DebugEventInformation; import agent.dbgeng.dbgeng.DebugEventInformation;
import agent.dbgeng.dbgeng.DebugRegisters.DebugRegisterDescription; import agent.dbgeng.dbgeng.DebugRegisters.DebugRegisterDescription;
import agent.dbgeng.dbgeng.DebugThreadId; import agent.dbgeng.dbgeng.DebugThreadId;
@ -32,6 +30,7 @@ import agent.dbgeng.manager.DbgManager.ExecSuffix;
import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo; import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
import agent.dbgeng.manager.breakpoint.DbgBreakpointType; import agent.dbgeng.manager.breakpoint.DbgBreakpointType;
import agent.dbgeng.manager.cmd.*; import agent.dbgeng.manager.cmd.*;
import generic.ULongSpan.ULongSpanSet;
import ghidra.async.AsyncLazyValue; import ghidra.async.AsyncLazyValue;
import ghidra.async.AsyncReference; import ghidra.async.AsyncReference;
import ghidra.util.Msg; import ghidra.util.Msg;
@ -176,7 +175,7 @@ public class DbgThreadImpl implements DbgThread {
} }
@Override @Override
public CompletableFuture<RangeSet<Long>> readMemory(long addr, ByteBuffer buf, int len) { public CompletableFuture<ULongSpanSet> readMemory(long addr, ByteBuffer buf, int len) {
return manager.execute(new DbgReadMemoryCommand(manager, addr, buf, len)); return manager.execute(new DbgReadMemoryCommand(manager, addr, buf, len));
} }

View file

@ -20,14 +20,13 @@ import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.google.common.collect.Range;
import com.google.common.collect.RangeSet;
import agent.dbgeng.manager.DbgModuleMemory; import agent.dbgeng.manager.DbgModuleMemory;
import agent.dbgeng.manager.cmd.*; import agent.dbgeng.manager.cmd.*;
import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.manager.impl.DbgManagerImpl;
import agent.dbgeng.manager.impl.DbgProcessImpl; import agent.dbgeng.manager.impl.DbgProcessImpl;
import agent.dbgeng.model.iface2.*; import agent.dbgeng.model.iface2.*;
import generic.ULongSpan;
import generic.ULongSpan.ULongSpanSet;
import ghidra.async.AsyncUtils; import ghidra.async.AsyncUtils;
import ghidra.dbg.error.DebuggerMemoryAccessException; import ghidra.dbg.error.DebuggerMemoryAccessException;
import ghidra.dbg.error.DebuggerModelAccessException; import ghidra.dbg.error.DebuggerModelAccessException;
@ -114,16 +113,16 @@ public class DbgModelTargetMemoryContainerImpl extends DbgModelTargetObjectImpl
}); });
} }
private byte[] readAssist(Address address, ByteBuffer buf, long offset, RangeSet<Long> set) { private byte[] readAssist(Address address, ByteBuffer buf, long offset, ULongSpanSet set) {
if (set == null) { if (set == null) {
return new byte[0]; return new byte[0];
} }
Range<Long> range = set.rangeContaining(offset); ULongSpan span = set.spanContaining(offset);
if (range == null) { if (span == null) {
throw new DebuggerMemoryAccessException("Cannot read at " + address); throw new DebuggerMemoryAccessException("Cannot read at " + address);
} }
listeners.fire.memoryUpdated(getProxy(), address, buf.array()); listeners.fire.memoryUpdated(getProxy(), address, buf.array());
return Arrays.copyOf(buf.array(), (int) (range.upperEndpoint() - range.lowerEndpoint())); return Arrays.copyOf(buf.array(), (int) span.length());
} }
public CompletableFuture<Void> writeVirtualMemory(Address address, byte[] data) { public CompletableFuture<Void> writeVirtualMemory(Address address, byte[] data) {

View file

@ -15,7 +15,7 @@
*/ */
package agent.dbgeng.manager.impl; package agent.dbgeng.manager.impl;
import static ghidra.async.AsyncUtils.*; import static ghidra.async.AsyncUtils.sequence;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.io.IOException; import java.io.IOException;
@ -30,13 +30,13 @@ import java.util.concurrent.atomic.AtomicReference;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.junit.*; import org.junit.*;
import com.google.common.collect.*;
import agent.dbgeng.dbgeng.DbgEngTest; import agent.dbgeng.dbgeng.DbgEngTest;
import agent.dbgeng.dbgeng.DebugProcessId; import agent.dbgeng.dbgeng.DebugProcessId;
import agent.dbgeng.manager.*; import agent.dbgeng.manager.*;
import agent.dbgeng.manager.DbgManager.ExecSuffix; import agent.dbgeng.manager.DbgManager.ExecSuffix;
import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo; import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
import generic.ULongSpan;
import generic.ULongSpan.ULongSpanSet;
import ghidra.async.AsyncFence; import ghidra.async.AsyncFence;
import ghidra.async.TypeSpec; import ghidra.async.TypeSpec;
import ghidra.dbg.testutil.DummyProc; import ghidra.dbg.testutil.DummyProc;
@ -320,11 +320,10 @@ public abstract class AbstractDbgManagerTest extends AbstractGhidraHeadlessInteg
thread.get().writeMemory(addr.get(), buf).handle(seq::next); thread.get().writeMemory(addr.get(), buf).handle(seq::next);
}).then(seq -> { }).then(seq -> {
thread.get().readMemory(addr.get(), rBuf).handle(seq::next); thread.get().readMemory(addr.get(), rBuf).handle(seq::next);
}, TypeSpec.obj((RangeSet<Long>) null)).then((rng, seq) -> { }, TypeSpec.obj((ULongSpanSet) null)).then((rng, seq) -> {
rBuf.flip(); rBuf.flip();
rBuf.order(ByteOrder.LITTLE_ENDIAN); rBuf.order(ByteOrder.LITTLE_ENDIAN);
RangeSet<Long> exp = TreeRangeSet.create(); ULongSpanSet exp = ULongSpanSet.of(ULongSpan.extent(addr.get(), 1024));
exp.add(Range.closedOpen(addr.get(), addr.get() + 1024));
assertEquals(exp, rng); assertEquals(exp, rng);
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
assertEquals(i, rBuf.getInt()); assertEquals(i, rBuf.getInt());

View file

@ -16,8 +16,6 @@
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import com.google.common.collect.Range;
import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.manager.impl.DbgManagerImpl;
import agent.dbgeng.model.AbstractDbgModel; import agent.dbgeng.model.AbstractDbgModel;
import ghidra.app.script.GhidraScript; import ghidra.app.script.GhidraScript;
@ -26,6 +24,7 @@ import ghidra.app.services.DebuggerTraceManagerService;
import ghidra.dbg.DebuggerObjectModel; import ghidra.dbg.DebuggerObjectModel;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.memory.*; import ghidra.trace.model.memory.*;
import ghidra.util.LockHold; import ghidra.util.LockHold;
@ -147,7 +146,7 @@ public class BangAddressToMemory extends GhidraScript {
AddressRange rng = rng(start, end - 1); AddressRange rng = rng(start, end - 1);
try { try {
TraceMemoryRegion region = TraceMemoryRegion region =
memory.addRegion(startStr, Range.atLeast(0L), rng, TraceMemoryFlag.READ, memory.addRegion(startStr, Lifespan.nowOn(0), rng, TraceMemoryFlag.READ,
TraceMemoryFlag.WRITE, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.WRITE, TraceMemoryFlag.EXECUTE);
region.setName(name); region.setName(name);
} }

View file

@ -31,7 +31,6 @@
import java.io.File; import java.io.File;
import java.util.*; import java.util.*;
import com.google.common.collect.Range;
import com.sun.jna.Pointer; import com.sun.jna.Pointer;
import agent.dbgeng.dbgeng.DebugClient; import agent.dbgeng.dbgeng.DebugClient;
@ -46,6 +45,7 @@ import ghidra.app.script.GhidraScript;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.program.model.lang.Register; import ghidra.program.model.lang.Register;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.TraceMemoryFlag; import ghidra.trace.model.memory.TraceMemoryFlag;
import ghidra.util.Swing; import ghidra.util.Swing;
@ -144,7 +144,7 @@ public class PopulateMemviewLocal extends GhidraScript {
Long start = (Long) address.getValue(); Long start = (Long) address.getValue();
Long sz = (Long) size.getValue(); Long sz = (Long) size.getValue();
AddressRange rng = rng(start, start + sz - 1); AddressRange rng = rng(start, start + sz - 1);
addLoadedModule(moduleId, moduleId, Range.atLeast(snap), rng); addLoadedModule(moduleId, moduleId, Lifespan.nowOn(snap), rng);
//addRegion(moduleId, Range.atLeast(snap), rng, TraceMemoryFlag.READ, //addRegion(moduleId, Range.atLeast(snap), rng, TraceMemoryFlag.READ,
// TraceMemoryFlag.WRITE, TraceMemoryFlag.EXECUTE); // TraceMemoryFlag.WRITE, TraceMemoryFlag.EXECUTE);
} }
@ -161,7 +161,7 @@ public class PopulateMemviewLocal extends GhidraScript {
AddressRange rng = rng(iid, iid + 1); AddressRange rng = rng(iid, iid + 1);
display += " " + threadId; display += " " + threadId;
if (display.contains("ThreadCreated")) { if (display.contains("ThreadCreated")) {
addThread("Thread " + threadId, Range.atLeast(snap), rng); addThread("Thread " + threadId, Lifespan.nowOn(snap), rng);
} }
else { else {
markThreadClosed(threadId, snap); markThreadClosed(threadId, snap);
@ -212,8 +212,8 @@ public class PopulateMemviewLocal extends GhidraScript {
String heapId = "Heap " + address.getValueString(); String heapId = "Heap " + address.getValueString();
Long startTick = (Long) timeStart.getValue(); Long startTick = (Long) timeStart.getValue();
Long stopTick = (Long) timeEnd.getValue(); Long stopTick = (Long) timeEnd.getValue();
Range<Long> interval = Lifespan interval =
(stopTick > 0) ? Range.open(startTick, stopTick) : Range.atLeast(startTick); (stopTick > 0) ? Lifespan.span(startTick, stopTick) : Lifespan.nowOn(startTick);
addHeap(heapId, interval, rng, TraceMemoryFlag.READ, TraceMemoryFlag.WRITE, addHeap(heapId, interval, rng, TraceMemoryFlag.READ, TraceMemoryFlag.WRITE,
TraceMemoryFlag.EXECUTE); TraceMemoryFlag.EXECUTE);
} }
@ -237,24 +237,24 @@ public class PopulateMemviewLocal extends GhidraScript {
}); });
} }
private void addHeap(String heapId, Range<Long> interval, AddressRange rng, private void addHeap(String heapId, Lifespan interval, AddressRange rng,
TraceMemoryFlag read, TraceMemoryFlag write, TraceMemoryFlag execute) { TraceMemoryFlag read, TraceMemoryFlag write, TraceMemoryFlag execute) {
MemoryBox box = new MemoryBox(heapId, MemviewBoxType.HEAP_CREATE, rng, interval); MemoryBox box = new MemoryBox(heapId, MemviewBoxType.HEAP_CREATE, rng, interval);
boxes.put(box.getId(), box); boxes.put(box.getId(), box);
} }
private void addThread(String threadId, Range<Long> interval, AddressRange rng) { private void addThread(String threadId, Lifespan interval, AddressRange rng) {
MemoryBox box = new MemoryBox(threadId, MemviewBoxType.THREAD, rng, interval); MemoryBox box = new MemoryBox(threadId, MemviewBoxType.THREAD, rng, interval);
boxes.put(box.getId(), box); boxes.put(box.getId(), box);
} }
private void addRegion(String regionId, Range<Long> interval, AddressRange rng, private void addRegion(String regionId, Lifespan interval, AddressRange rng,
TraceMemoryFlag read, TraceMemoryFlag write, TraceMemoryFlag execute) { TraceMemoryFlag read, TraceMemoryFlag write, TraceMemoryFlag execute) {
MemoryBox box = new MemoryBox(regionId, MemviewBoxType.IMAGE, rng, interval); MemoryBox box = new MemoryBox(regionId, MemviewBoxType.IMAGE, rng, interval);
boxes.put(box.getId(), box); boxes.put(box.getId(), box);
} }
private void addLoadedModule(String moduleId, String moduleId2, Range<Long> interval, private void addLoadedModule(String moduleId, String moduleId2, Lifespan interval,
AddressRange rng) { AddressRange rng) {
MemoryBox box = new MemoryBox(moduleId, MemviewBoxType.MODULE, rng, interval); MemoryBox box = new MemoryBox(moduleId, MemviewBoxType.MODULE, rng, interval);
boxes.put(box.getId(), box); boxes.put(box.getId(), box);

View file

@ -19,8 +19,6 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.*; import java.util.*;
import com.google.common.collect.Range;
import agent.dbgeng.dbgeng.DebugClient; import agent.dbgeng.dbgeng.DebugClient;
import agent.dbgeng.dbgeng.DebugControl; import agent.dbgeng.dbgeng.DebugControl;
import agent.dbgmodel.dbgmodel.DbgModel; import agent.dbgmodel.dbgmodel.DbgModel;
@ -32,6 +30,7 @@ import ghidra.app.services.DebuggerTraceManagerService;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.*; import ghidra.program.model.lang.*;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.memory.*; import ghidra.trace.model.memory.*;
import ghidra.trace.model.modules.TraceModule; import ghidra.trace.model.modules.TraceModule;
@ -226,7 +225,7 @@ public class PopulateTraceLocal extends GhidraScript {
buf = ByteBuffer.allocate(sz.intValue()).order(ByteOrder.LITTLE_ENDIAN); buf = ByteBuffer.allocate(sz.intValue()).order(ByteOrder.LITTLE_ENDIAN);
AddressRange rng = rng(start, start + sz - 1); AddressRange rng = rng(start, start + sz - 1);
modules.addLoadedModule(moduleId, moduleId, rng, snap); modules.addLoadedModule(moduleId, moduleId, rng, snap);
memory.addRegion(moduleId, Range.atLeast(snap), rng, memory.addRegion(moduleId, Lifespan.nowOn(snap), rng,
TraceMemoryFlag.READ, TraceMemoryFlag.WRITE, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.WRITE, TraceMemoryFlag.EXECUTE);
try { try {
int read = int read =
@ -261,7 +260,7 @@ public class PopulateTraceLocal extends GhidraScript {
String threadId = id.getValueString(); String threadId = id.getValueString();
display += " " + threadId; display += " " + threadId;
if (display.contains("ThreadCreated")) { if (display.contains("ThreadCreated")) {
threads.addThread(threadId, Range.atLeast(snap)); threads.addThread(threadId, Lifespan.nowOn(snap));
} }
else { else {
if (snap >= 0) { if (snap >= 0) {

View file

@ -0,0 +1,59 @@
/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package agent.frida.manager.cmd;
import java.nio.ByteBuffer;
import com.google.gson.JsonElement;
import agent.frida.manager.impl.FridaManagerImpl;
import ghidra.program.model.address.*;
import ghidra.util.NumericUtilities;
public abstract class AbstractFridaReadCommand extends AbstractFridaCommand<AddressSetView> {
protected final Address addr;
protected final ByteBuffer buf;
protected final int len;
protected AbstractFridaReadCommand(FridaManagerImpl manager, Address addr, ByteBuffer buf,
int len) {
super(manager);
this.addr = addr;
this.buf = buf;
this.len = len;
}
@Override
public AddressSetView complete(FridaPendingCommand<?> pending) {
return new AddressSet(addr, addr.add(len - 1));
}
@Override
public void parseSpecifics(JsonElement element) {
String payload = element.getAsString();
String[] lines = payload.split("\n");
int n = 0;
for (String l : lines) {
String[] split = l.split(" ");
byte[] bytes = NumericUtilities.convertStringToBytes(split[1]);
for (int i = 0; i < 16; i++) {
buf.put(n + i, bytes[i]);
}
n += 16;
}
}
}

View file

@ -17,57 +17,21 @@ package agent.frida.manager.cmd;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import com.google.common.collect.Range;
import com.google.common.collect.RangeSet;
import com.google.common.collect.TreeRangeSet;
//import com.sun.jna.Pointer;
//import com.sun.jna.ptr.PointerByReference;
import com.google.gson.JsonElement;
import agent.frida.manager.impl.FridaManagerImpl; import agent.frida.manager.impl.FridaManagerImpl;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.util.NumericUtilities;
public class FridaReadKernelMemoryCommand extends AbstractFridaCommand<RangeSet<Long>> { public class FridaReadKernelMemoryCommand extends AbstractFridaReadCommand {
private final Address addr; public FridaReadKernelMemoryCommand(FridaManagerImpl manager, Address addr, ByteBuffer buf,
private final ByteBuffer buf; int len) {
private final int len; super(manager, addr, buf, len);
public FridaReadKernelMemoryCommand(FridaManagerImpl manager, Address addr, ByteBuffer buf, int len) {
super(manager);
this.addr = addr;
this.buf = buf;
this.len = len;
} }
@Override
public RangeSet<Long> complete(FridaPendingCommand<?> pending) {
RangeSet<Long> rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closedOpen(addr.getOffset(), addr.getOffset() + len));
return rangeSet;
}
@Override @Override
public void invoke() { public void invoke() {
manager.loadScript(this, "read_memory", manager.loadScript(this, "read_memory",
"var buf = Kernel.readByteArray(ptr(0x"+addr+")"+len+"); result = hexdump(buf, {header:false});"); "var buf = Kernel.readByteArray(ptr(0x" + addr + ")," + len +
} "); result = hexdump(buf, {header:false});");
@Override
public void parseSpecifics(JsonElement element) {
String payload = element.getAsString();
String[] lines = payload.split("\n");
int n = 0;
for (String l : lines) {
String[] split = l.split(" ");
byte[] bytes = NumericUtilities.convertStringToBytes(split[1]);
for (int i = 0; i < 16; i++) {
buf.put(n+i, bytes[i]);
}
n += 16;
}
} }
} }

View file

@ -17,57 +17,20 @@ package agent.frida.manager.cmd;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import com.google.common.collect.Range;
import com.google.common.collect.RangeSet;
import com.google.common.collect.TreeRangeSet;
//import com.sun.jna.Pointer;
//import com.sun.jna.ptr.PointerByReference;
import com.google.gson.JsonElement;
import agent.frida.manager.impl.FridaManagerImpl; import agent.frida.manager.impl.FridaManagerImpl;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.util.NumericUtilities;
public class FridaReadMemoryCommand extends AbstractFridaCommand<RangeSet<Long>> { public class FridaReadMemoryCommand extends AbstractFridaReadCommand {
private final Address addr;
private final ByteBuffer buf;
private final int len;
public FridaReadMemoryCommand(FridaManagerImpl manager, Address addr, ByteBuffer buf, int len) { public FridaReadMemoryCommand(FridaManagerImpl manager, Address addr, ByteBuffer buf, int len) {
super(manager); super(manager, addr, buf, len);
this.addr = addr;
this.buf = buf;
this.len = len;
} }
@Override
public RangeSet<Long> complete(FridaPendingCommand<?> pending) {
RangeSet<Long> rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closedOpen(addr.getOffset(), addr.getOffset() + len));
return rangeSet;
}
@Override @Override
public void invoke() { public void invoke() {
manager.loadScript(this, "read_memory", manager.loadScript(this, "read_memory",
"var buf = ptr(0x"+addr+").readByteArray("+len+"); result = hexdump(buf, {header:false});"); "var buf = ptr(0x" + addr + ").readByteArray(" + len +
} "); result = hexdump(buf, {header:false});");
@Override
public void parseSpecifics(JsonElement element) {
String payload = element.getAsString();
String[] lines = payload.split("\n");
int n = 0;
for (String l : lines) {
String[] split = l.split(" ");
byte[] bytes = NumericUtilities.convertStringToBytes(split[1]);
for (int i = 0; i < 16; i++) {
buf.put(n+i, bytes[i]);
}
n += 16;
}
} }
} }

View file

@ -19,9 +19,6 @@ import java.nio.ByteBuffer;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import com.google.common.collect.Range;
import com.google.common.collect.RangeSet;
import agent.frida.frida.FridaRegionInfo; import agent.frida.frida.FridaRegionInfo;
import agent.frida.manager.*; import agent.frida.manager.*;
import agent.frida.manager.cmd.FridaReadKernelMemoryCommand; import agent.frida.manager.cmd.FridaReadKernelMemoryCommand;
@ -35,7 +32,7 @@ import ghidra.dbg.error.DebuggerModelAccessException;
import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*; import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode; import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
import ghidra.program.model.address.Address; import ghidra.program.model.address.*;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.datastruct.WeakValueHashMap; import ghidra.util.datastruct.WeakValueHashMap;
@ -61,7 +58,6 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
protected final Map<String, FridaModelTargetMemoryRegionImpl> memoryRegions = protected final Map<String, FridaModelTargetMemoryRegionImpl> memoryRegions =
new WeakValueHashMap<>(); new WeakValueHashMap<>();
public FridaModelTargetKernelMemoryContainerImpl(FridaModelTargetKernelImpl kernel) { public FridaModelTargetKernelMemoryContainerImpl(FridaModelTargetKernelImpl kernel) {
super(kernel.getModel(), kernel, "Memory", "MemoryContainer"); super(kernel.getModel(), kernel, "Memory", "MemoryContainer");
this.kernel = kernel; this.kernel = kernel;
@ -100,16 +96,16 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
return new FridaModelTargetMemoryRegionImpl(this, region); return new FridaModelTargetMemoryRegionImpl(this, region);
} }
private byte[] readAssist(Address address, ByteBuffer buf, long offset, RangeSet<Long> set) { private byte[] readAssist(Address address, ByteBuffer buf, AddressSetView set) {
if (set == null) { if (set == null) {
return new byte[0]; return new byte[0];
} }
Range<Long> range = set.rangeContaining(offset); AddressRange range = set.getRangeContaining(address);
if (range == null) { if (range == null) {
throw new DebuggerMemoryAccessException("Cannot read at " + address); throw new DebuggerMemoryAccessException("Cannot read at " + address);
} }
listeners.fire.memoryUpdated(getProxy(), address, buf.array()); listeners.fire.memoryUpdated(getProxy(), address, buf.array());
return Arrays.copyOf(buf.array(), (int) (range.upperEndpoint() - range.lowerEndpoint())); return Arrays.copyOf(buf.array(), (int) range.getLength());
} }
private void writeAssist(Address address, byte[] data) { private void writeAssist(Address address, byte[] data) {
@ -128,12 +124,12 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
"Cannot process command readMemory while engine is waiting for events"); "Cannot process command readMemory while engine is waiting for events");
} }
ByteBuffer buf = ByteBuffer.allocate(length); ByteBuffer buf = ByteBuffer.allocate(length);
long offset = address.getOffset();
if (!manager.isKernelMode() || address.getAddressSpace().getName().equals("ram")) { if (!manager.isKernelMode() || address.getAddressSpace().getName().equals("ram")) {
return manager return manager
.execute(new FridaReadKernelMemoryCommand(manager, address, buf, buf.remaining())) .execute(
new FridaReadKernelMemoryCommand(manager, address, buf, buf.remaining()))
.thenApply(set -> { .thenApply(set -> {
return readAssist(address, buf, offset, set); return readAssist(address, buf, set);
}); });
} }
return CompletableFuture.completedFuture(new byte[length]); return CompletableFuture.completedFuture(new byte[length]);
@ -153,7 +149,8 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
ByteBuffer buf = ByteBuffer.wrap(data); ByteBuffer buf = ByteBuffer.wrap(data);
if (!manager.isKernelMode() || address.getAddressSpace().getName().equals("ram")) { if (!manager.isKernelMode() || address.getAddressSpace().getName().equals("ram")) {
return manager return manager
.execute(new FridaWriteKernelMemoryCommand(manager, address, buf, buf.remaining())) .execute(
new FridaWriteKernelMemoryCommand(manager, address, buf, buf.remaining()))
.thenAccept(___ -> { .thenAccept(___ -> {
writeAssist(address, data); writeAssist(address, data);
}); });
@ -162,7 +159,8 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
} }
@Override @Override
public void regionAdded(FridaProcess process, FridaRegionInfo info, int index, FridaCause cause) { public void regionAdded(FridaProcess process, FridaRegionInfo info, int index,
FridaCause cause) {
FridaModelTargetMemoryRegion targetRegion; FridaModelTargetMemoryRegion targetRegion;
FridaMemoryRegionInfo region = info.getRegion(index); FridaMemoryRegionInfo region = info.getRegion(index);
synchronized (this) { synchronized (this) {
@ -182,7 +180,8 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
} }
@Override @Override
public void regionReplaced(FridaProcess process, FridaRegionInfo info, int index, FridaCause cause) { public void regionReplaced(FridaProcess process, FridaRegionInfo info, int index,
FridaCause cause) {
FridaMemoryRegionInfo region = info.getRegion(index); FridaMemoryRegionInfo region = info.getRegion(index);
changeElements(List.of(), List.of(getTargetMemory(region)), Map.of(), "Replaced"); changeElements(List.of(), List.of(getTargetMemory(region)), Map.of(), "Replaced");
FridaModelTargetMemoryRegion targetRegion = getTargetMemory(region); FridaModelTargetMemoryRegion targetRegion = getTargetMemory(region);
@ -190,7 +189,8 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
} }
@Override @Override
public void regionRemoved(FridaProcess process, FridaRegionInfo info, int index, FridaCause cause) { public void regionRemoved(FridaProcess process, FridaRegionInfo info, int index,
FridaCause cause) {
FridaModelTargetMemoryRegion targetRegion = getTargetMemory(info.getRegion(index)); FridaModelTargetMemoryRegion targetRegion = getTargetMemory(info.getRegion(index));
if (targetRegion != null) { if (targetRegion != null) {
FridaModelImpl impl = (FridaModelImpl) model; FridaModelImpl impl = (FridaModelImpl) model;

View file

@ -16,37 +16,22 @@
package agent.frida.model.impl; package agent.frida.model.impl;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Arrays; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import com.google.common.collect.Range;
import com.google.common.collect.RangeSet;
import agent.frida.frida.FridaRegionInfo; import agent.frida.frida.FridaRegionInfo;
import agent.frida.manager.FridaCause; import agent.frida.manager.*;
import agent.frida.manager.FridaMemoryRegionInfo;
import agent.frida.manager.FridaProcess;
import agent.frida.manager.cmd.FridaReadMemoryCommand; import agent.frida.manager.cmd.FridaReadMemoryCommand;
import agent.frida.manager.cmd.FridaWriteMemoryCommand; import agent.frida.manager.cmd.FridaWriteMemoryCommand;
import agent.frida.manager.impl.FridaManagerImpl; import agent.frida.manager.impl.FridaManagerImpl;
import agent.frida.model.iface2.FridaModelTargetMemoryContainer; import agent.frida.model.iface2.*;
import agent.frida.model.iface2.FridaModelTargetMemoryRegion; import agent.frida.model.methods.*;
import agent.frida.model.iface2.FridaModelTargetProcess;
import agent.frida.model.methods.FridaModelTargetMemoryPatchImpl;
import agent.frida.model.methods.FridaModelTargetMemoryProtectImpl;
import agent.frida.model.methods.FridaModelTargetMemoryScanImpl;
import agent.frida.model.methods.FridaModelTargetMemoryWatchImpl;
import agent.frida.model.methods.FridaModelTargetUnloadScriptImpl;
import ghidra.dbg.error.DebuggerMemoryAccessException; import ghidra.dbg.error.DebuggerMemoryAccessException;
import ghidra.dbg.error.DebuggerModelAccessException; import ghidra.dbg.error.DebuggerModelAccessException;
import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.TargetAttributeType; import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetElementType;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode; import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.program.model.address.*;
import ghidra.program.model.address.Address;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.datastruct.WeakValueHashMap; import ghidra.util.datastruct.WeakValueHashMap;
@ -73,7 +58,6 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
protected final Map<String, FridaModelTargetMemoryRegionImpl> memoryRegions = protected final Map<String, FridaModelTargetMemoryRegionImpl> memoryRegions =
new WeakValueHashMap<>(); new WeakValueHashMap<>();
public FridaModelTargetMemoryContainerImpl(FridaModelTargetProcess process) { public FridaModelTargetMemoryContainerImpl(FridaModelTargetProcess process) {
super(process.getModel(), process, "Memory", "MemoryContainer"); super(process.getModel(), process, "Memory", "MemoryContainer");
this.process = process; this.process = process;
@ -134,16 +118,16 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
return new FridaModelTargetMemoryRegionImpl(this, region); return new FridaModelTargetMemoryRegionImpl(this, region);
} }
private byte[] readAssist(Address address, ByteBuffer buf, long offset, RangeSet<Long> set) { private byte[] readAssist(Address address, ByteBuffer buf, AddressSetView set) {
if (set == null) { if (set == null) {
return new byte[0]; return new byte[0];
} }
Range<Long> range = set.rangeContaining(offset); AddressRange range = set.getRangeContaining(address);
if (range == null) { if (range == null) {
throw new DebuggerMemoryAccessException("Cannot read at " + address); throw new DebuggerMemoryAccessException("Cannot read at " + address);
} }
listeners.fire.memoryUpdated(getProxy(), address, buf.array()); listeners.fire.memoryUpdated(getProxy(), address, buf.array());
return Arrays.copyOf(buf.array(), (int) (range.upperEndpoint() - range.lowerEndpoint())); return Arrays.copyOf(buf.array(), (int) range.getLength());
} }
private void writeAssist(Address address, byte[] data) { private void writeAssist(Address address, byte[] data) {
@ -162,12 +146,11 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
"Cannot process command readMemory while engine is waiting for events"); "Cannot process command readMemory while engine is waiting for events");
} }
ByteBuffer buf = ByteBuffer.allocate(length); ByteBuffer buf = ByteBuffer.allocate(length);
long offset = address.getOffset();
if (!manager.isKernelMode() || address.getAddressSpace().getName().equals("ram")) { if (!manager.isKernelMode() || address.getAddressSpace().getName().equals("ram")) {
return manager return manager
.execute(new FridaReadMemoryCommand(manager, address, buf, buf.remaining())) .execute(new FridaReadMemoryCommand(manager, address, buf, buf.remaining()))
.thenApply(set -> { .thenApply(set -> {
return readAssist(address, buf, offset, set); return readAssist(address, buf, set);
}); });
} }
return CompletableFuture.completedFuture(new byte[length]); return CompletableFuture.completedFuture(new byte[length]);
@ -216,7 +199,8 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
} }
@Override @Override
public void regionReplaced(FridaProcess proc, FridaRegionInfo info, int index, FridaCause cause) { public void regionReplaced(FridaProcess proc, FridaRegionInfo info, int index,
FridaCause cause) {
FridaMemoryRegionInfo region = info.getRegion(index); FridaMemoryRegionInfo region = info.getRegion(index);
changeElements(List.of(), List.of(getTargetMemory(region)), Map.of(), "Replaced"); changeElements(List.of(), List.of(getTargetMemory(region)), Map.of(), "Replaced");
FridaModelTargetMemoryRegion targetRegion = getTargetMemory(region); FridaModelTargetMemoryRegion targetRegion = getTargetMemory(region);
@ -224,7 +208,8 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
} }
@Override @Override
public void regionRemoved(FridaProcess proc, FridaRegionInfo info, int index, FridaCause cause) { public void regionRemoved(FridaProcess proc, FridaRegionInfo info, int index,
FridaCause cause) {
FridaModelTargetMemoryRegion targetRegion = getTargetMemory(info.getRegion(index)); FridaModelTargetMemoryRegion targetRegion = getTargetMemory(info.getRegion(index));
if (targetRegion != null) { if (targetRegion != null) {
FridaModelImpl impl = (FridaModelImpl) model; FridaModelImpl impl = (FridaModelImpl) model;

View file

@ -18,7 +18,7 @@ package agent.gdb.manager;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import com.google.common.collect.RangeSet; import generic.ULongSpan.ULongSpanSet;
public interface GdbMemoryOperations { public interface GdbMemoryOperations {
@ -30,7 +30,7 @@ public interface GdbMemoryOperations {
* @param len the length of data to read * @param len the length of data to read
* @return a future which completes giving the ranges successfully read * @return a future which completes giving the ranges successfully read
*/ */
CompletableFuture<RangeSet<Long>> readMemory(long addr, ByteBuffer buf, int len); CompletableFuture<ULongSpanSet> readMemory(long addr, ByteBuffer buf, int len);
/** /**
* Read memory * Read memory
@ -41,7 +41,7 @@ public interface GdbMemoryOperations {
* @param buf the buffer to read into * @param buf the buffer to read into
* @return a future which completes giving the ranges successfully read * @return a future which completes giving the ranges successfully read
*/ */
default CompletableFuture<RangeSet<Long>> readMemory(long addr, ByteBuffer buf) { default CompletableFuture<ULongSpanSet> readMemory(long addr, ByteBuffer buf) {
return readMemory(addr, buf, buf.remaining()); return readMemory(addr, buf, buf.remaining());
} }

View file

@ -24,13 +24,12 @@ import java.util.concurrent.CompletableFuture;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import com.google.common.collect.RangeSet;
import agent.gdb.manager.*; import agent.gdb.manager.*;
import agent.gdb.manager.GdbCause.Causes; import agent.gdb.manager.GdbCause.Causes;
import agent.gdb.manager.GdbManager.StepCmd; import agent.gdb.manager.GdbManager.StepCmd;
import agent.gdb.manager.impl.cmd.*; import agent.gdb.manager.impl.cmd.*;
import agent.gdb.manager.impl.cmd.GdbConsoleExecCommand.CompletesWithRunning; import agent.gdb.manager.impl.cmd.GdbConsoleExecCommand.CompletesWithRunning;
import generic.ULongSpan.ULongSpanSet;
import ghidra.lifecycle.Internal; import ghidra.lifecycle.Internal;
import ghidra.util.Msg; import ghidra.util.Msg;
@ -480,7 +479,7 @@ public class GdbInferiorImpl implements GdbInferior {
} }
@Override @Override
public CompletableFuture<RangeSet<Long>> readMemory(long addr, ByteBuffer buf, int len) { public CompletableFuture<ULongSpanSet> readMemory(long addr, ByteBuffer buf, int len) {
return execute(new GdbReadMemoryCommand(manager, null, addr, buf, len)); return execute(new GdbReadMemoryCommand(manager, null, addr, buf, len));
} }

View file

@ -20,8 +20,6 @@ import java.nio.ByteBuffer;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import com.google.common.collect.RangeSet;
import agent.gdb.manager.*; import agent.gdb.manager.*;
import agent.gdb.manager.GdbManager.StepCmd; import agent.gdb.manager.GdbManager.StepCmd;
import agent.gdb.manager.breakpoint.GdbBreakpointInfo; import agent.gdb.manager.breakpoint.GdbBreakpointInfo;
@ -31,6 +29,7 @@ import agent.gdb.manager.impl.cmd.GdbConsoleExecCommand.CompletesWithRunning;
import agent.gdb.manager.parsing.GdbCValueParser; import agent.gdb.manager.parsing.GdbCValueParser;
import agent.gdb.manager.parsing.GdbParsingUtils.GdbParseError; import agent.gdb.manager.parsing.GdbParsingUtils.GdbParseError;
import agent.gdb.manager.reason.GdbReason; import agent.gdb.manager.reason.GdbReason;
import generic.ULongSpan.ULongSpanSet;
import ghidra.async.*; import ghidra.async.*;
/** /**
@ -250,7 +249,7 @@ public class GdbThreadImpl implements GdbThread {
} }
@Override @Override
public CompletableFuture<RangeSet<Long>> readMemory(long addr, ByteBuffer buf, int len) { public CompletableFuture<ULongSpanSet> readMemory(long addr, ByteBuffer buf, int len) {
return execute(new GdbReadMemoryCommand(manager, id, addr, buf, len)); return execute(new GdbReadMemoryCommand(manager, id, addr, buf, len));
} }

View file

@ -18,21 +18,21 @@ package agent.gdb.manager.impl.cmd;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.List; import java.util.List;
import com.google.common.collect.*;
import agent.gdb.manager.GdbThread; import agent.gdb.manager.GdbThread;
import agent.gdb.manager.evt.GdbCommandDoneEvent; import agent.gdb.manager.evt.GdbCommandDoneEvent;
import agent.gdb.manager.impl.GdbManagerImpl; import agent.gdb.manager.impl.GdbManagerImpl;
import agent.gdb.manager.impl.GdbPendingCommand; import agent.gdb.manager.impl.GdbPendingCommand;
import agent.gdb.manager.parsing.GdbMiParser.GdbMiFieldList; import agent.gdb.manager.parsing.GdbMiParser.GdbMiFieldList;
import agent.gdb.manager.parsing.GdbParsingUtils; import agent.gdb.manager.parsing.GdbParsingUtils;
import generic.ULongSpan;
import generic.ULongSpan.*;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.NumericUtilities; import ghidra.util.NumericUtilities;
/** /**
* Implementation of {@link GdbThread#readMemory(long, ByteBuffer, int)} * Implementation of {@link GdbThread#readMemory(long, ByteBuffer, int)}
*/ */
public class GdbReadMemoryCommand extends AbstractGdbCommandWithThreadId<RangeSet<Long>> { public class GdbReadMemoryCommand extends AbstractGdbCommandWithThreadId<ULongSpanSet> {
private final long addr; private final long addr;
private final ByteBuffer buf; private final ByteBuffer buf;
@ -52,10 +52,10 @@ public class GdbReadMemoryCommand extends AbstractGdbCommandWithThreadId<RangeSe
} }
@Override @Override
public RangeSet<Long> complete(GdbPendingCommand<?> pending) { public ULongSpanSet complete(GdbPendingCommand<?> pending) {
GdbCommandDoneEvent done = pending.checkCompletion(GdbCommandDoneEvent.class); GdbCommandDoneEvent done = pending.checkCompletion(GdbCommandDoneEvent.class);
List<GdbMiFieldList> rangeList = done.assumeMemoryContentsList(); List<GdbMiFieldList> rangeList = done.assumeMemoryContentsList();
RangeSet<Long> rangeSet = TreeRangeSet.create(); MutableULongSpanSet spanSet = new DefaultULongSpanSet();
int pos = buf.position(); int pos = buf.position();
int max = pos; int max = pos;
for (GdbMiFieldList r : rangeList) { for (GdbMiFieldList r : rangeList) {
@ -74,9 +74,9 @@ public class GdbReadMemoryCommand extends AbstractGdbCommandWithThreadId<RangeSe
max = Math.max(max, newPos + length); max = Math.max(max, newPos + length);
buf.position(newPos); buf.position(newPos);
buf.put(contents); buf.put(contents);
rangeSet.add(Range.closedOpen(start, end)); spanSet.add(ULongSpan.extent(start, length));
} }
buf.position(max); buf.position(max);
return rangeSet; return spanSet;
} }
} }

View file

@ -23,12 +23,11 @@ import java.util.stream.Collectors;
import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.exception.ExceptionUtils;
import com.google.common.collect.Range;
import agent.gdb.manager.GdbInferior; import agent.gdb.manager.GdbInferior;
import agent.gdb.manager.impl.GdbMemoryMapping; import agent.gdb.manager.impl.GdbMemoryMapping;
import agent.gdb.manager.impl.cmd.GdbCommandError; import agent.gdb.manager.impl.cmd.GdbCommandError;
import agent.gdb.manager.impl.cmd.GdbStateChangeRecord; import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
import generic.ULongSpan;
import ghidra.async.AsyncFence; import ghidra.async.AsyncFence;
import ghidra.async.AsyncUtils; import ghidra.async.AsyncUtils;
import ghidra.dbg.agent.DefaultTargetObject; import ghidra.dbg.agent.DefaultTargetObject;
@ -155,12 +154,11 @@ public class GdbModelTargetProcessMemory
throw new IllegalArgumentException("address,length", e); throw new IllegalArgumentException("address,length", e);
} }
return inferior.readMemory(offset, buf).thenApply(set -> { return inferior.readMemory(offset, buf).thenApply(set -> {
Range<Long> r = set.rangeContaining(offset); ULongSpan s = set.spanContaining(offset);
if (r == null) { if (s == null) {
throw new DebuggerMemoryAccessException("Cannot read at " + address); throw new DebuggerMemoryAccessException("Cannot read at " + address);
} }
byte[] content = byte[] content = Arrays.copyOf(buf.array(), (int) s.length());
Arrays.copyOf(buf.array(), (int) (r.upperEndpoint() - r.lowerEndpoint()));
listeners.fire.memoryUpdated(this, address, content); listeners.fire.memoryUpdated(this, address, content);
return content; return content;
}).exceptionally(e -> { }).exceptionally(e -> {

View file

@ -32,13 +32,13 @@ import java.util.stream.Collectors;
import org.junit.*; import org.junit.*;
import com.google.common.collect.*;
import agent.gdb.manager.*; import agent.gdb.manager.*;
import agent.gdb.manager.GdbManager.StepCmd; import agent.gdb.manager.GdbManager.StepCmd;
import agent.gdb.manager.breakpoint.GdbBreakpointInfo; import agent.gdb.manager.breakpoint.GdbBreakpointInfo;
import agent.gdb.pty.PtyFactory; import agent.gdb.pty.PtyFactory;
import agent.gdb.pty.linux.LinuxPtyFactory; import agent.gdb.pty.linux.LinuxPtyFactory;
import generic.ULongSpan;
import generic.ULongSpan.ULongSpanSet;
import ghidra.async.AsyncReference; import ghidra.async.AsyncReference;
import ghidra.dbg.testutil.DummyProc; import ghidra.dbg.testutil.DummyProc;
import ghidra.test.AbstractGhidraHeadlessIntegrationTest; import ghidra.test.AbstractGhidraHeadlessIntegrationTest;
@ -401,12 +401,11 @@ public abstract class AbstractGdbManagerTest extends AbstractGhidraHeadlessInteg
} }
buf.flip(); buf.flip();
waitOn(thread.writeMemory(addr, buf)); waitOn(thread.writeMemory(addr, buf));
RangeSet<Long> rng = waitOn(thread.readMemory(addr, rBuf)); ULongSpanSet set = waitOn(thread.readMemory(addr, rBuf));
rBuf.flip(); rBuf.flip();
rBuf.order(ByteOrder.LITTLE_ENDIAN); rBuf.order(ByteOrder.LITTLE_ENDIAN);
RangeSet<Long> exp = TreeRangeSet.create(); ULongSpanSet exp = ULongSpanSet.of(ULongSpan.extent(addr, 1024));
exp.add(Range.closedOpen(addr, addr + 1024)); assertEquals(exp, set);
assertEquals(exp, rng);
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
assertEquals(i, rBuf.getInt()); assertEquals(i, rBuf.getInt());
} }

View file

@ -22,13 +22,13 @@ import com.google.common.collect.*;
import SWIG.*; import SWIG.*;
import agent.lldb.manager.impl.LldbManagerImpl; import agent.lldb.manager.impl.LldbManagerImpl;
import ghidra.program.model.address.Address; import ghidra.program.model.address.*;
import ghidra.util.Msg; import ghidra.util.Msg;
/** /**
* Implementation of {@link LldbProcess#readMemory(long, ByteBuffer, int)} * Implementation of {@link LldbProcess#readMemory(long, ByteBuffer, int)}
*/ */
public class LldbReadMemoryCommand extends AbstractLldbCommand<RangeSet<Long>> { public class LldbReadMemoryCommand extends AbstractLldbCommand<AddressSetView> {
private final SBProcess process; private final SBProcess process;
private final Address addr; private final Address addr;
@ -45,10 +45,8 @@ public class LldbReadMemoryCommand extends AbstractLldbCommand<RangeSet<Long>> {
} }
@Override @Override
public RangeSet<Long> complete(LldbPendingCommand<?> pending) { public AddressSetView complete(LldbPendingCommand<?> pending) {
RangeSet<Long> rangeSet = TreeRangeSet.create(); return new AddressSet(addr, addr.add(len - 1));
rangeSet.add(Range.closedOpen(addr.getOffset(), addr.getOffset() + len));
return rangeSet;
} }
@Override @Override

View file

@ -20,11 +20,9 @@ import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.google.common.collect.Range;
import com.google.common.collect.RangeSet;
import SWIG.SBMemoryRegionInfo; import SWIG.SBMemoryRegionInfo;
import agent.lldb.manager.cmd.*; import agent.lldb.manager.cmd.LldbReadMemoryCommand;
import agent.lldb.manager.cmd.LldbWriteMemoryCommand;
import agent.lldb.manager.impl.LldbManagerImpl; import agent.lldb.manager.impl.LldbManagerImpl;
import agent.lldb.model.iface2.*; import agent.lldb.model.iface2.*;
import ghidra.dbg.error.DebuggerMemoryAccessException; import ghidra.dbg.error.DebuggerMemoryAccessException;
@ -32,7 +30,7 @@ import ghidra.dbg.error.DebuggerModelAccessException;
import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*; import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode; import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
import ghidra.program.model.address.Address; import ghidra.program.model.address.*;
import ghidra.util.datastruct.WeakValueHashMap; import ghidra.util.datastruct.WeakValueHashMap;
@TargetObjectSchemaInfo( @TargetObjectSchemaInfo(
@ -81,16 +79,16 @@ public class LldbModelTargetMemoryContainerImpl extends LldbModelTargetObjectImp
return new LldbModelTargetMemoryRegionImpl(this, region); return new LldbModelTargetMemoryRegionImpl(this, region);
} }
private byte[] readAssist(Address address, ByteBuffer buf, long offset, RangeSet<Long> set) { private byte[] readAssist(Address address, ByteBuffer buf, AddressSetView set) {
if (set == null) { if (set == null) {
return new byte[0]; return new byte[0];
} }
Range<Long> range = set.rangeContaining(offset); AddressRange range = set.getRangeContaining(address);
if (range == null) { if (range == null) {
throw new DebuggerMemoryAccessException("Cannot read at " + address); throw new DebuggerMemoryAccessException("Cannot read at " + address);
} }
listeners.fire.memoryUpdated(getProxy(), address, buf.array()); listeners.fire.memoryUpdated(getProxy(), address, buf.array());
return Arrays.copyOf(buf.array(), (int) (range.upperEndpoint() - range.lowerEndpoint())); return Arrays.copyOf(buf.array(), (int) range.getLength());
} }
private void writeAssist(Address address, byte[] data) { private void writeAssist(Address address, byte[] data) {
@ -109,13 +107,12 @@ public class LldbModelTargetMemoryContainerImpl extends LldbModelTargetObjectImp
"Cannot process command readMemory while engine is waiting for events"); "Cannot process command readMemory while engine is waiting for events");
} }
ByteBuffer buf = ByteBuffer.allocate(length); ByteBuffer buf = ByteBuffer.allocate(length);
long offset = address.getOffset();
if (!manager.isKernelMode() || address.getAddressSpace().getName().equals("ram")) { if (!manager.isKernelMode() || address.getAddressSpace().getName().equals("ram")) {
return manager return manager
.execute(new LldbReadMemoryCommand(manager, process.getProcess(), address, buf, .execute(new LldbReadMemoryCommand(manager, process.getProcess(), address, buf,
buf.remaining())) buf.remaining()))
.thenApply(set -> { .thenApply(set -> {
return readAssist(address, buf, offset, set); return readAssist(address, buf, set);
}); });
} }
return CompletableFuture.completedFuture(new byte[length]); return CompletableFuture.completedFuture(new byte[length]);

View file

@ -13,15 +13,12 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import com.google.common.collect.Range;
import ghidra.app.script.GhidraScript; import ghidra.app.script.GhidraScript;
import ghidra.app.services.DebuggerStaticMappingService; import ghidra.app.services.DebuggerStaticMappingService;
import ghidra.app.services.DebuggerTraceManagerService; import ghidra.app.services.DebuggerTraceManagerService;
import ghidra.program.model.address.AddressSpace; import ghidra.program.model.address.AddressSpace;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.trace.model.DefaultTraceLocation; import ghidra.trace.model.*;
import ghidra.trace.model.Trace;
public class AddMapping extends GhidraScript { public class AddMapping extends GhidraScript {
@Override @Override
@ -35,7 +32,7 @@ public class AddMapping extends GhidraScript {
AddressSpace statRam = currentProgram.getAddressFactory().getDefaultAddressSpace(); AddressSpace statRam = currentProgram.getAddressFactory().getDefaultAddressSpace();
mappings.addMapping( mappings.addMapping(
new DefaultTraceLocation(currentTrace, null, Range.atLeast(0L), new DefaultTraceLocation(currentTrace, null, Lifespan.nowOn(0),
dynRam.getAddress(0x00400000)), dynRam.getAddress(0x00400000)),
new ProgramLocation(currentProgram, statRam.getAddress(0x00400000)), new ProgramLocation(currentProgram, statRam.getAddress(0x00400000)),
0x10000, false); 0x10000, false);

View file

@ -18,8 +18,6 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.*; import java.util.*;
import com.google.common.collect.Range;
import ghidra.app.plugin.assembler.Assembler; import ghidra.app.plugin.assembler.Assembler;
import ghidra.app.plugin.assembler.Assemblers; import ghidra.app.plugin.assembler.Assemblers;
import ghidra.app.script.GhidraScript; import ghidra.app.script.GhidraScript;
@ -33,6 +31,7 @@ import ghidra.program.model.symbol.SourceType;
import ghidra.program.model.util.CodeUnitInsertionException; import ghidra.program.model.util.CodeUnitInsertionException;
import ghidra.program.util.DefaultLanguageService; import ghidra.program.util.DefaultLanguageService;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.listing.TraceCodeSpace; import ghidra.trace.model.listing.TraceCodeSpace;
import ghidra.trace.model.memory.*; import ghidra.trace.model.memory.*;
@ -239,8 +238,8 @@ public class PopulateDemoTrace extends GhidraScript {
TraceCodeSpace code = TraceCodeSpace code =
thread.getTrace().getCodeManager().getCodeRegisterSpace(thread, true); thread.getTrace().getCodeManager().getCodeRegisterSpace(thread, true);
code.definedUnits().clear(Range.atLeast(tick), reg, TaskMonitor.DUMMY); code.definedUnits().clear(Lifespan.nowOn(tick), reg, TaskMonitor.DUMMY);
code.definedData().create(Range.atLeast(tick), reg, PointerDataType.dataType); code.definedData().create(Lifespan.nowOn(tick), reg, PointerDataType.dataType);
} }
/** /**
@ -320,15 +319,15 @@ public class PopulateDemoTrace extends GhidraScript {
* presented as memory blocks. Thus, observations outside a region are not visible in * presented as memory blocks. Thus, observations outside a region are not visible in
* the UI. * the UI.
*/ */
memory.addRegion(".text", Range.atLeast(snap), rng(0x00400000, 0x00400fff), memory.addRegion(".text", Lifespan.nowOn(snap), rng(0x00400000, 0x00400fff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
memory.addRegion("[STACK 1]", Range.atLeast(snap), rng(0x00100000, 0x001effff), memory.addRegion("[STACK 1]", Lifespan.nowOn(snap), rng(0x00100000, 0x001effff),
TraceMemoryFlag.READ, TraceMemoryFlag.WRITE); TraceMemoryFlag.READ, TraceMemoryFlag.WRITE);
/** /**
* Create the main thread, assumed alive from here on out. * Create the main thread, assumed alive from here on out.
*/ */
thread1 = trace.getThreadManager().addThread("Thread 1", Range.atLeast(snap)); thread1 = trace.getThreadManager().addThread("Thread 1", Lifespan.nowOn(snap));
/** /**
* Get a handle to the main thread's register values. * Get a handle to the main thread's register values.
* *
@ -487,10 +486,10 @@ public class PopulateDemoTrace extends GhidraScript {
.createSnapshot("Stepped Thread 1: CALL clone -> Thread 2") .createSnapshot("Stepped Thread 1: CALL clone -> Thread 2")
.getKey(); .getKey();
memory.addRegion("[STACK 2]", Range.atLeast(snap), rng(0x00200000, 0x002effff), memory.addRegion("[STACK 2]", Lifespan.nowOn(snap), rng(0x00200000, 0x002effff),
TraceMemoryFlag.READ, TraceMemoryFlag.WRITE); TraceMemoryFlag.READ, TraceMemoryFlag.WRITE);
thread2 = trace.getThreadManager().addThread("Thread 2", Range.atLeast(snap)); thread2 = trace.getThreadManager().addThread("Thread 2", Lifespan.nowOn(snap));
regs2 = memory.getMemoryRegisterSpace(thread2, true); regs2 = memory.getMemoryRegisterSpace(thread2, true);
stack1offset -= 8; stack1offset -= 8;

View file

@ -21,8 +21,6 @@ import java.util.Objects;
import org.jdom.Element; import org.jdom.Element;
import com.google.common.collect.Range;
import ghidra.app.services.DebuggerTraceManagerService; import ghidra.app.services.DebuggerTraceManagerService;
import ghidra.app.services.TraceRecorder; import ghidra.app.services.TraceRecorder;
import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.TargetObject;
@ -31,7 +29,7 @@ import ghidra.framework.model.*;
import ghidra.framework.options.SaveState; import ghidra.framework.options.SaveState;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.trace.database.DBTraceContentHandler; import ghidra.trace.database.DBTraceContentHandler;
import ghidra.trace.database.DBTraceUtils; import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.guest.TracePlatform; import ghidra.trace.model.guest.TracePlatform;
import ghidra.trace.model.program.TraceProgramView; import ghidra.trace.model.program.TraceProgramView;
@ -339,7 +337,7 @@ public class DebuggerCoordinates {
*/ */
private static boolean isAncestor(TraceObject ancestor, TraceObject successor, private static boolean isAncestor(TraceObject ancestor, TraceObject successor,
TraceSchedule time) { TraceSchedule time) {
return successor.getCanonicalParents(Range.singleton(time.getSnap())) return successor.getCanonicalParents(Lifespan.at(time.getSnap()))
.anyMatch(p -> p == ancestor); .anyMatch(p -> p == ancestor);
} }
@ -417,7 +415,7 @@ public class DebuggerCoordinates {
return null; return null;
} }
long snap = view.getSnap(); long snap = view.getSnap();
if (!DBTraceUtils.isScratch(snap)) { if (!Lifespan.isScratch(snap)) {
return TraceSchedule.snap(snap); return TraceSchedule.snap(snap);
} }
TraceSnapshot snapshot = view.getTrace().getTimeManager().getSnapshot(snap, false); TraceSnapshot snapshot = view.getTrace().getTimeManager().getSnapshot(snap, false);

View file

@ -15,14 +15,13 @@
*/ */
package ghidra.app.plugin.core.debug.disassemble; package ghidra.app.plugin.core.debug.disassemble;
import com.google.common.collect.Range;
import ghidra.framework.cmd.TypedBackgroundCommand; import ghidra.framework.cmd.TypedBackgroundCommand;
import ghidra.program.disassemble.Disassembler; import ghidra.program.disassemble.Disassembler;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.*; import ghidra.program.model.lang.*;
import ghidra.program.model.listing.Instruction; import ghidra.program.model.listing.Instruction;
import ghidra.program.model.mem.MemBuffer; import ghidra.program.model.mem.MemBuffer;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.guest.TracePlatform; import ghidra.trace.model.guest.TracePlatform;
import ghidra.trace.model.program.TraceProgramView; import ghidra.trace.model.program.TraceProgramView;
import ghidra.util.MathUtilities; import ghidra.util.MathUtilities;
@ -73,7 +72,7 @@ public class TraceDisassembleCommand extends TypedBackgroundCommand<TraceProgram
return view.getTrace() return view.getTrace()
.getCodeManager() .getCodeManager()
.instructions() .instructions()
.addInstructionSet(Range.atLeast(view.getSnap()), platform, set, true); .addInstructionSet(Lifespan.nowOn(view.getSnap()), platform, set, true);
} }
@Override @Override

View file

@ -20,14 +20,13 @@ import java.util.concurrent.CompletableFuture;
import javax.swing.Icon; import javax.swing.Icon;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.DebuggerCoordinates; import ghidra.app.plugin.core.debug.DebuggerCoordinates;
import ghidra.app.plugin.core.debug.gui.DebuggerResources.AutoReadMemoryAction; import ghidra.app.plugin.core.debug.gui.DebuggerResources.AutoReadMemoryAction;
import ghidra.app.services.TraceRecorder; import ghidra.app.services.TraceRecorder;
import ghidra.async.AsyncUtils; import ghidra.async.AsyncUtils;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.TraceAddressSnapRange; import ghidra.trace.model.TraceAddressSnapRange;
import ghidra.trace.model.memory.*; import ghidra.trace.model.memory.*;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@ -80,7 +79,7 @@ public class VisibleROOnceAutoReadMemorySpec implements AutoReadMemorySpec {
AddressSet readOnly = new AddressSet(); AddressSet readOnly = new AddressSet();
for (AddressRange range : visible) { for (AddressRange range : visible) {
for (TraceMemoryRegion region : mm for (TraceMemoryRegion region : mm
.getRegionsIntersecting(Range.singleton(coordinates.getSnap()), range)) { .getRegionsIntersecting(Lifespan.at(coordinates.getSnap()), range)) {
if (region.isWrite()) { if (region.isWrite()) {
continue; continue;
} }

View file

@ -25,8 +25,6 @@ import javax.swing.*;
import javax.swing.table.TableColumn; import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel; import javax.swing.table.TableColumnModel;
import com.google.common.collect.Range;
import docking.ActionContext; import docking.ActionContext;
import docking.WindowPosition; import docking.WindowPosition;
import docking.action.*; import docking.action.*;
@ -44,9 +42,8 @@ import ghidra.framework.plugintool.annotation.AutoServiceConsumed;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressRange; import ghidra.program.model.address.AddressRange;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.trace.model.Trace; import ghidra.trace.model.*;
import ghidra.trace.model.Trace.TraceBreakpointChangeType; import ghidra.trace.model.Trace.TraceBreakpointChangeType;
import ghidra.trace.model.TraceDomainObjectListener;
import ghidra.trace.model.breakpoint.TraceBreakpoint; import ghidra.trace.model.breakpoint.TraceBreakpoint;
import ghidra.util.*; import ghidra.util.*;
import ghidra.util.database.ObjectKey; import ghidra.util.database.ObjectKey;
@ -611,8 +608,8 @@ public class DebuggerBreakpointsProvider extends ComponentProviderAdapter
breakpointLocationUpdated(location); breakpointLocationUpdated(location);
} }
private void locationLifespanChanged(TraceBreakpoint location, Range<Long> oldSpan, private void locationLifespanChanged(TraceBreakpoint location, Lifespan oldSpan,
Range<Long> newSpan) { Lifespan newSpan) {
boolean isLiveOld = oldSpan.contains(recorder.getSnap()); boolean isLiveOld = oldSpan.contains(recorder.getSnap());
boolean isLiveNew = newSpan.contains(recorder.getSnap()); boolean isLiveNew = newSpan.contains(recorder.getSnap());
if (isLiveOld == isLiveNew) { if (isLiveOld == isLiveNew) {
@ -831,7 +828,7 @@ public class DebuggerBreakpointsProvider extends ComponentProviderAdapter
Trace trace = recorder.getTrace(); Trace trace = recorder.getTrace();
for (AddressRange range : trace.getBaseAddressFactory().getAddressSet()) { for (AddressRange range : trace.getBaseAddressFactory().getAddressSet()) {
locationTableModel.addAllItems(trace.getBreakpointManager() locationTableModel.addAllItems(trace.getBreakpointManager()
.getBreakpointsIntersecting(Range.singleton(recorder.getSnap()), range)); .getBreakpointsIntersecting(Lifespan.at(recorder.getSnap()), range));
} }
} }

View file

@ -26,8 +26,6 @@ import java.util.stream.Stream;
import javax.swing.Icon; import javax.swing.Icon;
import javax.swing.KeyStroke; import javax.swing.KeyStroke;
import com.google.common.collect.Range;
import docking.ActionContext; import docking.ActionContext;
import docking.DockingContextListener; import docking.DockingContextListener;
import docking.action.DockingAction; import docking.action.DockingAction;
@ -54,9 +52,8 @@ import ghidra.dbg.target.TargetSteppable.TargetStepKind;
import ghidra.framework.plugintool.*; import ghidra.framework.plugintool.*;
import ghidra.framework.plugintool.annotation.AutoServiceConsumed; import ghidra.framework.plugintool.annotation.AutoServiceConsumed;
import ghidra.framework.plugintool.util.PluginStatus; import ghidra.framework.plugintool.util.PluginStatus;
import ghidra.trace.model.Trace; import ghidra.trace.model.*;
import ghidra.trace.model.Trace.TraceObjectChangeType; import ghidra.trace.model.Trace.TraceObjectChangeType;
import ghidra.trace.model.TraceDomainObjectListener;
import ghidra.trace.model.target.TraceObject; import ghidra.trace.model.target.TraceObject;
import ghidra.trace.model.target.TraceObjectValue; import ghidra.trace.model.target.TraceObjectValue;
import ghidra.trace.model.time.schedule.Scheduler; import ghidra.trace.model.time.schedule.Scheduler;
@ -537,8 +534,8 @@ public class DebuggerControlPlugin extends AbstractDebuggerPlugin
} }
} }
private void valueLifespanChanged(TraceObjectValue value, Range<Long> oldLife, private void valueLifespanChanged(TraceObjectValue value, Lifespan oldLife,
Range<Long> newLife) { Lifespan newLife) {
if (newLife.contains(current.getSnap()) != oldLife.contains(current.getSnap())) { if (newLife.contains(current.getSnap()) != oldLife.contains(current.getSnap())) {
Swing.runIfSwingOrRunLater(() -> updateActionsEnabled()); Swing.runIfSwingOrRunLater(() -> updateActionsEnabled());
} }

View file

@ -27,8 +27,6 @@ import javax.swing.*;
import javax.swing.table.TableColumn; import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel; import javax.swing.table.TableColumnModel;
import com.google.common.collect.Range;
import docking.DialogComponentProvider; import docking.DialogComponentProvider;
import docking.widgets.table.*; import docking.widgets.table.*;
import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn; import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn;
@ -43,6 +41,7 @@ import ghidra.program.model.address.*;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.model.mem.Memory; import ghidra.program.model.mem.Memory;
import ghidra.program.model.mem.MemoryBlock; import ghidra.program.model.mem.MemoryBlock;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.TraceMemoryManager; import ghidra.trace.model.memory.TraceMemoryManager;
import ghidra.trace.model.memory.TraceMemoryRegion; import ghidra.trace.model.memory.TraceMemoryRegion;
import ghidra.trace.model.modules.*; import ghidra.trace.model.modules.*;
@ -632,21 +631,21 @@ public class DebuggerCopyIntoProgramDialog extends DialogComponentProvider {
protected String computeRegionString(AddressRange rng) { protected String computeRegionString(AddressRange rng) {
TraceMemoryManager mm = source.getTrace().getMemoryManager(); TraceMemoryManager mm = source.getTrace().getMemoryManager();
Collection<? extends TraceMemoryRegion> regions = Collection<? extends TraceMemoryRegion> regions =
mm.getRegionsIntersecting(Range.singleton(source.getSnap()), rng); mm.getRegionsIntersecting(Lifespan.at(source.getSnap()), rng);
return regions.isEmpty() ? "UNKNOWN" : regions.iterator().next().getName(); return regions.isEmpty() ? "UNKNOWN" : regions.iterator().next().getName();
} }
protected String computeModulesString(AddressRange rng) { protected String computeModulesString(AddressRange rng) {
TraceModuleManager mm = source.getTrace().getModuleManager(); TraceModuleManager mm = source.getTrace().getModuleManager();
Collection<? extends TraceModule> modules = Collection<? extends TraceModule> modules =
mm.getModulesIntersecting(Range.singleton(source.getSnap()), rng); mm.getModulesIntersecting(Lifespan.at(source.getSnap()), rng);
return modules.stream().map(m -> m.getName()).collect(Collectors.joining(",")); return modules.stream().map(m -> m.getName()).collect(Collectors.joining(","));
} }
protected String computeSectionsString(AddressRange rng) { protected String computeSectionsString(AddressRange rng) {
TraceModuleManager mm = source.getTrace().getModuleManager(); TraceModuleManager mm = source.getTrace().getModuleManager();
Collection<? extends TraceSection> sections = Collection<? extends TraceSection> sections =
mm.getSectionsIntersecting(Range.singleton(source.getSnap()), rng); mm.getSectionsIntersecting(Lifespan.at(source.getSnap()), rng);
return sections.stream().map(s -> s.getName()).collect(Collectors.joining(",")); return sections.stream().map(s -> s.getName()).collect(Collectors.joining(","));
} }
@ -705,7 +704,7 @@ public class DebuggerCopyIntoProgramDialog extends DialogComponentProvider {
List<AddressRange> result = new ArrayList<>(); List<AddressRange> result = new ArrayList<>();
for (TraceMemoryRegion region : source.getTrace() for (TraceMemoryRegion region : source.getTrace()
.getMemoryManager() .getMemoryManager()
.getRegionsIntersecting(Range.singleton(source.getSnap()), srcRange)) { .getRegionsIntersecting(Lifespan.at(source.getSnap()), srcRange)) {
AddressRange range = region.getRange().intersect(srcRange); AddressRange range = region.getRange().intersect(srcRange);
result.add(range); result.add(range);
remains.delete(range); remains.delete(range);

View file

@ -19,8 +19,6 @@ import java.util.*;
import javax.swing.JCheckBox; import javax.swing.JCheckBox;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.gui.DebuggerResources; import ghidra.app.plugin.core.debug.gui.DebuggerResources;
import ghidra.app.plugin.core.debug.service.breakpoint.LogicalBreakpointInternal.ProgramBreakpoint; import ghidra.app.plugin.core.debug.service.breakpoint.LogicalBreakpointInternal.ProgramBreakpoint;
import ghidra.app.util.viewer.listingpanel.PropertyBasedBackgroundColorModel; import ghidra.app.util.viewer.listingpanel.PropertyBasedBackgroundColorModel;
@ -29,6 +27,7 @@ import ghidra.program.model.address.*;
import ghidra.program.model.data.*; import ghidra.program.model.data.*;
import ghidra.program.model.listing.*; import ghidra.program.model.listing.*;
import ghidra.program.model.symbol.*; import ghidra.program.model.symbol.*;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.breakpoint.TraceBreakpoint; import ghidra.trace.model.breakpoint.TraceBreakpoint;
import ghidra.trace.model.memory.TraceMemoryManager; import ghidra.trace.model.memory.TraceMemoryManager;
import ghidra.trace.model.memory.TraceMemoryState; import ghidra.trace.model.memory.TraceMemoryState;
@ -222,7 +221,7 @@ public class DebuggerCopyPlan {
Address intoAddress, TaskMonitor monitor) throws Exception { Address intoAddress, TaskMonitor monitor) throws Exception {
for (TraceBreakpoint bpt : from.getTrace() for (TraceBreakpoint bpt : from.getTrace()
.getBreakpointManager() .getBreakpointManager()
.getBreakpointsIntersecting(Range.singleton(from.getSnap()), fromRange)) { .getBreakpointsIntersecting(Lifespan.at(from.getSnap()), fromRange)) {
monitor.checkCanceled(); monitor.checkCanceled();
long off = bpt.getMinAddress().subtract(fromRange.getMinAddress()); long off = bpt.getMinAddress().subtract(fromRange.getMinAddress());
Address dest = intoAddress.add(off); Address dest = intoAddress.add(off);

View file

@ -27,8 +27,6 @@ import javax.swing.*;
import javax.swing.table.TableColumn; import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel; import javax.swing.table.TableColumnModel;
import com.google.common.collect.Range;
import docking.ActionContext; import docking.ActionContext;
import docking.WindowPosition; import docking.WindowPosition;
import docking.action.*; import docking.action.*;
@ -52,9 +50,8 @@ import ghidra.program.model.listing.Program;
import ghidra.program.model.mem.MemoryBlock; import ghidra.program.model.mem.MemoryBlock;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.program.util.ProgramSelection; import ghidra.program.util.ProgramSelection;
import ghidra.trace.model.Trace; import ghidra.trace.model.*;
import ghidra.trace.model.Trace.TraceMemoryRegionChangeType; import ghidra.trace.model.Trace.TraceMemoryRegionChangeType;
import ghidra.trace.model.TraceDomainObjectListener;
import ghidra.trace.model.memory.TraceMemoryManager; import ghidra.trace.model.memory.TraceMemoryManager;
import ghidra.trace.model.memory.TraceMemoryRegion; import ghidra.trace.model.memory.TraceMemoryRegion;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
@ -114,7 +111,7 @@ public class DebuggerRegionsProvider extends ComponentProviderAdapter {
protected enum RegionTableColumns protected enum RegionTableColumns
implements EnumeratedTableColumn<RegionTableColumns, RegionRow> { implements EnumeratedTableColumn<RegionTableColumns, RegionRow> {
NAME("Name", String.class, RegionRow::getName, RegionRow::setName), NAME("Name", String.class, RegionRow::getName, RegionRow::setName),
LIFESPAN("Lifespan", Range.class, RegionRow::getLifespan), LIFESPAN("Lifespan", Lifespan.class, RegionRow::getLifespan),
START("Start", Address.class, RegionRow::getMinAddress), START("Start", Address.class, RegionRow::getMinAddress),
END("End", Address.class, RegionRow::getMaxAddress), END("End", Address.class, RegionRow::getMaxAddress),
LENGTH("Length", Long.class, RegionRow::getLength), LENGTH("Length", Long.class, RegionRow::getLength),
@ -538,7 +535,7 @@ public class DebuggerRegionsProvider extends ComponentProviderAdapter {
Set<TraceMemoryRegion> regSel = new HashSet<>(); Set<TraceMemoryRegion> regSel = new HashSet<>();
for (AddressRange range : progSel) { for (AddressRange range : progSel) {
regSel.addAll(memoryManager.getRegionsIntersecting( regSel.addAll(memoryManager.getRegionsIntersecting(
Range.singleton(traceManager.getCurrentSnap()), range)); Lifespan.at(traceManager.getCurrentSnap()), range));
} }
setSelectedRegions(regSel); setSelectedRegions(regSel);
return; return;

View file

@ -15,10 +15,9 @@
*/ */
package ghidra.app.plugin.core.debug.gui.memory; package ghidra.app.plugin.core.debug.gui.memory;
import com.google.common.collect.Range;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressRange; import ghidra.program.model.address.AddressRange;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.TraceMemoryRegion; import ghidra.trace.model.memory.TraceMemoryRegion;
import ghidra.util.database.UndoableTransaction; import ghidra.util.database.UndoableTransaction;
@ -44,7 +43,7 @@ public class RegionRow {
return region.getName(); return region.getName();
} }
public Range<Long> getLifespan() { public Lifespan getLifespan() {
return region.getLifespan(); return region.getLifespan();
} }

View file

@ -17,8 +17,6 @@ package ghidra.app.plugin.core.debug.gui.memview;
import java.util.*; import java.util.*;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.DebuggerCoordinates; import ghidra.app.plugin.core.debug.DebuggerCoordinates;
import ghidra.app.services.TraceRecorder; import ghidra.app.services.TraceRecorder;
import ghidra.async.AsyncDebouncer; import ghidra.async.AsyncDebouncer;
@ -156,10 +154,9 @@ public class DebuggerMemviewTraceListener extends TraceDomainObjectListener {
if (!trackBytes || !trackTrace) { if (!trackBytes || !trackTrace) {
return; return;
} }
Range<Long> lifespan = range.getLifespan(); Lifespan lifespan = range.getLifespan();
Range<Long> newspan = Range.closedOpen(lifespan.lowerEndpoint(), lifespan.lowerEndpoint());
MemoryBox box = new MemoryBox("BytesChanged " + range.description(), MemoryBox box = new MemoryBox("BytesChanged " + range.description(),
MemviewBoxType.WRITE_MEMORY, range.getRange(), newspan); MemviewBoxType.WRITE_MEMORY, range.getRange(), lifespan);
updateList.add(box); updateList.add(box);
updateLabelDebouncer.contact(null); updateLabelDebouncer.contact(null);
} }

View file

@ -20,9 +20,8 @@ import java.awt.Graphics;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.google.common.collect.Range;
import ghidra.program.model.address.AddressRange; import ghidra.program.model.address.AddressRange;
import ghidra.trace.model.Lifespan;
public class MemoryBox { public class MemoryBox {
@ -54,11 +53,9 @@ public class MemoryBox {
this.color = type.getColor(); this.color = type.getColor();
} }
public MemoryBox(String id, MemviewBoxType type, AddressRange range, Range<Long> trange) { public MemoryBox(String id, MemviewBoxType type, AddressRange range, Lifespan trange) {
this(id, type, range, trange.lowerEndpoint()); this(id, type, range, trange.lmin());
if (trange.hasUpperBound()) { setEnd(trange.lmax());
setEnd(trange.upperEndpoint());
}
} }
public String getId() { public String getId() {
@ -73,8 +70,8 @@ public class MemoryBox {
return range; return range;
} }
public Range<Long> getSpan() { public Lifespan getSpan() {
return Range.openClosed(start, stop); return Lifespan.span(start, stop);
} }
public long getStart() { public long getStart() {

View file

@ -19,16 +19,12 @@ import java.awt.Color;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.google.common.collect.Range;
import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener; import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener;
import docking.widgets.table.threaded.ThreadedTableModel; import docking.widgets.table.threaded.ThreadedTableModel;
import ghidra.framework.plugintool.Plugin; import ghidra.framework.plugintool.Plugin;
import ghidra.trace.database.DBTraceUtils; import ghidra.trace.model.*;
import ghidra.trace.model.Trace;
import ghidra.trace.model.Trace.TraceObjectChangeType; import ghidra.trace.model.Trace.TraceObjectChangeType;
import ghidra.trace.model.Trace.TraceSnapshotChangeType; import ghidra.trace.model.Trace.TraceSnapshotChangeType;
import ghidra.trace.model.TraceDomainObjectListener;
import ghidra.trace.model.target.TraceObject; import ghidra.trace.model.target.TraceObject;
import ghidra.trace.model.target.TraceObjectValue; import ghidra.trace.model.target.TraceObjectValue;
import ghidra.util.datastruct.Accumulator; import ghidra.util.datastruct.Accumulator;
@ -60,14 +56,14 @@ public abstract class AbstractQueryTableModel<T> extends ThreadedTableModel<T, T
} }
} }
protected void valueLifespanChanged(TraceObjectValue value, Range<Long> oldSpan, protected void valueLifespanChanged(TraceObjectValue value, Lifespan oldSpan,
Range<Long> newSpan) { Lifespan newSpan) {
if (query == null) { if (query == null) {
return; return;
} }
boolean inOld = DBTraceUtils.intersect(oldSpan, span); boolean inOld = span.intersects(oldSpan);
boolean inNew = DBTraceUtils.intersect(newSpan, span); boolean inNew = span.intersects(newSpan);
boolean queryIncludes = query.includes(Range.all(), value); boolean queryIncludes = query.includes(Lifespan.ALL, value);
if (queryIncludes) { if (queryIncludes) {
if (inOld != inNew) { if (inOld != inNew) {
reload(); reload();
@ -102,7 +98,7 @@ public abstract class AbstractQueryTableModel<T> extends ThreadedTableModel<T, T
private Trace diffTrace; private Trace diffTrace;
private long diffSnap; private long diffSnap;
private ModelQuery query; private ModelQuery query;
private Range<Long> span = Range.all(); private Lifespan span = Lifespan.ALL;
private boolean showHidden; private boolean showHidden;
private final ListenerForChanges listenerForChanges = newListenerForChanges(); private final ListenerForChanges listenerForChanges = newListenerForChanges();
@ -245,7 +241,7 @@ public abstract class AbstractQueryTableModel<T> extends ThreadedTableModel<T, T
reload(); reload();
} }
public void setSpan(Range<Long> span) { public void setSpan(Lifespan span) {
if (Objects.equals(this.span, span)) { if (Objects.equals(this.span, span)) {
return; return;
} }
@ -254,7 +250,7 @@ public abstract class AbstractQueryTableModel<T> extends ThreadedTableModel<T, T
spanChanged(); spanChanged();
} }
public Range<Long> getSpan() { public Lifespan getSpan() {
return span; return span;
} }
@ -275,7 +271,7 @@ public abstract class AbstractQueryTableModel<T> extends ThreadedTableModel<T, T
return showHidden; return showHidden;
} }
protected abstract Stream<T> streamRows(Trace trace, ModelQuery query, Range<Long> span); protected abstract Stream<T> streamRows(Trace trace, ModelQuery query, Lifespan span);
@Override @Override
protected void doLoad(Accumulator<T> accumulator, TaskMonitor monitor) protected void doLoad(Accumulator<T> accumulator, TaskMonitor monitor)

View file

@ -25,11 +25,10 @@ import javax.swing.JPanel;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionListener;
import com.google.common.collect.Range;
import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener; import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener;
import ghidra.app.plugin.core.debug.DebuggerCoordinates; import ghidra.app.plugin.core.debug.DebuggerCoordinates;
import ghidra.framework.plugintool.Plugin; import ghidra.framework.plugintool.Plugin;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.target.TraceObject; import ghidra.trace.model.target.TraceObject;
import ghidra.util.table.GhidraTable; import ghidra.util.table.GhidraTable;
import ghidra.util.table.GhidraTableFilterPanel; import ghidra.util.table.GhidraTableFilterPanel;
@ -71,7 +70,7 @@ public abstract class AbstractQueryTablePanel<T> extends JPanel {
tableModel.setDiffSnap(previous.getSnap()); tableModel.setDiffSnap(previous.getSnap());
tableModel.setSnap(current.getSnap()); tableModel.setSnap(current.getSnap());
if (limitToSnap) { if (limitToSnap) {
tableModel.setSpan(Range.singleton(current.getSnap())); tableModel.setSpan(Lifespan.at(current.getSnap()));
} }
} }
@ -92,7 +91,7 @@ public abstract class AbstractQueryTablePanel<T> extends JPanel {
return; return;
} }
this.limitToSnap = limitToSnap; this.limitToSnap = limitToSnap;
tableModel.setSpan(limitToSnap ? Range.singleton(current.getSnap()) : Range.all()); tableModel.setSpan(limitToSnap ? Lifespan.at(current.getSnap()) : Lifespan.ALL);
} }
public boolean isLimitToSnap() { public boolean isLimitToSnap() {

View file

@ -17,9 +17,8 @@ package ghidra.app.plugin.core.debug.gui.model;
import java.util.Objects; import java.util.Objects;
import com.google.common.collect.Range;
import ghidra.dbg.util.PathPredicates; import ghidra.dbg.util.PathPredicates;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.target.TraceObject; import ghidra.trace.model.target.TraceObject;
import ghidra.trace.model.target.TraceObjectValue; import ghidra.trace.model.target.TraceObjectValue;
@ -141,7 +140,7 @@ public interface DisplaysModified {
return isEdgesDiffer(newContains ? value : null, diffEdge); return isEdgesDiffer(newContains ? value : null, diffEdge);
} }
TraceObjectValue diffEdge = diffTrace.getObjectManager() TraceObjectValue diffEdge = diffTrace.getObjectManager()
.getValuePaths(Range.singleton(diffSnap), .getValuePaths(Lifespan.at(diffSnap),
PathPredicates.pattern(value.getCanonicalPath().getKeyList())) PathPredicates.pattern(value.getCanonicalPath().getKeyList()))
.findAny() .findAny()
.map(p -> p.getLastEntry()) .map(p -> p.getLastEntry())

View file

@ -19,12 +19,11 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.google.common.collect.Range;
import ghidra.dbg.target.schema.TargetObjectSchema; import ghidra.dbg.target.schema.TargetObjectSchema;
import ghidra.dbg.target.schema.TargetObjectSchema.AttributeSchema; import ghidra.dbg.target.schema.TargetObjectSchema.AttributeSchema;
import ghidra.dbg.util.*; import ghidra.dbg.util.*;
import ghidra.trace.database.DBTraceUtils; import ghidra.trace.database.DBTraceUtils;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.target.*; import ghidra.trace.model.target.*;
@ -92,7 +91,7 @@ public class ModelQuery {
* @param span the span of snapshots to search, usually all or a singleton * @param span the span of snapshots to search, usually all or a singleton
* @return the stream of resulting objects * @return the stream of resulting objects
*/ */
public Stream<TraceObject> streamObjects(Trace trace, Range<Long> span) { public Stream<TraceObject> streamObjects(Trace trace, Lifespan span) {
TraceObjectManager objects = trace.getObjectManager(); TraceObjectManager objects = trace.getObjectManager();
TraceObject root = objects.getRootObject(); TraceObject root = objects.getRootObject();
return objects.getValuePaths(span, predicates) return objects.getValuePaths(span, predicates)
@ -101,7 +100,7 @@ public class ModelQuery {
.map(v -> (TraceObject) v); .map(v -> (TraceObject) v);
} }
public Stream<TraceObjectValue> streamValues(Trace trace, Range<Long> span) { public Stream<TraceObjectValue> streamValues(Trace trace, Lifespan span) {
TraceObjectManager objects = trace.getObjectManager(); TraceObjectManager objects = trace.getObjectManager();
return objects.getValuePaths(span, predicates).map(p -> { return objects.getValuePaths(span, predicates).map(p -> {
TraceObjectValue last = p.getLastEntry(); TraceObjectValue last = p.getLastEntry();
@ -109,7 +108,7 @@ public class ModelQuery {
}); });
} }
public Stream<TraceObjectValPath> streamPaths(Trace trace, Range<Long> span) { public Stream<TraceObjectValPath> streamPaths(Trace trace, Lifespan span) {
return trace.getObjectManager().getValuePaths(span, predicates).map(p -> p); return trace.getObjectManager().getValuePaths(span, predicates).map(p -> p);
} }
@ -144,7 +143,7 @@ public class ModelQuery {
* @param value the value to examine * @param value the value to examine
* @return true if the value would be accepted * @return true if the value would be accepted
*/ */
public boolean includes(Range<Long> span, TraceObjectValue value) { public boolean includes(Lifespan span, TraceObjectValue value) {
List<String> path = predicates.getSingletonPattern().asPath(); List<String> path = predicates.getSingletonPattern().asPath();
if (path.isEmpty()) { if (path.isEmpty()) {
return value.getParent() == null; return value.getParent() == null;
@ -152,7 +151,7 @@ public class ModelQuery {
if (!PathPredicates.keyMatches(PathUtils.getKey(path), value.getEntryKey())) { if (!PathPredicates.keyMatches(PathUtils.getKey(path), value.getEntryKey())) {
return false; return false;
} }
if (!DBTraceUtils.intersect(span, value.getLifespan())) { if (!span.intersects(value.getLifespan())) {
return false; return false;
} }
TraceObject parent = value.getParent(); TraceObject parent = value.getParent();

View file

@ -20,8 +20,6 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.google.common.collect.*;
import docking.widgets.table.DynamicTableColumn; import docking.widgets.table.DynamicTableColumn;
import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener; import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener;
import docking.widgets.table.TableColumnDescriptor; import docking.widgets.table.TableColumnDescriptor;
@ -31,6 +29,8 @@ import ghidra.dbg.target.schema.SchemaContext;
import ghidra.dbg.target.schema.TargetObjectSchema; import ghidra.dbg.target.schema.TargetObjectSchema;
import ghidra.dbg.target.schema.TargetObjectSchema.AttributeSchema; import ghidra.dbg.target.schema.TargetObjectSchema.AttributeSchema;
import ghidra.framework.plugintool.Plugin; import ghidra.framework.plugintool.Plugin;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Lifespan.*;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.target.TraceObject; import ghidra.trace.model.target.TraceObject;
import ghidra.trace.model.target.TraceObjectValue; import ghidra.trace.model.target.TraceObjectValue;
@ -55,7 +55,7 @@ public class ObjectTableModel extends AbstractQueryTableModel<ValueRow> {
public interface ValueRow { public interface ValueRow {
String getKey(); String getKey();
RangeSet<Long> getLife(); LifeSet getLife();
TraceObjectValue getValue(); TraceObjectValue getValue();
@ -112,8 +112,8 @@ public class ObjectTableModel extends AbstractQueryTableModel<ValueRow> {
} }
@Override @Override
public RangeSet<Long> getLife() { public LifeSet getLife() {
RangeSet<Long> life = TreeRangeSet.create(); MutableLifeSet life = new DefaultLifeSet();
life.add(value.getLifespan()); life.add(value.getLifespan());
return life; return life;
} }
@ -306,7 +306,7 @@ public class ObjectTableModel extends AbstractQueryTableModel<ValueRow> {
protected void updateTimelineMax() { protected void updateTimelineMax() {
Long max = getTrace() == null ? null : getTrace().getTimeManager().getMaxSnap(); Long max = getTrace() == null ? null : getTrace().getTimeManager().getMaxSnap();
Range<Long> fullRange = Range.closed(0L, max == null ? 1 : max + 1); Lifespan fullRange = Lifespan.span(0L, max == null ? 1 : max + 1);
lifePlotColumn.setFullRange(fullRange); lifePlotColumn.setFullRange(fullRange);
} }
@ -379,7 +379,7 @@ public class ObjectTableModel extends AbstractQueryTableModel<ValueRow> {
} }
@Override @Override
protected Stream<ValueRow> streamRows(Trace trace, ModelQuery query, Range<Long> span) { protected Stream<ValueRow> streamRows(Trace trace, ModelQuery query, Lifespan span) {
return distinctCanonical(query.streamValues(trace, span) return distinctCanonical(query.streamValues(trace, span)
.filter(v -> isShowHidden() || !v.isHidden())) .filter(v -> isShowHidden() || !v.isHidden()))
.map(this::rowForValue); .map(this::rowForValue);

View file

@ -20,17 +20,13 @@ import java.util.stream.Collectors;
import javax.swing.Icon; import javax.swing.Icon;
import com.google.common.collect.Range;
import docking.widgets.tree.GTreeLazyNode; import docking.widgets.tree.GTreeLazyNode;
import docking.widgets.tree.GTreeNode; import docking.widgets.tree.GTreeNode;
import ghidra.app.plugin.core.debug.gui.DebuggerResources; import ghidra.app.plugin.core.debug.gui.DebuggerResources;
import ghidra.dbg.target.*; import ghidra.dbg.target.*;
import ghidra.framework.model.DomainObjectClosedListener; import ghidra.framework.model.DomainObjectClosedListener;
import ghidra.trace.database.DBTraceUtils; import ghidra.trace.model.*;
import ghidra.trace.model.Trace;
import ghidra.trace.model.Trace.TraceObjectChangeType; import ghidra.trace.model.Trace.TraceObjectChangeType;
import ghidra.trace.model.TraceDomainObjectListener;
import ghidra.trace.model.target.*; import ghidra.trace.model.target.*;
import ghidra.util.HTMLUtilities; import ghidra.util.HTMLUtilities;
import ghidra.util.datastruct.WeakValueHashMap; import ghidra.util.datastruct.WeakValueHashMap;
@ -85,7 +81,7 @@ public class ObjectTreeModel implements DisplaysModified {
} }
private void valueCreated(TraceObjectValue value) { private void valueCreated(TraceObjectValue value) {
if (!DBTraceUtils.intersect(value.getLifespan(), span)) { if (!value.getLifespan().intersects(span)) {
return; return;
} }
AbstractNode node = nodeCache.getByObject(value.getParent()); AbstractNode node = nodeCache.getByObject(value.getParent());
@ -102,7 +98,7 @@ public class ObjectTreeModel implements DisplaysModified {
} }
private void valueDeleted(TraceObjectValue value) { private void valueDeleted(TraceObjectValue value) {
if (!DBTraceUtils.intersect(value.getLifespan(), span)) { if (!value.getLifespan().intersects(span)) {
return; return;
} }
AbstractNode node = nodeCache.getByObject(value.getParent()); AbstractNode node = nodeCache.getByObject(value.getParent());
@ -118,10 +114,10 @@ public class ObjectTreeModel implements DisplaysModified {
node.childDeleted(value); node.childDeleted(value);
} }
private void valueLifespanChanged(TraceObjectValue value, Range<Long> oldSpan, private void valueLifespanChanged(TraceObjectValue value, Lifespan oldSpan,
Range<Long> newSpan) { Lifespan newSpan) {
boolean inOld = DBTraceUtils.intersect(oldSpan, span); boolean inOld = oldSpan.intersects(span);
boolean inNew = DBTraceUtils.intersect(newSpan, span); boolean inNew = newSpan.intersects(span);
if (inOld == inNew) { if (inOld == inNew) {
return; return;
} }
@ -488,7 +484,7 @@ public class ObjectTreeModel implements DisplaysModified {
private long snap; private long snap;
private Trace diffTrace; private Trace diffTrace;
private long diffSnap; private long diffSnap;
private Range<Long> span = Range.all(); private Lifespan span = Lifespan.ALL;
private boolean showHidden; private boolean showHidden;
private boolean showPrimitives; private boolean showPrimitives;
private boolean showMethods; private boolean showMethods;
@ -589,7 +585,7 @@ public class ObjectTreeModel implements DisplaysModified {
if (!showMethods && value.isObject() && value.getChild().isMethod(snap)) { if (!showMethods && value.isObject() && value.getChild().isMethod(snap)) {
return false; return false;
} }
if (!DBTraceUtils.intersect(value.getLifespan(), span)) { if (!value.getLifespan().intersects(span)) {
return false; return false;
} }
return true; return true;
@ -737,7 +733,7 @@ public class ObjectTreeModel implements DisplaysModified {
reload(); reload();
} }
public void setSpan(Range<Long> span) { public void setSpan(Lifespan span) {
if (Objects.equals(this.span, span)) { if (Objects.equals(this.span, span)) {
return; return;
} }
@ -745,7 +741,7 @@ public class ObjectTreeModel implements DisplaysModified {
spanChanged(); spanChanged();
} }
public Range<Long> getSpan() { public Lifespan getSpan() {
return span; return span;
} }

View file

@ -25,8 +25,6 @@ import javax.swing.JPanel;
import javax.swing.JTree; import javax.swing.JTree;
import javax.swing.tree.TreePath; import javax.swing.tree.TreePath;
import com.google.common.collect.Range;
import docking.widgets.tree.GTree; import docking.widgets.tree.GTree;
import docking.widgets.tree.support.GTreeRenderer; import docking.widgets.tree.support.GTreeRenderer;
import docking.widgets.tree.support.GTreeSelectionEvent.EventOrigin; import docking.widgets.tree.support.GTreeSelectionEvent.EventOrigin;
@ -34,6 +32,7 @@ import docking.widgets.tree.support.GTreeSelectionListener;
import ghidra.app.plugin.core.debug.DebuggerCoordinates; import ghidra.app.plugin.core.debug.DebuggerCoordinates;
import ghidra.app.plugin.core.debug.gui.DebuggerResources; import ghidra.app.plugin.core.debug.gui.DebuggerResources;
import ghidra.app.plugin.core.debug.gui.model.ObjectTreeModel.AbstractNode; import ghidra.app.plugin.core.debug.gui.model.ObjectTreeModel.AbstractNode;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.target.TraceObjectKeyPath; import ghidra.trace.model.target.TraceObjectKeyPath;
@ -125,7 +124,7 @@ public class ObjectsTreePanel extends JPanel {
treeModel.setDiffSnap(previous.getSnap()); treeModel.setDiffSnap(previous.getSnap());
treeModel.setSnap(current.getSnap()); treeModel.setSnap(current.getSnap());
if (limitToSnap) { if (limitToSnap) {
treeModel.setSpan(Range.singleton(current.getSnap())); treeModel.setSpan(Lifespan.at(current.getSnap()));
} }
tree.filterChanged(); tree.filterChanged();
} }
@ -137,7 +136,7 @@ public class ObjectsTreePanel extends JPanel {
} }
this.limitToSnap = limitToSnap; this.limitToSnap = limitToSnap;
try (KeepTreeState keep = keepTreeState()) { try (KeepTreeState keep = keepTreeState()) {
treeModel.setSpan(limitToSnap ? Range.singleton(current.getSnap()) : Range.all()); treeModel.setSpan(limitToSnap ? Lifespan.at(current.getSnap()) : Lifespan.ALL);
} }
} }

View file

@ -19,13 +19,12 @@ import java.awt.Color;
import java.util.*; import java.util.*;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.google.common.collect.Range;
import docking.widgets.table.TableColumnDescriptor;
import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener; import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener;
import docking.widgets.table.TableColumnDescriptor;
import ghidra.app.plugin.core.debug.gui.model.PathTableModel.PathRow; import ghidra.app.plugin.core.debug.gui.model.PathTableModel.PathRow;
import ghidra.app.plugin.core.debug.gui.model.columns.*; import ghidra.app.plugin.core.debug.gui.model.columns.*;
import ghidra.framework.plugintool.Plugin; import ghidra.framework.plugintool.Plugin;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.target.*; import ghidra.trace.model.target.*;
@ -104,7 +103,7 @@ public class PathTableModel extends AbstractQueryTableModel<PathRow> {
protected void updateTimelineMax() { protected void updateTimelineMax() {
Long max = getTrace() == null ? null : getTrace().getTimeManager().getMaxSnap(); Long max = getTrace() == null ? null : getTrace().getTimeManager().getMaxSnap();
Range<Long> fullRange = Range.closed(0L, max == null ? 1 : max + 1); Lifespan fullRange = Lifespan.span(0L, max == null ? 1 : max + 1);
lifespanPlotColumn.setFullRange(fullRange); lifespanPlotColumn.setFullRange(fullRange);
} }
@ -131,7 +130,7 @@ public class PathTableModel extends AbstractQueryTableModel<PathRow> {
} }
@Override @Override
protected Stream<PathRow> streamRows(Trace trace, ModelQuery query, Range<Long> span) { protected Stream<PathRow> streamRows(Trace trace, ModelQuery query, Lifespan span) {
// TODO: For queries with early wildcards, this is not efficient // TODO: For queries with early wildcards, this is not efficient
// May need to incorporate filtering hidden into the query execution itself. // May need to incorporate filtering hidden into the query execution itself.
return distinctKeyPath(query.streamPaths(trace, span) return distinctKeyPath(query.streamPaths(trace, span)

View file

@ -15,17 +15,16 @@
*/ */
package ghidra.app.plugin.core.debug.gui.model.columns; package ghidra.app.plugin.core.debug.gui.model.columns;
import com.google.common.collect.Range;
import docking.widgets.table.AbstractDynamicTableColumn; import docking.widgets.table.AbstractDynamicTableColumn;
import ghidra.app.plugin.core.debug.gui.model.PathTableModel.PathRow; import ghidra.app.plugin.core.debug.gui.model.PathTableModel.PathRow;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.target.TraceObjectValue; import ghidra.trace.model.target.TraceObjectValue;
public class TracePathLastLifespanColumn public class TracePathLastLifespanColumn
extends AbstractDynamicTableColumn<PathRow, Range<Long>, Trace> { extends AbstractDynamicTableColumn<PathRow, Lifespan, Trace> {
@Override @Override
public String getColumnName() { public String getColumnName() {
@ -33,11 +32,11 @@ public class TracePathLastLifespanColumn
} }
@Override @Override
public Range<Long> getValue(PathRow rowObject, Settings settings, Trace data, public Lifespan getValue(PathRow rowObject, Settings settings, Trace data,
ServiceProvider serviceProvider) throws IllegalArgumentException { ServiceProvider serviceProvider) throws IllegalArgumentException {
TraceObjectValue lastEntry = rowObject.getPath().getLastEntry(); TraceObjectValue lastEntry = rowObject.getPath().getLastEntry();
if (lastEntry == null) { if (lastEntry == null) {
return Range.all(); return Lifespan.ALL;
} }
return lastEntry.getLifespan(); return lastEntry.getLifespan();
} }

View file

@ -15,21 +15,21 @@
*/ */
package ghidra.app.plugin.core.debug.gui.model.columns; package ghidra.app.plugin.core.debug.gui.model.columns;
import com.google.common.collect.Range;
import docking.widgets.table.*; import docking.widgets.table.*;
import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener; import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener;
import generic.Span;
import ghidra.app.plugin.core.debug.gui.model.PathTableModel.PathRow; import ghidra.app.plugin.core.debug.gui.model.PathTableModel.PathRow;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.target.TraceObjectValue; import ghidra.trace.model.target.TraceObjectValue;
import ghidra.util.table.column.GColumnRenderer; import ghidra.util.table.column.GColumnRenderer;
public class TracePathLastLifespanPlotColumn public class TracePathLastLifespanPlotColumn
extends AbstractDynamicTableColumn<PathRow, Range<Long>, Trace> { extends AbstractDynamicTableColumn<PathRow, Span<Long, ?>, Trace> {
private final RangeTableCellRenderer<Long> cellRenderer = new RangeTableCellRenderer<>(); private final SpanTableCellRenderer<Long> cellRenderer = new SpanTableCellRenderer<>();
private final RangeCursorTableHeaderRenderer<Long> headerRenderer = private final RangeCursorTableHeaderRenderer<Long> headerRenderer =
new RangeCursorTableHeaderRenderer<>(); new RangeCursorTableHeaderRenderer<>();
@ -39,17 +39,17 @@ public class TracePathLastLifespanPlotColumn
} }
@Override @Override
public Range<Long> getValue(PathRow rowObject, Settings settings, Trace data, public Lifespan getValue(PathRow rowObject, Settings settings, Trace data,
ServiceProvider serviceProvider) throws IllegalArgumentException { ServiceProvider serviceProvider) throws IllegalArgumentException {
TraceObjectValue lastEntry = rowObject.getPath().getLastEntry(); TraceObjectValue lastEntry = rowObject.getPath().getLastEntry();
if (lastEntry == null) { if (lastEntry == null) {
return Range.all(); return Lifespan.ALL;
} }
return lastEntry.getLifespan(); return lastEntry.getLifespan();
} }
@Override @Override
public GColumnRenderer<Range<Long>> getColumnRenderer() { public GColumnRenderer<Span<Long, ?>> getColumnRenderer() {
return cellRenderer; return cellRenderer;
} }
@ -58,7 +58,7 @@ public class TracePathLastLifespanPlotColumn
return headerRenderer; return headerRenderer;
} }
public void setFullRange(Range<Long> fullRange) { public void setFullRange(Lifespan fullRange) {
cellRenderer.setFullRange(fullRange); cellRenderer.setFullRange(fullRange);
headerRenderer.setFullRange(fullRange); headerRenderer.setFullRange(fullRange);
} }

View file

@ -15,16 +15,15 @@
*/ */
package ghidra.app.plugin.core.debug.gui.model.columns; package ghidra.app.plugin.core.debug.gui.model.columns;
import com.google.common.collect.RangeSet;
import docking.widgets.table.AbstractDynamicTableColumn; import docking.widgets.table.AbstractDynamicTableColumn;
import ghidra.app.plugin.core.debug.gui.model.ObjectTableModel.ValueRow; import ghidra.app.plugin.core.debug.gui.model.ObjectTableModel.ValueRow;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.trace.model.Lifespan.LifeSet;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
public class TraceValueLifeColumn public class TraceValueLifeColumn
extends AbstractDynamicTableColumn<ValueRow, RangeSet<Long>, Trace> { extends AbstractDynamicTableColumn<ValueRow, LifeSet, Trace> {
@Override @Override
public String getColumnName() { public String getColumnName() {
@ -32,7 +31,7 @@ public class TraceValueLifeColumn
} }
@Override @Override
public RangeSet<Long> getValue(ValueRow rowObject, Settings settings, Trace data, public LifeSet getValue(ValueRow rowObject, Settings settings, Trace data,
ServiceProvider serviceProvider) throws IllegalArgumentException { ServiceProvider serviceProvider) throws IllegalArgumentException {
return rowObject.getLife(); return rowObject.getLife();
} }

View file

@ -15,21 +15,21 @@
*/ */
package ghidra.app.plugin.core.debug.gui.model.columns; package ghidra.app.plugin.core.debug.gui.model.columns;
import com.google.common.collect.Range;
import com.google.common.collect.RangeSet;
import docking.widgets.table.*; import docking.widgets.table.*;
import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener; import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener;
import generic.Span.SpanSet;
import ghidra.app.plugin.core.debug.gui.model.ObjectTableModel.ValueRow; import ghidra.app.plugin.core.debug.gui.model.ObjectTableModel.ValueRow;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Lifespan.LifeSet;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.util.table.column.GColumnRenderer; import ghidra.util.table.column.GColumnRenderer;
public class TraceValueLifePlotColumn public class TraceValueLifePlotColumn
extends AbstractDynamicTableColumn<ValueRow, RangeSet<Long>, Trace> { extends AbstractDynamicTableColumn<ValueRow, SpanSet<Long,?>, Trace> {
private final RangeSetTableCellRenderer<Long> cellRenderer = new RangeSetTableCellRenderer<>(); private final SpanSetTableCellRenderer<Long> cellRenderer = new SpanSetTableCellRenderer<>();
private final RangeCursorTableHeaderRenderer<Long> headerRenderer = private final RangeCursorTableHeaderRenderer<Long> headerRenderer =
new RangeCursorTableHeaderRenderer<>(); new RangeCursorTableHeaderRenderer<>();
@ -39,13 +39,13 @@ public class TraceValueLifePlotColumn
} }
@Override @Override
public RangeSet<Long> getValue(ValueRow rowObject, Settings settings, Trace data, public LifeSet getValue(ValueRow rowObject, Settings settings, Trace data,
ServiceProvider serviceProvider) throws IllegalArgumentException { ServiceProvider serviceProvider) throws IllegalArgumentException {
return rowObject.getLife(); return rowObject.getLife();
} }
@Override @Override
public GColumnRenderer<RangeSet<Long>> getColumnRenderer() { public GColumnRenderer<SpanSet<Long,?>> getColumnRenderer() {
return cellRenderer; return cellRenderer;
} }
@ -54,7 +54,7 @@ public class TraceValueLifePlotColumn
return headerRenderer; return headerRenderer;
} }
public void setFullRange(Range<Long> fullRange) { public void setFullRange(Lifespan fullRange) {
cellRenderer.setFullRange(fullRange); cellRenderer.setFullRange(fullRange);
headerRenderer.setFullRange(fullRange); headerRenderer.setFullRange(fullRange);
} }

View file

@ -23,11 +23,9 @@ import java.math.BigInteger;
import javax.swing.*; import javax.swing.*;
import javax.swing.border.EmptyBorder; import javax.swing.border.EmptyBorder;
import com.google.common.collect.Range;
import docking.DialogComponentProvider; import docking.DialogComponentProvider;
import docking.widgets.model.GAddressRangeField; import docking.widgets.model.GAddressRangeField;
import docking.widgets.model.GLifespanField; import docking.widgets.model.GSpanField;
import ghidra.app.services.DebuggerStaticMappingService; import ghidra.app.services.DebuggerStaticMappingService;
import ghidra.framework.model.DomainFile; import ghidra.framework.model.DomainFile;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
@ -51,7 +49,7 @@ public class DebuggerAddMappingDialog extends DialogComponentProvider {
private final JLabel labelTrace = new JLabel(); private final JLabel labelTrace = new JLabel();
private final GAddressRangeField fieldTraceRange = new GAddressRangeField(); private final GAddressRangeField fieldTraceRange = new GAddressRangeField();
private final JTextField fieldLength = new JTextField(); private final JTextField fieldLength = new JTextField();
private final GLifespanField fieldSpan = new GLifespanField(); private final GSpanField fieldSpan = new GSpanField();
public DebuggerAddMappingDialog() { public DebuggerAddMappingDialog() {
super("Add Static Mapping", false, false, true, false); super("Add Static Mapping", false, false, true, false);
@ -316,7 +314,7 @@ public class DebuggerAddMappingDialog extends DialogComponentProvider {
* @throws AddressOverflowException if the length is too large for either space * @throws AddressOverflowException if the length is too large for either space
*/ */
public void setValues(Program program, Trace trace, Address progStart, public void setValues(Program program, Trace trace, Address progStart,
Address traceStart, long length, Range<Long> lifespan) throws AddressOverflowException { Address traceStart, long length, Lifespan lifespan) throws AddressOverflowException {
// NB. This dialog will not validate these. The caller is responsible. // NB. This dialog will not validate these. The caller is responsible.
this.program = program; this.program = program;
this.trace = trace; this.trace = trace;

View file

@ -28,8 +28,6 @@ import javax.swing.*;
import javax.swing.table.TableColumn; import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel; import javax.swing.table.TableColumnModel;
import com.google.common.collect.Range;
import docking.*; import docking.*;
import docking.action.*; import docking.action.*;
import docking.action.builder.ActionBuilder; import docking.action.builder.ActionBuilder;
@ -61,10 +59,9 @@ import ghidra.program.model.listing.Program;
import ghidra.program.model.mem.MemoryBlock; import ghidra.program.model.mem.MemoryBlock;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.program.util.ProgramSelection; import ghidra.program.util.ProgramSelection;
import ghidra.trace.model.Trace; import ghidra.trace.model.*;
import ghidra.trace.model.Trace.TraceModuleChangeType; import ghidra.trace.model.Trace.TraceModuleChangeType;
import ghidra.trace.model.Trace.TraceSectionChangeType; import ghidra.trace.model.Trace.TraceSectionChangeType;
import ghidra.trace.model.TraceDomainObjectListener;
import ghidra.trace.model.modules.*; import ghidra.trace.model.modules.*;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
import ghidra.util.Msg; import ghidra.util.Msg;
@ -188,7 +185,7 @@ public class DebuggerModulesProvider extends ComponentProviderAdapter {
MAX("Max Address", Address.class, ModuleRow::getMaxAddress), MAX("Max Address", Address.class, ModuleRow::getMaxAddress),
SHORT_NAME("Name", String.class, ModuleRow::getShortName), SHORT_NAME("Name", String.class, ModuleRow::getShortName),
NAME("Module Name", String.class, ModuleRow::getName, ModuleRow::setName), NAME("Module Name", String.class, ModuleRow::getName, ModuleRow::setName),
LIFESPAN("Lifespan", Range.class, ModuleRow::getLifespan), LIFESPAN("Lifespan", Lifespan.class, ModuleRow::getLifespan),
LENGTH("Length", Long.class, ModuleRow::getLength); LENGTH("Length", Long.class, ModuleRow::getLength);
private final String header; private final String header;
@ -989,7 +986,7 @@ public class DebuggerModulesProvider extends ComponentProviderAdapter {
return; return;
} }
staticMappingService.addIdentityMapping(currentTrace, currentProgram, staticMappingService.addIdentityMapping(currentTrace, currentProgram,
Range.atLeast(traceManager.getCurrentSnap()), true); Lifespan.nowOn(traceManager.getCurrentSnap()), true);
} }
private void activatedMapManually(ActionContext ignored) { private void activatedMapManually(ActionContext ignored) {
@ -1087,13 +1084,13 @@ public class DebuggerModulesProvider extends ComponentProviderAdapter {
Set<TraceSection> sectionSel = new HashSet<>(); Set<TraceSection> sectionSel = new HashSet<>();
for (AddressRange range : progSel) { for (AddressRange range : progSel) {
for (TraceModule module : moduleManager for (TraceModule module : moduleManager
.getModulesIntersecting(Range.singleton(snap), range)) { .getModulesIntersecting(Lifespan.at(snap), range)) {
if (module.getSections().isEmpty()) { if (module.getSections().isEmpty()) {
modSel.add(module); modSel.add(module);
} }
} }
for (TraceSection section : moduleManager for (TraceSection section : moduleManager
.getSectionsIntersecting(Range.singleton(snap), range)) { .getSectionsIntersecting(Lifespan.at(snap), range)) {
sectionSel.add(section); sectionSel.add(section);
modSel.add(section.getModule()); modSel.add(section.getModule());
} }

View file

@ -27,8 +27,6 @@ import javax.swing.*;
import javax.swing.table.TableColumn; import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel; import javax.swing.table.TableColumnModel;
import com.google.common.collect.Range;
import docking.ActionContext; import docking.ActionContext;
import docking.action.DockingAction; import docking.action.DockingAction;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
@ -48,9 +46,8 @@ import ghidra.program.model.address.*;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.program.util.ProgramSelection; import ghidra.program.util.ProgramSelection;
import ghidra.trace.model.Trace; import ghidra.trace.model.*;
import ghidra.trace.model.Trace.TraceStaticMappingChangeType; import ghidra.trace.model.Trace.TraceStaticMappingChangeType;
import ghidra.trace.model.TraceDomainObjectListener;
import ghidra.trace.model.modules.TraceStaticMapping; import ghidra.trace.model.modules.TraceStaticMapping;
import ghidra.trace.model.modules.TraceStaticMappingManager; import ghidra.trace.model.modules.TraceStaticMappingManager;
import ghidra.trace.model.program.TraceProgramView; import ghidra.trace.model.program.TraceProgramView;
@ -69,7 +66,7 @@ public class DebuggerStaticMappingProvider extends ComponentProviderAdapter
STATIC_ADDRESS("Static Address", String.class, StaticMappingRow::getStaticAddress), STATIC_ADDRESS("Static Address", String.class, StaticMappingRow::getStaticAddress),
LENGTH("Length", BigInteger.class, StaticMappingRow::getBigLength), LENGTH("Length", BigInteger.class, StaticMappingRow::getBigLength),
SHIFT("Shift", Long.class, StaticMappingRow::getShift), SHIFT("Shift", Long.class, StaticMappingRow::getShift),
LIFESPAN("Lifespan", Range.class, StaticMappingRow::getLifespan); LIFESPAN("Lifespan", Lifespan.class, StaticMappingRow::getLifespan);
private final String header; private final String header;
private final Class<?> cls; private final Class<?> cls;
@ -293,7 +290,7 @@ public class DebuggerStaticMappingProvider extends ComponentProviderAdapter
try { try {
addMappingDialog.setValues(progLoc.getProgram(), currentTrace, progStart, traceStart, addMappingDialog.setValues(progLoc.getProgram(), currentTrace, progStart, traceStart,
length, Range.atLeast(view.getSnap())); length, Lifespan.nowOn(view.getSnap()));
} }
catch (AddressOverflowException e) { catch (AddressOverflowException e) {
Msg.showError(this, null, "Add Mapping", "Error populating dialog"); Msg.showError(this, null, "Add Mapping", "Error populating dialog");
@ -323,7 +320,7 @@ public class DebuggerStaticMappingProvider extends ComponentProviderAdapter
Set<TraceStaticMapping> mappingSel = new HashSet<>(); Set<TraceStaticMapping> mappingSel = new HashSet<>();
for (AddressRange range : progSel) { for (AddressRange range : progSel) {
mappingSel.addAll(mappingManager.findAllOverlapping(range, mappingSel.addAll(mappingManager.findAllOverlapping(range,
Range.singleton(traceManager.getCurrentSnap()))); Lifespan.at(traceManager.getCurrentSnap())));
} }
setSelectedMappings(mappingSel); setSelectedMappings(mappingSel);
return; return;

View file

@ -15,9 +15,8 @@
*/ */
package ghidra.app.plugin.core.debug.gui.modules; package ghidra.app.plugin.core.debug.gui.modules;
import com.google.common.collect.Range;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.modules.TraceModule; import ghidra.trace.model.modules.TraceModule;
import ghidra.util.database.UndoableTransaction; import ghidra.util.database.UndoableTransaction;
@ -73,7 +72,7 @@ public class ModuleRow {
return snap == Long.MAX_VALUE ? null : snap; return snap == Long.MAX_VALUE ? null : snap;
} }
public Range<Long> getLifespan() { public Lifespan getLifespan() {
return module.getLifespan(); return module.getLifespan();
} }

View file

@ -18,9 +18,8 @@ package ghidra.app.plugin.core.debug.gui.modules;
import java.math.BigInteger; import java.math.BigInteger;
import java.net.URL; import java.net.URL;
import com.google.common.collect.Range;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.modules.TraceStaticMapping; import ghidra.trace.model.modules.TraceStaticMapping;
@ -73,7 +72,7 @@ public class StaticMappingRow {
return mapping.getShift(); return mapping.getShift();
} }
public Range<Long> getLifespan() { public Lifespan getLifespan() {
return mapping.getLifespan(); return mapping.getLifespan();
} }
} }

View file

@ -31,8 +31,6 @@ import javax.swing.table.TableColumnModel;
import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.exception.ExceptionUtils;
import com.google.common.collect.Range;
import docking.*; import docking.*;
import docking.action.*; import docking.action.*;
import docking.action.builder.ActionBuilder; import docking.action.builder.ActionBuilder;
@ -76,7 +74,8 @@ import ghidra.trace.model.memory.*;
import ghidra.trace.model.program.TraceProgramView; import ghidra.trace.model.program.TraceProgramView;
import ghidra.trace.model.target.TraceObject; import ghidra.trace.model.target.TraceObject;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.trace.util.*; import ghidra.trace.util.TraceAddressSpace;
import ghidra.trace.util.TraceRegisterUtils;
import ghidra.util.*; import ghidra.util.*;
import ghidra.util.classfinder.ClassSearcher; import ghidra.util.classfinder.ClassSearcher;
import ghidra.util.data.DataTypeParser.AllowedDataTypes; import ghidra.util.data.DataTypeParser.AllowedDataTypes;
@ -346,7 +345,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
} }
private void registerTypeLifespanChanged(TraceAddressSpace space, TraceCodeUnit unit, private void registerTypeLifespanChanged(TraceAddressSpace space, TraceCodeUnit unit,
Range<Long> oldSpan, Range<Long> newSpan) { Lifespan oldSpan, Lifespan newSpan) {
if (!isVisible(space)) { if (!isVisible(space)) {
return; return;
} }
@ -375,7 +374,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
//checkEditsEnabled(); //checkEditsEnabled();
} }
private void threadDestroyed(TraceThread thread, Range<Long> oldSpan, Range<Long> newSpan) { private void threadDestroyed(TraceThread thread, Lifespan oldSpan, Lifespan newSpan) {
//checkEditsEnabled(); //checkEditsEnabled();
} }
} }
@ -925,9 +924,9 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
long snap = current.getViewSnap(); long snap = current.getViewSnap();
TracePlatform platform = current.getPlatform(); TracePlatform platform = current.getPlatform();
space.definedUnits() space.definedUnits()
.clear(platform, Range.closed(snap, snap), register, TaskMonitor.DUMMY); .clear(platform, Lifespan.at(snap), register, TaskMonitor.DUMMY);
if (dataType != null) { if (dataType != null) {
space.definedData().create(platform, Range.atLeast(snap), register, dataType); space.definedData().create(platform, Lifespan.nowOn(snap), register, dataType);
} }
} }
catch (CodeUnitInsertionException | CancelledException e) { catch (CodeUnitInsertionException | CancelledException e) {

View file

@ -15,13 +15,10 @@
*/ */
package ghidra.app.plugin.core.debug.gui.stack; package ghidra.app.plugin.core.debug.gui.stack;
import com.google.common.collect.Range;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.listing.Function; import ghidra.program.model.listing.Function;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.trace.model.DefaultTraceLocation; import ghidra.trace.model.*;
import ghidra.trace.model.TraceLocation;
import ghidra.trace.model.stack.TraceStackFrame; import ghidra.trace.model.stack.TraceStackFrame;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.util.database.UndoableTransaction; import ghidra.util.database.UndoableTransaction;
@ -102,7 +99,7 @@ public class StackFrameRow {
return null; return null;
} }
TraceLocation dloc = new DefaultTraceLocation(curThread.getTrace(), TraceLocation dloc = new DefaultTraceLocation(curThread.getTrace(),
curThread, Range.singleton(getSnap()), pc); curThread, Lifespan.at(getSnap()), pc);
ProgramLocation sloc = provider.mappingService.getOpenMappedLocation(dloc); ProgramLocation sloc = provider.mappingService.getOpenMappedLocation(dloc);
if (sloc == null) { if (sloc == null) {
return null; return null;

View file

@ -26,8 +26,6 @@ import javax.swing.event.ListSelectionEvent;
import javax.swing.table.TableColumn; import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel; import javax.swing.table.TableColumnModel;
import com.google.common.collect.Range;
import docking.ActionContext; import docking.ActionContext;
import docking.WindowPosition; import docking.WindowPosition;
import docking.action.*; import docking.action.*;
@ -49,10 +47,9 @@ import ghidra.framework.model.DomainObject;
import ghidra.framework.plugintool.AutoService; import ghidra.framework.plugintool.AutoService;
import ghidra.framework.plugintool.ComponentProviderAdapter; import ghidra.framework.plugintool.ComponentProviderAdapter;
import ghidra.framework.plugintool.annotation.AutoServiceConsumed; import ghidra.framework.plugintool.annotation.AutoServiceConsumed;
import ghidra.trace.model.Trace; import ghidra.trace.model.*;
import ghidra.trace.model.Trace.TraceSnapshotChangeType; import ghidra.trace.model.Trace.TraceSnapshotChangeType;
import ghidra.trace.model.Trace.TraceThreadChangeType; import ghidra.trace.model.Trace.TraceThreadChangeType;
import ghidra.trace.model.TraceDomainObjectListener;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.trace.model.thread.TraceThreadManager; import ghidra.trace.model.thread.TraceThreadManager;
import ghidra.trace.model.time.TraceSnapshot; import ghidra.trace.model.time.TraceSnapshot;
@ -177,7 +174,7 @@ public class DebuggerThreadsProvider extends ComponentProviderAdapter {
private final BooleanChangeAdapter synchronizeFocusChangeListener = private final BooleanChangeAdapter synchronizeFocusChangeListener =
this::changedSynchronizeFocus; this::changedSynchronizeFocus;
/* package access for testing */ /* package access for testing */
final RangeTableCellRenderer<Long> rangeRenderer = new RangeTableCellRenderer<>(); final SpanTableCellRenderer<Long> spanRenderer = new SpanTableCellRenderer<>();
final RangeCursorTableHeaderRenderer<Long> headerRenderer = final RangeCursorTableHeaderRenderer<Long> headerRenderer =
new RangeCursorTableHeaderRenderer<>(); new RangeCursorTableHeaderRenderer<>();
@ -357,8 +354,8 @@ public class DebuggerThreadsProvider extends ComponentProviderAdapter {
protected void updateTimelineMax() { protected void updateTimelineMax() {
long max = orZero(current.getTrace().getTimeManager().getMaxSnap()); long max = orZero(current.getTrace().getTimeManager().getMaxSnap());
Range<Long> fullRange = Range.closed(0L, max + 1); Lifespan fullRange = Lifespan.span(0, max + 1);
rangeRenderer.setFullRange(fullRange); spanRenderer.setFullRange(fullRange);
headerRenderer.setFullRange(fullRange); headerRenderer.setFullRange(fullRange);
threadTable.getTableHeader().repaint(); threadTable.getTableHeader().repaint();
} }
@ -464,7 +461,7 @@ public class DebuggerThreadsProvider extends ComponentProviderAdapter {
colComment.setPreferredWidth(100); colComment.setPreferredWidth(100);
TableColumn colPlot = columnModel.getColumn(ThreadTableColumns.PLOT.ordinal()); TableColumn colPlot = columnModel.getColumn(ThreadTableColumns.PLOT.ordinal());
colPlot.setPreferredWidth(200); colPlot.setPreferredWidth(200);
colPlot.setCellRenderer(rangeRenderer); colPlot.setCellRenderer(spanRenderer);
colPlot.setHeaderRenderer(headerRenderer); colPlot.setHeaderRenderer(headerRenderer);
headerRenderer.addSeekListener(seekListener = pos -> { headerRenderer.addSeekListener(seekListener = pos -> {

View file

@ -15,11 +15,10 @@
*/ */
package ghidra.app.plugin.core.debug.gui.thread; package ghidra.app.plugin.core.debug.gui.thread;
import com.google.common.collect.Range;
import ghidra.app.services.DebuggerModelService; import ghidra.app.services.DebuggerModelService;
import ghidra.app.services.TraceRecorder; import ghidra.app.services.TraceRecorder;
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.util.Msg; import ghidra.util.Msg;
@ -63,7 +62,7 @@ public class ThreadRow {
return snap == Long.MAX_VALUE ? "" : Long.toString(snap); return snap == Long.MAX_VALUE ? "" : Long.toString(snap);
} }
public Range<Long> getLifespan() { public Lifespan getLifespan() {
return thread.getLifespan(); return thread.getLifespan();
} }

View file

@ -18,9 +18,8 @@ package ghidra.app.plugin.core.debug.gui.thread;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Function; import java.util.function.Function;
import com.google.common.collect.Range;
import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn; import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn;
import ghidra.trace.model.Lifespan;
public enum ThreadTableColumns implements EnumeratedTableColumn<ThreadTableColumns, ThreadRow> { public enum ThreadTableColumns implements EnumeratedTableColumn<ThreadTableColumns, ThreadRow> {
NAME("Name", String.class, ThreadRow::getName, ThreadRow::setName, true), NAME("Name", String.class, ThreadRow::getName, ThreadRow::setName, true),
@ -28,7 +27,7 @@ public enum ThreadTableColumns implements EnumeratedTableColumn<ThreadTableColum
DESTROYED("Destroyed", String.class, ThreadRow::getDestructionSnap, true), DESTROYED("Destroyed", String.class, ThreadRow::getDestructionSnap, true),
STATE("State", ThreadState.class, ThreadRow::getState, true), STATE("State", ThreadState.class, ThreadRow::getState, true),
COMMENT("Comment", String.class, ThreadRow::getComment, ThreadRow::setComment, true), COMMENT("Comment", String.class, ThreadRow::getComment, ThreadRow::setComment, true),
PLOT("Plot", Range.class, ThreadRow::getLifespan, false); PLOT("Plot", Lifespan.class, ThreadRow::getLifespan, false);
private final String header; private final String header;
private final Function<ThreadRow, ?> getter; private final Function<ThreadRow, ?> getter;

View file

@ -19,8 +19,6 @@ import java.math.BigInteger;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.DebuggerCoordinates; import ghidra.app.plugin.core.debug.DebuggerCoordinates;
import ghidra.app.plugin.processors.sleigh.SleighLanguage; import ghidra.app.plugin.processors.sleigh.SleighLanguage;
import ghidra.app.services.DataTypeManagerService; import ghidra.app.services.DataTypeManagerService;
@ -428,7 +426,7 @@ public class WatchRow {
return null; return null;
} }
TraceLocation dloc = TraceLocation dloc =
new DefaultTraceLocation(trace, null, Range.singleton(current.getSnap()), address); new DefaultTraceLocation(trace, null, Lifespan.at(current.getSnap()), address);
ProgramLocation sloc = provider.mappingService.getOpenMappedLocation(dloc); ProgramLocation sloc = provider.mappingService.getOpenMappedLocation(dloc);
if (sloc == null) { if (sloc == null) {
return null; return null;

View file

@ -17,11 +17,10 @@ package ghidra.app.plugin.core.debug.mapping;
import java.util.*; import java.util.*;
import com.google.common.collect.Range;
import ghidra.dbg.target.TargetEnvironment; import ghidra.dbg.target.TargetEnvironment;
import ghidra.dbg.util.PathPredicates; import ghidra.dbg.util.PathPredicates;
import ghidra.program.model.lang.Endian; import ghidra.program.model.lang.Endian;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.target.TraceObject; import ghidra.trace.model.target.TraceObject;
import ghidra.trace.model.target.TraceObjectValue; import ghidra.trace.model.target.TraceObjectValue;
@ -71,7 +70,7 @@ public interface DebuggerPlatformOpinion extends ExtensionPoint {
if (pathToEnv == null) { if (pathToEnv == null) {
return null; return null;
} }
return root.getSuccessors(Range.singleton(snap), PathPredicates.pattern(pathToEnv)) return root.getSuccessors(Lifespan.at(snap), PathPredicates.pattern(pathToEnv))
.findAny() .findAny()
.map(p -> p.getDestination(root)) .map(p -> p.getDestination(root))
.orElse(null); .orElse(null);

View file

@ -23,8 +23,6 @@ import java.util.stream.Collectors;
import org.apache.commons.collections4.IteratorUtils; import org.apache.commons.collections4.IteratorUtils;
import com.google.common.collect.Range;
import generic.CatenatedCollection; import generic.CatenatedCollection;
import ghidra.app.events.ProgramClosedPluginEvent; import ghidra.app.events.ProgramClosedPluginEvent;
import ghidra.app.events.ProgramOpenedPluginEvent; import ghidra.app.events.ProgramOpenedPluginEvent;
@ -252,7 +250,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
} }
private void breakpointLifespanChanged(TraceAddressSpace spaceIsNull, private void breakpointLifespanChanged(TraceAddressSpace spaceIsNull,
TraceBreakpoint tb, Range<Long> oldSpan, Range<Long> newSpan) { TraceBreakpoint tb, Lifespan oldSpan, Lifespan newSpan) {
// NOTE: User/script probably modified historical breakpoint // NOTE: User/script probably modified historical breakpoint
boolean isInOld = oldSpan.contains(info.recorder.getSnap()); boolean isInOld = oldSpan.contains(info.recorder.getSnap());
boolean isInNew = newSpan.contains(info.recorder.getSnap()); boolean isInNew = newSpan.contains(info.recorder.getSnap());
@ -487,7 +485,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
for (AddressRange range : trace.getBaseAddressFactory().getAddressSet()) { for (AddressRange range : trace.getBaseAddressFactory().getAddressSet()) {
live.addAll(trace live.addAll(trace
.getBreakpointManager() .getBreakpointManager()
.getBreakpointsIntersecting(Range.singleton(recorder.getSnap()), range)); .getBreakpointsIntersecting(Lifespan.at(recorder.getSnap()), range));
} }
for (TraceBreakpoint tb : live) { for (TraceBreakpoint tb : live) {
forgetTraceBreakpoint(r, tb); forgetTraceBreakpoint(r, tb);
@ -523,7 +521,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
for (AddressRange range : trace.getBaseAddressFactory().getAddressSet()) { for (AddressRange range : trace.getBaseAddressFactory().getAddressSet()) {
live.addAll(trace live.addAll(trace
.getBreakpointManager() .getBreakpointManager()
.getBreakpointsIntersecting(Range.singleton(recorder.getSnap()), range)); .getBreakpointsIntersecting(Lifespan.at(recorder.getSnap()), range));
} }
trackTraceBreakpoints(a, live); trackTraceBreakpoints(a, live);
} }
@ -552,7 +550,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
return null; return null;
} }
return mappingService.getOpenMappedLocation(new DefaultTraceLocation(trace, return mappingService.getOpenMappedLocation(new DefaultTraceLocation(trace,
null, Range.singleton(recorder.getSnap()), tb.getMinAddress())); null, Lifespan.at(recorder.getSnap()), tb.getMinAddress()));
} }
protected void trackTraceBreakpoint(AddCollector a, TraceBreakpoint tb, boolean forceUpdate) protected void trackTraceBreakpoint(AddCollector a, TraceBreakpoint tb, boolean forceUpdate)
@ -1105,7 +1103,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
} }
ProgramLocation staticLocation = mappingService.getOpenMappedLocation( ProgramLocation staticLocation = mappingService.getOpenMappedLocation(
new DefaultTraceLocation(trace, null, Range.singleton(recorder.getSnap()), address)); new DefaultTraceLocation(trace, null, Lifespan.at(recorder.getSnap()), address));
if (staticLocation == null) { if (staticLocation == null) {
return new LoneLogicalBreakpoint(recorder, address, length, kinds) return new LoneLogicalBreakpoint(recorder, address, length, kinds)
.enableForTrace(trace); .enableForTrace(trace);

View file

@ -26,8 +26,6 @@ import javax.swing.event.ChangeListener;
import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.exception.ExceptionUtils;
import com.google.common.collect.Range;
import docking.action.DockingAction; import docking.action.DockingAction;
import docking.action.ToggleDockingAction; import docking.action.ToggleDockingAction;
import ghidra.app.context.ProgramLocationActionContext; import ghidra.app.context.ProgramLocationActionContext;
@ -417,7 +415,7 @@ public class DebuggerEmulationServicePlugin extends Plugin implements DebuggerEm
}*/ }*/
ProgramLocation progLoc = ProgramLocation progLoc =
staticMappings.getOpenMappedLocation(new DefaultTraceLocation(view.getTrace(), null, staticMappings.getOpenMappedLocation(new DefaultTraceLocation(view.getTrace(), null,
Range.singleton(view.getSnap()), tracePc)); Lifespan.at(view.getSnap()), tracePc));
Program program = progLoc == null ? null : progLoc.getProgram(); Program program = progLoc == null ? null : progLoc.getProgram();
Address programPc = progLoc == null ? null : progLoc.getAddress(); Address programPc = progLoc == null ? null : progLoc.getAddress();
@ -540,7 +538,7 @@ public class DebuggerEmulationServicePlugin extends Plugin implements DebuggerEm
} }
protected void installBreakpoints(Trace trace, long snap, DebuggerPcodeMachine<?> emu) { protected void installBreakpoints(Trace trace, long snap, DebuggerPcodeMachine<?> emu) {
Range<Long> span = Range.singleton(snap); Lifespan span = Lifespan.at(snap);
TraceBreakpointManager bm = trace.getBreakpointManager(); TraceBreakpointManager bm = trace.getBreakpointManager();
for (AddressSpace as : trace.getBaseAddressFactory().getAddressSpaces()) { for (AddressSpace as : trace.getBaseAddressFactory().getAddressSpaces()) {
for (TraceBreakpoint bpt : bm.getBreakpointsIntersecting(span, for (TraceBreakpoint bpt : bm.getBreakpointsIntersecting(span,

View file

@ -21,8 +21,6 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.service.modules.DebuggerStaticMappingUtils; import ghidra.app.plugin.core.debug.service.modules.DebuggerStaticMappingUtils;
import ghidra.app.services.DebuggerEmulationService; import ghidra.app.services.DebuggerEmulationService;
import ghidra.framework.model.DomainFile; import ghidra.framework.model.DomainFile;
@ -33,8 +31,7 @@ import ghidra.program.model.listing.ProgramContext;
import ghidra.program.model.mem.MemoryBlock; import ghidra.program.model.mem.MemoryBlock;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
import ghidra.trace.model.DefaultTraceLocation; import ghidra.trace.model.*;
import ghidra.trace.model.Trace;
import ghidra.trace.model.memory.*; import ghidra.trace.model.memory.*;
import ghidra.trace.model.modules.TraceConflictedMappingException; import ghidra.trace.model.modules.TraceConflictedMappingException;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
@ -166,7 +163,7 @@ public enum ProgramEmulationUtils {
} }
for (Extrema extrema : extremaBySpace.values()) { for (Extrema extrema : extremaBySpace.values()) {
DebuggerStaticMappingUtils.addMapping( DebuggerStaticMappingUtils.addMapping(
new DefaultTraceLocation(trace, null, Range.atLeast(snapshot.getKey()), new DefaultTraceLocation(trace, null, Lifespan.nowOn(snapshot.getKey()),
extrema.min), extrema.min),
new ProgramLocation(program, extrema.min), new ProgramLocation(program, extrema.min),
extrema.max.subtract(extrema.min), false); extrema.max.subtract(extrema.min), false);

View file

@ -15,14 +15,13 @@
*/ */
package ghidra.app.plugin.core.debug.service.emulation.data; package ghidra.app.plugin.core.debug.service.emulation.data;
import com.google.common.collect.Range;
import ghidra.app.services.DebuggerStaticMappingService; import ghidra.app.services.DebuggerStaticMappingService;
import ghidra.pcode.exec.trace.data.DefaultPcodeTracePropertyAccess; import ghidra.pcode.exec.trace.data.DefaultPcodeTracePropertyAccess;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.util.PropertyMap; import ghidra.program.model.util.PropertyMap;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.trace.model.DefaultTraceLocation; import ghidra.trace.model.DefaultTraceLocation;
import ghidra.trace.model.Lifespan;
/** /**
* The default trace-and-debugger-property access shim * The default trace-and-debugger-property access shim
@ -59,7 +58,7 @@ public class DefaultPcodeDebuggerPropertyAccess<T>
return super.whenNull(hostAddress); return super.whenNull(hostAddress);
} }
ProgramLocation progLoc = mappingService.getOpenMappedLocation(new DefaultTraceLocation( ProgramLocation progLoc = mappingService.getOpenMappedLocation(new DefaultTraceLocation(
data.getPlatform().getTrace(), null, Range.singleton(data.getSnap()), hostAddress)); data.getPlatform().getTrace(), null, Lifespan.at(data.getSnap()), hostAddress));
if (progLoc == null) { if (progLoc == null) {
return super.whenNull(hostAddress); return super.whenNull(hostAddress);
} }

View file

@ -15,16 +15,17 @@
*/ */
package ghidra.app.plugin.core.debug.service.model; package ghidra.app.plugin.core.debug.service.model;
import java.util.*; import java.util.Collection;
import java.util.HashSet;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.service.model.interfaces.ManagedMemoryRecorder; import ghidra.app.plugin.core.debug.service.model.interfaces.ManagedMemoryRecorder;
import ghidra.app.plugin.core.debug.service.model.record.RecorderUtils; import ghidra.app.plugin.core.debug.service.model.record.RecorderUtils;
import ghidra.dbg.target.TargetMemory; import ghidra.dbg.target.TargetMemory;
import ghidra.dbg.target.TargetMemoryRegion; import ghidra.dbg.target.TargetMemoryRegion;
import ghidra.program.model.address.*; import ghidra.program.model.address.AddressRange;
import ghidra.program.model.address.AddressSetView;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.memory.*; import ghidra.trace.model.memory.*;
import ghidra.util.Msg; import ghidra.util.Msg;
@ -80,7 +81,7 @@ public class DefaultMemoryRecorder implements ManagedMemoryRecorder {
if (region.getRange().getLength() != traceRange.getLength()) { if (region.getRange().getLength() != traceRange.getLength()) {
Msg.warn(this, "Truncated region: " + region); Msg.warn(this, "Truncated region: " + region);
} }
traceRegion = memoryManager.addRegion(path, Range.atLeast(snap), traceRange, traceRegion = memoryManager.addRegion(path, Lifespan.nowOn(snap), traceRange,
getTraceFlags(region)); getTraceFlags(region));
traceRegion.setName(region.getDisplay()); traceRegion.setName(region.getDisplay());
} }

View file

@ -21,8 +21,6 @@ import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.mapping.*; import ghidra.app.plugin.core.debug.mapping.*;
import ghidra.app.plugin.core.debug.service.model.DebuggerModelServicePlugin; import ghidra.app.plugin.core.debug.service.model.DebuggerModelServicePlugin;
import ghidra.app.plugin.core.debug.service.model.PermanentTransactionExecutor; import ghidra.app.plugin.core.debug.service.model.PermanentTransactionExecutor;
@ -43,6 +41,7 @@ import ghidra.program.model.address.*;
import ghidra.program.model.lang.Register; import ghidra.program.model.lang.Register;
import ghidra.program.model.lang.RegisterValue; import ghidra.program.model.lang.RegisterValue;
import ghidra.trace.database.module.TraceObjectSection; import ghidra.trace.database.module.TraceObjectSection;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.breakpoint.*; import ghidra.trace.model.breakpoint.*;
import ghidra.trace.model.guest.TracePlatform; import ghidra.trace.model.guest.TracePlatform;
@ -469,7 +468,7 @@ public class ObjectBasedTraceRecorder implements TraceRecorder {
public Set<TargetThread> getLiveTargetThreads() { public Set<TargetThread> getLiveTargetThreads() {
return trace.getObjectManager() return trace.getObjectManager()
.getRootObject() .getRootObject()
.querySuccessorsInterface(Range.singleton(getSnap()), TraceObjectThread.class) .querySuccessorsInterface(Lifespan.at(getSnap()), TraceObjectThread.class)
.map(t -> objectRecorder.getTargetInterface(t.getObject(), TargetThread.class)) .map(t -> objectRecorder.getTargetInterface(t.getObject(), TargetThread.class))
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }
@ -639,7 +638,7 @@ public class ObjectBasedTraceRecorder implements TraceRecorder {
this.thread = thread; this.thread = thread;
TraceObject object = thread.getObject(); TraceObject object = thread.getObject();
this.process = object this.process = object
.queryAncestorsTargetInterface(Range.singleton(getSnap()), TargetProcess.class) .queryAncestorsTargetInterface(Lifespan.at(getSnap()), TargetProcess.class)
.map(p -> p.getSource(object)) .map(p -> p.getSource(object))
.findFirst() .findFirst()
.orElse(null); .orElse(null);
@ -647,7 +646,7 @@ public class ObjectBasedTraceRecorder implements TraceRecorder {
private boolean appliesTo(TraceObjectBreakpointLocation loc) { private boolean appliesTo(TraceObjectBreakpointLocation loc) {
TraceObject object = loc.getObject(); TraceObject object = loc.getObject();
if (object.queryAncestorsInterface(Range.singleton(getSnap()), TraceObjectThread.class) if (object.queryAncestorsInterface(Lifespan.at(getSnap()), TraceObjectThread.class)
.anyMatch(t -> t == thread)) { .anyMatch(t -> t == thread)) {
return true; return true;
} }
@ -655,7 +654,7 @@ public class ObjectBasedTraceRecorder implements TraceRecorder {
return false; return false;
} }
return object return object
.queryAncestorsTargetInterface(Range.singleton(getSnap()), TargetProcess.class) .queryAncestorsTargetInterface(Lifespan.at(getSnap()), TargetProcess.class)
.map(p -> p.getSource(object)) .map(p -> p.getSource(object))
.anyMatch(p -> p == process); .anyMatch(p -> p == process);
} }
@ -669,7 +668,7 @@ public class ObjectBasedTraceRecorder implements TraceRecorder {
BreakpointConvention convention = new BreakpointConvention( BreakpointConvention convention = new BreakpointConvention(
objectRecorder.getTraceInterface(thread, TraceObjectThread.class)); objectRecorder.getTraceInterface(thread, TraceObjectThread.class));
return trace.getObjectManager() return trace.getObjectManager()
.queryAllInterface(Range.singleton(getSnap()), TraceObjectBreakpointLocation.class) .queryAllInterface(Lifespan.at(getSnap()), TraceObjectBreakpointLocation.class)
.filter(convention::appliesTo) .filter(convention::appliesTo)
.map(tl -> objectRecorder.getTargetInterface(tl.getObject(), .map(tl -> objectRecorder.getTargetInterface(tl.getObject(),
TargetBreakpointLocation.class)) TargetBreakpointLocation.class))

View file

@ -21,8 +21,6 @@ import java.util.stream.Collectors;
import org.apache.commons.collections4.BidiMap; import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.DualHashBidiMap; import org.apache.commons.collections4.bidimap.DualHashBidiMap;
import com.google.common.collect.Range;
import ghidra.dbg.DebuggerObjectModel; import ghidra.dbg.DebuggerObjectModel;
import ghidra.dbg.target.TargetAttacher.TargetAttachKind; import ghidra.dbg.target.TargetAttacher.TargetAttachKind;
import ghidra.dbg.target.TargetAttacher.TargetAttachKindSet; import ghidra.dbg.target.TargetAttacher.TargetAttachKindSet;
@ -38,6 +36,7 @@ import ghidra.dbg.target.schema.TargetObjectSchema;
import ghidra.dbg.util.*; import ghidra.dbg.util.*;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressRange; import ghidra.program.model.address.AddressRange;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.TraceUniqueObject; import ghidra.trace.model.TraceUniqueObject;
import ghidra.trace.model.target.*; import ghidra.trace.model.target.*;
import ghidra.trace.model.thread.TraceObjectThread; import ghidra.trace.model.thread.TraceObjectThread;
@ -111,7 +110,7 @@ class ObjectRecorder {
} }
String extras = computeExtraInterfaces(object); String extras = computeExtraInterfaces(object);
// Note: null extras will erase previous value, if necessary. // Note: null extras will erase previous value, if necessary.
traceObject.setAttribute(Range.atLeast(snap), traceObject.setAttribute(Lifespan.nowOn(snap),
TraceObject.EXTRA_INTERFACES_ATTRIBUTE_NAME, extras); TraceObject.EXTRA_INTERFACES_ATTRIBUTE_NAME, extras);
} }
@ -127,7 +126,7 @@ class ObjectRecorder {
Msg.error(this, "Unknown object was invalidated: " + object); Msg.error(this, "Unknown object was invalidated: " + object);
return; return;
} }
traceObject.obj.removeTree(Range.atLeast(snap)); traceObject.obj.removeTree(Lifespan.nowOn(snap));
} }
protected String encodeEnum(Enum<?> e) { protected String encodeEnum(Enum<?> e) {
@ -209,7 +208,7 @@ class ObjectRecorder {
} }
} }
for (Map.Entry<String, Object> entry : traceAdded.entrySet()) { for (Map.Entry<String, Object> entry : traceAdded.entrySet()) {
traceObject.setAttribute(Range.atLeast(snap), entry.getKey(), entry.getValue()); traceObject.setAttribute(Lifespan.nowOn(snap), entry.getKey(), entry.getValue());
} }
} }
@ -241,7 +240,7 @@ class ObjectRecorder {
} }
} }
for (Map.Entry<String, Object> entry : traceAdded.entrySet()) { for (Map.Entry<String, Object> entry : traceAdded.entrySet()) {
traceObject.setElement(Range.atLeast(snap), entry.getKey(), entry.getValue()); traceObject.setElement(Lifespan.nowOn(snap), entry.getKey(), entry.getValue());
} }
} }
@ -291,7 +290,7 @@ class ObjectRecorder {
return null; return null;
} }
TraceObjectValPath found = object TraceObjectValPath found = object
.getSuccessors(Range.singleton(recorder.getSnap()), applied) .getSuccessors(Lifespan.at(recorder.getSnap()), applied)
.findAny() .findAny()
.orElse(null); .orElse(null);
if (found == null) { if (found == null) {
@ -311,7 +310,7 @@ class ObjectRecorder {
if (seed == null) { if (seed == null) {
return List.of(); return List.of();
} }
return seed.querySuccessorsTargetInterface(Range.singleton(recorder.getSnap()), targetIf) return seed.querySuccessorsTargetInterface(Lifespan.at(recorder.getSnap()), targetIf)
.map(p -> toTarget(p.getDestination(seed)).as(targetIf)) .map(p -> toTarget(p.getDestination(seed)).as(targetIf))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

View file

@ -23,8 +23,6 @@ import java.util.stream.Collectors;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import com.google.common.collect.Range;
import ghidra.app.events.ProgramClosedPluginEvent; import ghidra.app.events.ProgramClosedPluginEvent;
import ghidra.app.events.ProgramOpenedPluginEvent; import ghidra.app.events.ProgramOpenedPluginEvent;
import ghidra.app.plugin.PluginCategoryNames; import ghidra.app.plugin.PluginCategoryNames;
@ -344,7 +342,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
return result; return result;
} }
public ProgramLocation getOpenMappedLocations(Address address, Range<Long> span) { public ProgramLocation getOpenMappedLocations(Address address, Lifespan span) {
TraceAddressSnapRange at = new ImmutableTraceAddressSnapRange(address, span); TraceAddressSnapRange at = new ImmutableTraceAddressSnapRange(address, span);
for (Entry<TraceAddressSnapRange, MappingEntry> out : outbound.entrySet()) { for (Entry<TraceAddressSnapRange, MappingEntry> out : outbound.entrySet()) {
if (out.getKey().intersects(at)) { if (out.getKey().intersects(at)) {
@ -357,7 +355,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
return null; return null;
} }
protected void collectOpenMappedPrograms(AddressRange rng, Range<Long> span, protected void collectOpenMappedPrograms(AddressRange rng, Lifespan span,
Map<Program, Collection<MappedAddressRange>> result) { Map<Program, Collection<MappedAddressRange>> result) {
TraceAddressSnapRange tatr = new ImmutableTraceAddressSnapRange(rng, span); TraceAddressSnapRange tatr = new ImmutableTraceAddressSnapRange(rng, span);
for (Entry<TraceAddressSnapRange, MappingEntry> out : outbound.entrySet()) { for (Entry<TraceAddressSnapRange, MappingEntry> out : outbound.entrySet()) {
@ -376,7 +374,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
} }
public Map<Program, Collection<MappedAddressRange>> getOpenMappedViews(AddressSetView set, public Map<Program, Collection<MappedAddressRange>> getOpenMappedViews(AddressSetView set,
Range<Long> span) { Lifespan span) {
Map<Program, Collection<MappedAddressRange>> result = new HashMap<>(); Map<Program, Collection<MappedAddressRange>> result = new HashMap<>();
for (AddressRange rng : set) { for (AddressRange rng : set) {
collectOpenMappedPrograms(rng, span, result); collectOpenMappedPrograms(rng, span, result);
@ -384,7 +382,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
return Collections.unmodifiableMap(result); return Collections.unmodifiableMap(result);
} }
protected void collectMappedProgramURLsInView(AddressRange rng, Range<Long> span, protected void collectMappedProgramURLsInView(AddressRange rng, Lifespan span,
Set<URL> result) { Set<URL> result) {
TraceAddressSnapRange tatr = new ImmutableTraceAddressSnapRange(rng, span); TraceAddressSnapRange tatr = new ImmutableTraceAddressSnapRange(rng, span);
for (Entry<TraceAddressSnapRange, MappingEntry> out : outbound.entrySet()) { for (Entry<TraceAddressSnapRange, MappingEntry> out : outbound.entrySet()) {
@ -396,7 +394,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
} }
} }
public Set<URL> getMappedProgramURLsInView(AddressSetView set, Range<Long> span) { public Set<URL> getMappedProgramURLsInView(AddressSetView set, Lifespan span) {
Set<URL> result = new HashSet<>(); Set<URL> result = new HashSet<>();
for (AddressRange rng : set) { for (AddressRange rng : set) {
collectMappedProgramURLsInView(rng, span, result); collectMappedProgramURLsInView(rng, span, result);
@ -772,7 +770,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
} }
@Override @Override
public void addIdentityMapping(Trace from, Program toProgram, Range<Long> lifespan, public void addIdentityMapping(Trace from, Program toProgram, Lifespan lifespan,
boolean truncateExisting) { boolean truncateExisting) {
try (UndoableTransaction tid = try (UndoableTransaction tid =
UndoableTransaction.start(from, "Add identity mappings")) { UndoableTransaction.start(from, "Add identity mappings")) {
@ -868,7 +866,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
TraceProgramView view = (TraceProgramView) loc.getProgram(); TraceProgramView view = (TraceProgramView) loc.getProgram();
Trace trace = view.getTrace(); Trace trace = view.getTrace();
TraceLocation tloc = new DefaultTraceLocation(trace, null, TraceLocation tloc = new DefaultTraceLocation(trace, null,
Range.singleton(getNonScratchSnap(view)), loc.getByteAddress()); Lifespan.at(getNonScratchSnap(view)), loc.getByteAddress());
ProgramLocation mapped = getOpenMappedLocation(tloc); ProgramLocation mapped = getOpenMappedLocation(tloc);
if (mapped == null) { if (mapped == null) {
return null; return null;
@ -921,7 +919,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
if (info == null) { if (info == null) {
return null; return null;
} }
return info.getOpenMappedViews(set, Range.singleton(snap)); return info.getOpenMappedViews(set, Lifespan.at(snap));
} }
} }
@ -946,7 +944,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
if (info == null) { if (info == null) {
return null; return null;
} }
urls = info.getMappedProgramURLsInView(set, Range.singleton(snap)); urls = info.getMappedProgramURLsInView(set, Lifespan.at(snap));
} }
Set<Program> result = new HashSet<>(); Set<Program> result = new HashSet<>();
for (URL url : urls) { for (URL url : urls) {

View file

@ -19,8 +19,6 @@ import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.util.*; import java.util.*;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.utils.ProgramURLUtils; import ghidra.app.plugin.core.debug.utils.ProgramURLUtils;
import ghidra.app.services.MapEntry; import ghidra.app.services.MapEntry;
import ghidra.framework.data.OpenedDomainFile; import ghidra.framework.data.OpenedDomainFile;
@ -31,7 +29,6 @@ import ghidra.program.model.listing.Library;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.model.symbol.ExternalManager; import ghidra.program.model.symbol.ExternalManager;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.trace.database.DBTraceUtils;
import ghidra.trace.model.*; import ghidra.trace.model.*;
import ghidra.trace.model.modules.*; import ghidra.trace.model.modules.*;
import ghidra.trace.model.program.TraceProgramView; import ghidra.trace.model.program.TraceProgramView;
@ -207,16 +204,16 @@ public enum DebuggerStaticMappingUtils {
Address end = fromAddress.addWrap(length - 1); Address end = fromAddress.addWrap(length - 1);
// Also check end in the destination // Also check end in the destination
AddressRangeImpl range = new AddressRangeImpl(fromAddress, end); AddressRangeImpl range = new AddressRangeImpl(fromAddress, end);
Range<Long> fromLifespan = from.getLifespan(); Lifespan fromLifespan = from.getLifespan();
if (truncateExisting) { if (truncateExisting) {
long truncEnd = DBTraceUtils.lowerEndpoint(fromLifespan) - 1; long truncEnd = fromLifespan.lmin() - 1;
for (TraceStaticMapping existing : List for (TraceStaticMapping existing : List
.copyOf(manager.findAllOverlapping(range, fromLifespan))) { .copyOf(manager.findAllOverlapping(range, fromLifespan))) {
existing.delete(); existing.delete();
if (fromLifespan.hasLowerBound() && if (fromLifespan.minIsFinite() &&
Long.compare(existing.getStartSnap(), truncEnd) <= 0) { Lifespan.DOMAIN.compare(existing.getStartSnap(), truncEnd) <= 0) {
manager.add(existing.getTraceAddressRange(), manager.add(existing.getTraceAddressRange(),
Range.closed(existing.getStartSnap(), truncEnd), Lifespan.span(existing.getStartSnap(), truncEnd),
existing.getStaticProgramURL(), existing.getStaticAddress()); existing.getStaticProgramURL(), existing.getStaticAddress());
} }
} }
@ -232,7 +229,7 @@ public enum DebuggerStaticMappingUtils {
addMapping(fromLoc, toLoc, length, truncateExisting); addMapping(fromLoc, toLoc, length, truncateExisting);
} }
public static void addIdentityMapping(Trace from, Program toProgram, Range<Long> lifespan, public static void addIdentityMapping(Trace from, Program toProgram, Lifespan lifespan,
boolean truncateExisting) { boolean truncateExisting) {
Map<String, Address> mins = new HashMap<>(); Map<String, Address> mins = new HashMap<>();
Map<String, Address> maxs = new HashMap<>(); Map<String, Address> maxs = new HashMap<>();

View file

@ -17,14 +17,13 @@ package ghidra.app.plugin.core.debug.service.modules;
import java.util.*; import java.util.*;
import com.google.common.collect.Range;
import ghidra.app.services.DebuggerStaticMappingService; import ghidra.app.services.DebuggerStaticMappingService;
import ghidra.app.services.ModuleMapProposal; import ghidra.app.services.ModuleMapProposal;
import ghidra.app.services.ModuleMapProposal.ModuleMapEntry; import ghidra.app.services.ModuleMapProposal.ModuleMapEntry;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.model.mem.MemoryBlock; import ghidra.program.model.mem.MemoryBlock;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.TraceMemoryRegion; import ghidra.trace.model.memory.TraceMemoryRegion;
import ghidra.trace.model.modules.TraceModule; import ghidra.trace.model.modules.TraceModule;
@ -110,7 +109,7 @@ public class DefaultModuleMapProposal
} }
@Override @Override
public Range<Long> getFromLifespan() { public Lifespan getFromLifespan() {
return getModule().getLifespan(); return getModule().getLifespan();
} }

View file

@ -18,13 +18,12 @@ package ghidra.app.plugin.core.debug.service.modules;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.google.common.collect.Range;
import ghidra.app.services.RegionMapProposal; import ghidra.app.services.RegionMapProposal;
import ghidra.app.services.RegionMapProposal.RegionMapEntry; import ghidra.app.services.RegionMapProposal.RegionMapEntry;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.model.mem.MemoryBlock; import ghidra.program.model.mem.MemoryBlock;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.memory.TraceMemoryRegion; import ghidra.trace.model.memory.TraceMemoryRegion;
@ -52,7 +51,7 @@ public class DefaultRegionMapProposal
} }
@Override @Override
public Range<Long> getFromLifespan() { public Lifespan getFromLifespan() {
return getRegion().getLifespan(); return getRegion().getLifespan();
} }

View file

@ -17,8 +17,6 @@ package ghidra.app.plugin.core.debug.service.modules;
import java.util.Map; import java.util.Map;
import com.google.common.collect.Range;
import ghidra.app.services.DebuggerStaticMappingService; import ghidra.app.services.DebuggerStaticMappingService;
import ghidra.app.services.SectionMapProposal; import ghidra.app.services.SectionMapProposal;
import ghidra.app.services.SectionMapProposal.SectionMapEntry; import ghidra.app.services.SectionMapProposal.SectionMapEntry;
@ -26,6 +24,7 @@ import ghidra.program.model.address.AddressRange;
import ghidra.program.model.address.AddressRangeImpl; import ghidra.program.model.address.AddressRangeImpl;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.model.mem.MemoryBlock; import ghidra.program.model.mem.MemoryBlock;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.modules.TraceModule; import ghidra.trace.model.modules.TraceModule;
import ghidra.trace.model.modules.TraceSection; import ghidra.trace.model.modules.TraceSection;
@ -66,7 +65,7 @@ public class DefaultSectionMapProposal
} }
@Override @Override
public Range<Long> getFromLifespan() { public Lifespan getFromLifespan() {
return getModule().getLifespan(); return getModule().getLifespan();
} }

View file

@ -20,8 +20,6 @@ import java.util.Map.Entry;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import com.google.common.collect.Range;
import docking.DockingWindowManager; import docking.DockingWindowManager;
import docking.Tool; import docking.Tool;
import ghidra.app.plugin.core.debug.mapping.DebuggerPlatformMapper; import ghidra.app.plugin.core.debug.mapping.DebuggerPlatformMapper;
@ -156,9 +154,9 @@ public class DisassembleAtPcDebuggerBot implements DebuggerBot {
} }
TraceViewportSpanIterator spit = new TraceViewportSpanIterator(trace, snap); TraceViewportSpanIterator spit = new TraceViewportSpanIterator(trace, snap);
while (spit.hasNext()) { while (spit.hasNext()) {
Range<Long> span = spit.next(); Lifespan span = spit.next();
if (span.upperEndpoint() >= 0) { if (span.lmax() >= 0) {
return span.upperEndpoint(); return span.lmax();
} }
} }
return snap; return snap;
@ -229,7 +227,7 @@ public class DisassembleAtPcDebuggerBot implements DebuggerBot {
TraceCodeSpace regCode = codeManager.getCodeRegisterSpace(thread, frameLevel, true); TraceCodeSpace regCode = codeManager.getCodeRegisterSpace(thread, frameLevel, true);
try { try {
pcUnit = regCode.definedData() pcUnit = regCode.definedData()
.create(Range.atLeast(pcSnap), pc, PointerDataType.dataType); .create(Lifespan.nowOn(pcSnap), pc, PointerDataType.dataType);
} }
catch (CodeUnitInsertionException e) { catch (CodeUnitInsertionException e) {
// I guess something's already there. Leave it, then! // I guess something's already there. Leave it, then!
@ -295,7 +293,7 @@ public class DisassembleAtPcDebuggerBot implements DebuggerBot {
*/ */
AddressSetView readOnly = AddressSetView readOnly =
memoryManager.getRegionsAddressSetWith(ks, r -> !r.isWrite()); memoryManager.getRegionsAddressSetWith(ks, r -> !r.isWrite());
AddressSetView everKnown = memoryManager.getAddressesWithState(Range.atMost(ks), AddressSetView everKnown = memoryManager.getAddressesWithState(Lifespan.since(ks),
s -> s == TraceMemoryState.KNOWN); s -> s == TraceMemoryState.KNOWN);
AddressSetView roEverKnown = new IntersectionAddressSetView(readOnly, everKnown); AddressSetView roEverKnown = new IntersectionAddressSetView(readOnly, everKnown);
AddressSetView known = AddressSetView known =

View file

@ -18,8 +18,6 @@ package ghidra.app.services;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import com.google.common.collect.Range;
import ghidra.app.services.ModuleMapProposal.ModuleMapEntry; import ghidra.app.services.ModuleMapProposal.ModuleMapEntry;
import ghidra.app.services.RegionMapProposal.RegionMapEntry; import ghidra.app.services.RegionMapProposal.RegionMapEntry;
import ghidra.app.services.SectionMapProposal.SectionMapEntry; import ghidra.app.services.SectionMapProposal.SectionMapEntry;
@ -218,7 +216,7 @@ public interface DebuggerStaticMappingService {
* @param truncateExisting true to delete or truncate the lifespan of overlapping entries. If * @param truncateExisting true to delete or truncate the lifespan of overlapping entries. If
* false, overlapping entries are omitted. * false, overlapping entries are omitted.
*/ */
void addIdentityMapping(Trace from, Program toProgram, Range<Long> lifespan, void addIdentityMapping(Trace from, Program toProgram, Lifespan lifespan,
boolean truncateExisting); boolean truncateExisting);
void addMapping(MapEntry<?, ?> entry, boolean truncateExisting) void addMapping(MapEntry<?, ?> entry, boolean truncateExisting)

View file

@ -15,13 +15,10 @@
*/ */
package ghidra.app.services; package ghidra.app.services;
import com.google.common.collect.Range;
import ghidra.program.model.address.AddressRange; import ghidra.program.model.address.AddressRange;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.trace.model.Trace; import ghidra.trace.model.*;
import ghidra.trace.model.TraceLocation;
public interface MapEntry<T, P> { public interface MapEntry<T, P> {
Trace getFromTrace(); Trace getFromTrace();
@ -30,7 +27,7 @@ public interface MapEntry<T, P> {
AddressRange getFromRange(); AddressRange getFromRange();
Range<Long> getFromLifespan(); Lifespan getFromLifespan();
TraceLocation getFromTraceLocation(); TraceLocation getFromTraceLocation();

View file

@ -21,8 +21,6 @@ import java.util.Set;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import com.google.common.collect.Range;
import generic.Unique; import generic.Unique;
import ghidra.app.plugin.core.codebrowser.CodeViewerProvider; import ghidra.app.plugin.core.codebrowser.CodeViewerProvider;
import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest.TestDebuggerTargetTraceMapper; import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest.TestDebuggerTargetTraceMapper;
@ -40,8 +38,7 @@ import ghidra.dbg.model.TestDebuggerModelBuilder;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.trace.model.DefaultTraceLocation; import ghidra.trace.model.*;
import ghidra.trace.model.Trace;
import ghidra.trace.model.breakpoint.TraceBreakpointKind; import ghidra.trace.model.breakpoint.TraceBreakpointKind;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.Swing; import ghidra.util.Swing;
@ -102,10 +99,10 @@ public class DebuggerBreakpointMarkerPluginScreenShots extends GhidraScreenShotG
.createFile("WinHelloCPP", program, TaskMonitor.DUMMY); .createFile("WinHelloCPP", program, TaskMonitor.DUMMY);
try (UndoableTransaction tid = UndoableTransaction.start(trace, "Add Mapping")) { try (UndoableTransaction tid = UndoableTransaction.start(trace, "Add Mapping")) {
mappingService.addIdentityMapping(trace, program, Range.atLeast(0L), true); mappingService.addIdentityMapping(trace, program, Lifespan.nowOn(0), true);
} }
waitForValue(() -> mappingService.getOpenMappedLocation( waitForValue(() -> mappingService.getOpenMappedLocation(
new DefaultTraceLocation(trace, null, Range.singleton(0L), mb.addr(0x00401c60)))); new DefaultTraceLocation(trace, null, Lifespan.at(0), mb.addr(0x00401c60))));
Msg.debug(this, "Placing breakpoint"); Msg.debug(this, "Placing breakpoint");
breakpointService.placeBreakpointAt(program, addr(program, 0x00401c60), 1, breakpointService.placeBreakpointAt(program, addr(program, 0x00401c60), 1,
@ -152,10 +149,10 @@ public class DebuggerBreakpointMarkerPluginScreenShots extends GhidraScreenShotG
.createFile("WinHelloCPP", program, TaskMonitor.DUMMY); .createFile("WinHelloCPP", program, TaskMonitor.DUMMY);
try (UndoableTransaction tid = UndoableTransaction.start(trace, "Add Mapping")) { try (UndoableTransaction tid = UndoableTransaction.start(trace, "Add Mapping")) {
mappingService.addIdentityMapping(trace, program, Range.atLeast(0L), true); mappingService.addIdentityMapping(trace, program, Lifespan.nowOn(0), true);
} }
waitForValue(() -> mappingService.getOpenMappedLocation( waitForValue(() -> mappingService.getOpenMappedLocation(
new DefaultTraceLocation(trace, null, Range.singleton(0L), mb.addr(0x00401070)))); new DefaultTraceLocation(trace, null, Lifespan.at(0), mb.addr(0x00401070))));
Msg.debug(this, "Placing breakpoint"); Msg.debug(this, "Placing breakpoint");
breakpointService.placeBreakpointAt(program, addr(program, 0x00401070), 1, breakpointService.placeBreakpointAt(program, addr(program, 0x00401070), 1,

View file

@ -23,8 +23,6 @@ import java.util.Set;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Range;
import generic.Unique; import generic.Unique;
import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest.TestDebuggerTargetTraceMapper; import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest.TestDebuggerTargetTraceMapper;
import ghidra.app.plugin.core.debug.service.breakpoint.DebuggerLogicalBreakpointServicePlugin; import ghidra.app.plugin.core.debug.service.breakpoint.DebuggerLogicalBreakpointServicePlugin;
@ -43,8 +41,7 @@ import ghidra.program.model.address.Address;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.test.ToyProgramBuilder; import ghidra.test.ToyProgramBuilder;
import ghidra.trace.model.DefaultTraceLocation; import ghidra.trace.model.*;
import ghidra.trace.model.Trace;
import ghidra.trace.model.breakpoint.TraceBreakpoint; import ghidra.trace.model.breakpoint.TraceBreakpoint;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.database.UndoableTransaction; import ghidra.util.database.UndoableTransaction;
@ -132,12 +129,12 @@ public class DebuggerBreakpointsPluginScreenShots extends GhidraScreenShotGenera
try (UndoableTransaction tid = UndoableTransaction.start(trace1, "Add mapping")) { try (UndoableTransaction tid = UndoableTransaction.start(trace1, "Add mapping")) {
DebuggerStaticMappingUtils.addMapping( DebuggerStaticMappingUtils.addMapping(
new DefaultTraceLocation(trace1, null, Range.atLeast(0L), addr(trace1, 0x00400000)), new DefaultTraceLocation(trace1, null, Lifespan.nowOn(0), addr(trace1, 0x00400000)),
new ProgramLocation(program, addr(program, 0x00400000)), 0x00210000, false); new ProgramLocation(program, addr(program, 0x00400000)), 0x00210000, false);
} }
try (UndoableTransaction tid = UndoableTransaction.start(trace3, "Add mapping")) { try (UndoableTransaction tid = UndoableTransaction.start(trace3, "Add mapping")) {
DebuggerStaticMappingUtils.addMapping( DebuggerStaticMappingUtils.addMapping(
new DefaultTraceLocation(trace3, null, Range.atLeast(0L), addr(trace3, 0x7fac0000)), new DefaultTraceLocation(trace3, null, Lifespan.nowOn(0), addr(trace3, 0x7fac0000)),
new ProgramLocation(program, addr(program, 0x00400000)), 0x00010000, false); new ProgramLocation(program, addr(program, 0x00400000)), 0x00010000, false);
} }

View file

@ -19,8 +19,6 @@ import java.util.Set;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest.TestDebuggerTargetTraceMapper; import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest.TestDebuggerTargetTraceMapper;
import ghidra.app.plugin.core.debug.gui.listing.DebuggerListingPlugin; import ghidra.app.plugin.core.debug.gui.listing.DebuggerListingPlugin;
import ghidra.app.plugin.core.debug.gui.listing.DebuggerListingProvider; import ghidra.app.plugin.core.debug.gui.listing.DebuggerListingProvider;
@ -39,6 +37,7 @@ import ghidra.trace.database.ToyDBTraceBuilder;
import ghidra.trace.database.memory.DBTraceMemoryManager; import ghidra.trace.database.memory.DBTraceMemoryManager;
import ghidra.trace.database.module.DBTraceModuleManager; import ghidra.trace.database.module.DBTraceModuleManager;
import ghidra.trace.model.DefaultTraceLocation; import ghidra.trace.model.DefaultTraceLocation;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.TraceMemoryFlag; import ghidra.trace.model.memory.TraceMemoryFlag;
import ghidra.trace.model.modules.TraceModule; import ghidra.trace.model.modules.TraceModule;
import ghidra.util.database.UndoableTransaction; import ghidra.util.database.UndoableTransaction;
@ -126,10 +125,10 @@ public class DebuggerCopyActionsPluginScreenShots extends GhidraScreenShotGenera
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
mappingService.addMapping( mappingService.addMapping(
new DefaultTraceLocation(tb.trace, null, Range.atLeast(snap), tb.addr(0x55550000)), new DefaultTraceLocation(tb.trace, null, Lifespan.nowOn(snap), tb.addr(0x55550000)),
new ProgramLocation(program, tb.addr(stSpace, 0x00400000)), 0x10000, true); new ProgramLocation(program, tb.addr(stSpace, 0x00400000)), 0x10000, true);
mappingService.addMapping( mappingService.addMapping(
new DefaultTraceLocation(tb.trace, null, Range.atLeast(snap), tb.addr(0x55560000)), new DefaultTraceLocation(tb.trace, null, Lifespan.nowOn(snap), tb.addr(0x55560000)),
new ProgramLocation(program, tb.addr(stSpace, 0x00600000)), 0x10000, true); new ProgramLocation(program, tb.addr(stSpace, 0x00600000)), 0x10000, true);
} }

View file

@ -19,8 +19,6 @@ import java.util.Set;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Range;
import ghidra.app.plugin.assembler.Assembler; import ghidra.app.plugin.assembler.Assembler;
import ghidra.app.plugin.assembler.Assemblers; import ghidra.app.plugin.assembler.Assemblers;
import ghidra.app.plugin.core.debug.gui.action.DebuggerGoToDialog; import ghidra.app.plugin.core.debug.gui.action.DebuggerGoToDialog;
@ -30,6 +28,7 @@ import ghidra.program.model.lang.RegisterValue;
import ghidra.program.model.symbol.SourceType; import ghidra.program.model.symbol.SourceType;
import ghidra.test.ToyProgramBuilder; import ghidra.test.ToyProgramBuilder;
import ghidra.trace.database.ToyDBTraceBuilder; import ghidra.trace.database.ToyDBTraceBuilder;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.TraceMemoryFlag; import ghidra.trace.model.memory.TraceMemoryFlag;
import ghidra.trace.model.memory.TraceMemorySpace; import ghidra.trace.model.memory.TraceMemorySpace;
import ghidra.trace.model.symbol.*; import ghidra.trace.model.symbol.*;
@ -63,7 +62,7 @@ public class DebuggerListingPluginScreenShots extends GhidraScreenShotGenerator
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
long snap = tb.trace.getTimeManager().createSnapshot("First").getKey(); long snap = tb.trace.getTimeManager().createSnapshot("First").getKey();
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion(".text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), .addRegion(".text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE)); Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE));
TraceSymbolManager symbolManager = tb.trace.getSymbolManager(); TraceSymbolManager symbolManager = tb.trace.getSymbolManager();
@ -127,7 +126,7 @@ public class DebuggerListingPluginScreenShots extends GhidraScreenShotGenerator
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
tb.trace.getTimeManager().createSnapshot("First").getKey(); tb.trace.getTimeManager().createSnapshot("First").getKey();
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("bash:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), .addRegion("bash:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE)); Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE));
traceManager.openTrace(tb.trace); traceManager.openTrace(tb.trace);

View file

@ -19,8 +19,6 @@ import java.util.Set;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Range;
import ghidra.app.plugin.assembler.Assembler; import ghidra.app.plugin.assembler.Assembler;
import ghidra.app.plugin.assembler.Assemblers; import ghidra.app.plugin.assembler.Assemblers;
import ghidra.app.plugin.core.debug.gui.listing.DebuggerListingPlugin; import ghidra.app.plugin.core.debug.gui.listing.DebuggerListingPlugin;
@ -30,6 +28,7 @@ import ghidra.program.model.lang.RegisterValue;
import ghidra.program.model.symbol.SourceType; import ghidra.program.model.symbol.SourceType;
import ghidra.test.ToyProgramBuilder; import ghidra.test.ToyProgramBuilder;
import ghidra.trace.database.ToyDBTraceBuilder; import ghidra.trace.database.ToyDBTraceBuilder;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.TraceMemoryFlag; import ghidra.trace.model.memory.TraceMemoryFlag;
import ghidra.trace.model.memory.TraceMemorySpace; import ghidra.trace.model.memory.TraceMemorySpace;
import ghidra.trace.model.symbol.*; import ghidra.trace.model.symbol.*;
@ -67,7 +66,7 @@ public class DebuggerMemoryBytesPluginScreenShots extends GhidraScreenShotGenera
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
long snap = tb.trace.getTimeManager().createSnapshot("First").getKey(); long snap = tb.trace.getTimeManager().createSnapshot("First").getKey();
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion(".text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), .addRegion(".text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE)); Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE));
TraceSymbolManager symbolManager = tb.trace.getSymbolManager(); TraceSymbolManager symbolManager = tb.trace.getSymbolManager();

View file

@ -19,8 +19,6 @@ import java.util.Set;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.service.tracemgr.DebuggerTraceManagerServicePlugin; import ghidra.app.plugin.core.debug.service.tracemgr.DebuggerTraceManagerServicePlugin;
import ghidra.app.plugin.core.progmgr.ProgramManagerPlugin; import ghidra.app.plugin.core.progmgr.ProgramManagerPlugin;
import ghidra.app.services.DebuggerTraceManagerService; import ghidra.app.services.DebuggerTraceManagerService;
@ -32,6 +30,7 @@ import ghidra.program.model.listing.Program;
import ghidra.test.ToyProgramBuilder; import ghidra.test.ToyProgramBuilder;
import ghidra.trace.database.ToyDBTraceBuilder; import ghidra.trace.database.ToyDBTraceBuilder;
import ghidra.trace.database.memory.DBTraceMemoryManager; import ghidra.trace.database.memory.DBTraceMemoryManager;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.TraceMemoryFlag; import ghidra.trace.model.memory.TraceMemoryFlag;
import ghidra.util.database.UndoableTransaction; import ghidra.util.database.UndoableTransaction;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@ -80,16 +79,16 @@ public class DebuggerRegionsPluginScreenShots extends GhidraScreenShotGenerator
long snap = tb.trace.getTimeManager().createSnapshot("First").getKey(); long snap = tb.trace.getTimeManager().createSnapshot("First").getKey();
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("/bin/bash (400000:40ffff)", Range.atLeast(snap), mm.addRegion("/bin/bash (400000:40ffff)", Lifespan.nowOn(snap),
tb.range(0x00400000, 0x0040ffff), tb.range(0x00400000, 0x0040ffff),
Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE)); Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE));
mm.addRegion("/bin/bash (600000:60ffff)", Range.atLeast(snap), mm.addRegion("/bin/bash (600000:60ffff)", Lifespan.nowOn(snap),
tb.range(0x00600000, 0x0060ffff), tb.range(0x00600000, 0x0060ffff),
Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.WRITE)); Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.WRITE));
mm.addRegion("/lib/libc (7fac0000:7facffff)", Range.atLeast(snap), mm.addRegion("/lib/libc (7fac0000:7facffff)", Lifespan.nowOn(snap),
tb.range(0x7fac0000, 0x7facffff), tb.range(0x7fac0000, 0x7facffff),
Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE)); Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE));
mm.addRegion("/lib/libc (7fcc0000:7fccffff)", Range.atLeast(snap), mm.addRegion("/lib/libc (7fcc0000:7fccffff)", Lifespan.nowOn(snap),
tb.range(0x7fcc0000, 0x7fccffff), tb.range(0x7fcc0000, 0x7fccffff),
Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.WRITE)); Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.WRITE));
} }

View file

@ -20,16 +20,14 @@ import java.util.Set;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.service.tracemgr.DebuggerTraceManagerServicePlugin; import ghidra.app.plugin.core.debug.service.tracemgr.DebuggerTraceManagerServicePlugin;
import ghidra.app.plugin.core.progmgr.ProgramManagerPlugin; import ghidra.app.plugin.core.progmgr.ProgramManagerPlugin;
import ghidra.app.services.DebuggerTraceManagerService; import ghidra.app.services.DebuggerTraceManagerService;
import ghidra.app.services.ProgramManager; import ghidra.app.services.ProgramManager;
import ghidra.framework.model.DomainFolder;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.test.ToyProgramBuilder; import ghidra.test.ToyProgramBuilder;
import ghidra.trace.database.ToyDBTraceBuilder; import ghidra.trace.database.ToyDBTraceBuilder;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.breakpoint.TraceBreakpointKind; import ghidra.trace.model.breakpoint.TraceBreakpointKind;
import ghidra.trace.model.memory.TraceMemoryFlag; import ghidra.trace.model.memory.TraceMemoryFlag;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
@ -78,12 +76,12 @@ public class DebuggerMemviewPluginScreenShots extends GhidraScreenShotGenerator
} }
private void populateTraceAndPrograms() throws Exception { private void populateTraceAndPrograms() throws Exception {
DomainFolder root = tool.getProject().getProjectData().getRootFolder(); tool.getProject().getProjectData().getRootFolder();
TraceThread thread1; TraceThread thread1;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
thread1 = tb.trace.getThreadManager().addThread("[0]", Range.openClosed(0L, 40L)); thread1 = tb.trace.getThreadManager().addThread("[0]", Lifespan.span(1, 40));
tb.trace.getThreadManager().addThread("[1]", Range.openClosed(3L, 50L)); tb.trace.getThreadManager().addThread("[1]", Lifespan.span(4, 50));
tb.trace.getThreadManager().addThread("[2]", Range.openClosed(5L, 20L)); tb.trace.getThreadManager().addThread("[2]", Lifespan.span(6, 20));
} }
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
@ -96,17 +94,17 @@ public class DebuggerMemviewPluginScreenShots extends GhidraScreenShotGenerator
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("bash.text", Range.atLeast(5L), tb.range(0x00400000, 0x0040ffff), .addRegion("bash.text", Lifespan.nowOn(5), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.EXECUTE); TraceMemoryFlag.EXECUTE);
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("bash.data", Range.atLeast(6L), tb.range(0x00500000, 0x0060ffff), .addRegion("bash.data", Lifespan.nowOn(6), tb.range(0x00500000, 0x0060ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.WRITE); TraceMemoryFlag.READ, TraceMemoryFlag.WRITE);
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("libc.text", Range.atLeast(15L), tb.range(0x7fac0000, 0x7facffff), .addRegion("libc.text", Lifespan.nowOn(15), tb.range(0x7fac0000, 0x7facffff),
TraceMemoryFlag.EXECUTE); TraceMemoryFlag.EXECUTE);
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("libc.data", Range.atLeast(16L), tb.range(0x7fae0000, 0x7faeffff), .addRegion("libc.data", Lifespan.nowOn(16), tb.range(0x7fae0000, 0x7faeffff),
TraceMemoryFlag.READ, TraceMemoryFlag.WRITE); TraceMemoryFlag.READ, TraceMemoryFlag.WRITE);
} }
@ -116,7 +114,7 @@ public class DebuggerMemviewPluginScreenShots extends GhidraScreenShotGenerator
threads.add(thread1); threads.add(thread1);
kinds.add(TraceBreakpointKind.HW_EXECUTE); kinds.add(TraceBreakpointKind.HW_EXECUTE);
tb.trace.getBreakpointManager() tb.trace.getBreakpointManager()
.addBreakpoint("bpt1", Range.closed(17L, 25L), tb.range(0x7fac1234, 0x7fc1238), .addBreakpoint("bpt1", Lifespan.span(17, 25), tb.range(0x7fac1234, 0x7fc1238),
threads, kinds, true, "break here"); threads, kinds, true, "break here");
} }

View file

@ -17,8 +17,6 @@ package ghidra.app.plugin.core.debug.gui.pcode;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Range;
import ghidra.app.plugin.assembler.Assembler; import ghidra.app.plugin.assembler.Assembler;
import ghidra.app.plugin.assembler.Assemblers; import ghidra.app.plugin.assembler.Assemblers;
import ghidra.app.plugin.core.debug.service.tracemgr.DebuggerTraceManagerServicePlugin; import ghidra.app.plugin.core.debug.service.tracemgr.DebuggerTraceManagerServicePlugin;
@ -27,6 +25,7 @@ import ghidra.pcode.exec.PcodeExecutor;
import ghidra.pcode.exec.trace.TraceSleighUtils; import ghidra.pcode.exec.trace.TraceSleighUtils;
import ghidra.test.ToyProgramBuilder; import ghidra.test.ToyProgramBuilder;
import ghidra.trace.database.ToyDBTraceBuilder; import ghidra.trace.database.ToyDBTraceBuilder;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.TraceMemoryFlag; import ghidra.trace.model.memory.TraceMemoryFlag;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.trace.model.time.schedule.TraceSchedule; import ghidra.trace.model.time.schedule.TraceSchedule;
@ -61,7 +60,7 @@ public class DebuggerPcodeStepperPluginScreenShots extends GhidraScreenShotGener
long snap0 = tb.trace.getTimeManager().createSnapshot("First").getKey(); long snap0 = tb.trace.getTimeManager().createSnapshot("First").getKey();
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("[echo:.text]", Range.atLeast(snap0), .addRegion("[echo:.text]", Lifespan.nowOn(snap0),
tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ,
TraceMemoryFlag.EXECUTE); TraceMemoryFlag.EXECUTE);

View file

@ -19,8 +19,6 @@ import java.math.BigInteger;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.service.tracemgr.DebuggerTraceManagerServicePlugin; import ghidra.app.plugin.core.debug.service.tracemgr.DebuggerTraceManagerServicePlugin;
import ghidra.app.services.DebuggerTraceManagerService; import ghidra.app.services.DebuggerTraceManagerService;
import ghidra.program.model.data.PointerDataType; import ghidra.program.model.data.PointerDataType;
@ -28,6 +26,7 @@ import ghidra.program.model.lang.Language;
import ghidra.program.model.lang.RegisterValue; import ghidra.program.model.lang.RegisterValue;
import ghidra.test.ToyProgramBuilder; import ghidra.test.ToyProgramBuilder;
import ghidra.trace.database.ToyDBTraceBuilder; import ghidra.trace.database.ToyDBTraceBuilder;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.TraceMemorySpace; import ghidra.trace.model.memory.TraceMemorySpace;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.util.database.UndoableTransaction; import ghidra.util.database.UndoableTransaction;
@ -94,7 +93,7 @@ public class DebuggerRegistersPluginScreenShots extends GhidraScreenShotGenerato
tb.trace.getCodeManager() tb.trace.getCodeManager()
.getCodeRegisterSpace(thread, true) .getCodeRegisterSpace(thread, true)
.definedData() .definedData()
.create(Range.atLeast(snap0), lang.getRegister("RIP"), .create(Lifespan.nowOn(snap0), lang.getRegister("RIP"),
PointerDataType.dataType); PointerDataType.dataType);
traceManager.openTrace(tb.trace); traceManager.openTrace(tb.trace);

View file

@ -17,8 +17,6 @@ package ghidra.app.plugin.core.debug.gui.stack;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Range;
import ghidra.app.plugin.core.debug.service.modules.DebuggerStaticMappingServicePlugin; import ghidra.app.plugin.core.debug.service.modules.DebuggerStaticMappingServicePlugin;
import ghidra.app.plugin.core.debug.service.modules.DebuggerStaticMappingUtils; import ghidra.app.plugin.core.debug.service.modules.DebuggerStaticMappingUtils;
import ghidra.app.plugin.core.debug.service.tracemgr.DebuggerTraceManagerServicePlugin; import ghidra.app.plugin.core.debug.service.tracemgr.DebuggerTraceManagerServicePlugin;
@ -33,6 +31,7 @@ import ghidra.program.util.ProgramLocation;
import ghidra.test.ToyProgramBuilder; import ghidra.test.ToyProgramBuilder;
import ghidra.trace.database.ToyDBTraceBuilder; import ghidra.trace.database.ToyDBTraceBuilder;
import ghidra.trace.model.DefaultTraceLocation; import ghidra.trace.model.DefaultTraceLocation;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.stack.TraceStack; import ghidra.trace.model.stack.TraceStack;
import ghidra.trace.model.stack.TraceStackFrame; import ghidra.trace.model.stack.TraceStackFrame;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
@ -106,17 +105,17 @@ public class DebuggerStackPluginScreenShots extends GhidraScreenShotGenerator {
TraceStackFrame frame; TraceStackFrame frame;
frame = stack.getFrame(0, false); frame = stack.getFrame(0, false);
frame.setProgramCounter(Range.all(), tb.addr(0x00404321)); frame.setProgramCounter(Lifespan.ALL, tb.addr(0x00404321));
frame = stack.getFrame(1, false); frame = stack.getFrame(1, false);
frame.setProgramCounter(Range.all(), tb.addr(0x00401234)); frame.setProgramCounter(Lifespan.ALL, tb.addr(0x00401234));
frame = stack.getFrame(2, false); frame = stack.getFrame(2, false);
frame.setProgramCounter(Range.all(), tb.addr(0x00401001)); frame.setProgramCounter(Lifespan.ALL, tb.addr(0x00401001));
} }
root.createFile("trace", tb.trace, TaskMonitor.DUMMY); root.createFile("trace", tb.trace, TaskMonitor.DUMMY);
root.createFile("echo", program, TaskMonitor.DUMMY); root.createFile("echo", program, TaskMonitor.DUMMY);
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DebuggerStaticMappingUtils.addMapping( DebuggerStaticMappingUtils.addMapping(
new DefaultTraceLocation(tb.trace, null, Range.atLeast(snap), tb.addr(0x00400000)), new DefaultTraceLocation(tb.trace, null, Lifespan.nowOn(snap), tb.addr(0x00400000)),
new ProgramLocation(program, addr(program, 0x00400000)), 0x10000, false); new ProgramLocation(program, addr(program, 0x00400000)), 0x10000, false);
} }

View file

@ -27,8 +27,6 @@ import java.util.stream.Collectors;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Range;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import generic.Unique; import generic.Unique;
import ghidra.app.context.ListingActionContext; import ghidra.app.context.ListingActionContext;
@ -60,6 +58,7 @@ import ghidra.trace.database.memory.DBTraceMemorySpace;
import ghidra.trace.database.program.DBTraceVariableSnapProgramView; import ghidra.trace.database.program.DBTraceVariableSnapProgramView;
import ghidra.trace.database.target.DBTraceObject; import ghidra.trace.database.target.DBTraceObject;
import ghidra.trace.database.target.DBTraceObjectManager; import ghidra.trace.database.target.DBTraceObjectManager;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.guest.TraceGuestPlatform; import ghidra.trace.model.guest.TraceGuestPlatform;
import ghidra.trace.model.memory.TraceMemoryFlag; import ghidra.trace.model.memory.TraceMemoryFlag;
import ghidra.trace.model.memory.TraceObjectMemoryRegion; import ghidra.trace.model.memory.TraceObjectMemoryRegion;
@ -157,7 +156,7 @@ public class DebuggerDisassemblyTest extends AbstractGhidraHeadedDebuggerGUITest
DBTraceObject env = DBTraceObject env =
objects.createObject(TraceObjectKeyPath.parse("Targets[0].Environment")); objects.createObject(TraceObjectKeyPath.parse("Targets[0].Environment"));
assertEquals(ctx.getSchema(new SchemaName("Environment")), env.getTargetSchema()); assertEquals(ctx.getSchema(new SchemaName("Environment")), env.getTargetSchema());
Range<Long> zeroOn = Range.atLeast(0L); Lifespan zeroOn = Lifespan.nowOn(0);
env.insert(zeroOn, ConflictResolution.DENY); env.insert(zeroOn, ConflictResolution.DENY);
env.setAttribute(zeroOn, TargetEnvironment.DEBUGGER_ATTRIBUTE_NAME, "test"); env.setAttribute(zeroOn, TargetEnvironment.DEBUGGER_ATTRIBUTE_NAME, "test");
env.setAttribute(zeroOn, TargetEnvironment.ARCH_ATTRIBUTE_NAME, arch); env.setAttribute(zeroOn, TargetEnvironment.ARCH_ATTRIBUTE_NAME, arch);

View file

@ -33,8 +33,6 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.experimental.categories.Category; import org.junit.experimental.categories.Category;
import com.google.common.collect.Range;
import docking.action.DockingAction; import docking.action.DockingAction;
import docking.widgets.fieldpanel.FieldPanel; import docking.widgets.fieldpanel.FieldPanel;
import generic.Unique; import generic.Unique;
@ -63,8 +61,7 @@ import ghidra.program.model.listing.Program;
import ghidra.program.model.mem.MemoryConflictException; import ghidra.program.model.mem.MemoryConflictException;
import ghidra.program.model.symbol.SourceType; import ghidra.program.model.symbol.SourceType;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.trace.model.DefaultTraceLocation; import ghidra.trace.model.*;
import ghidra.trace.model.Trace;
import ghidra.trace.model.breakpoint.TraceBreakpointKind; import ghidra.trace.model.breakpoint.TraceBreakpointKind;
import ghidra.trace.model.program.TraceProgramView; import ghidra.trace.model.program.TraceProgramView;
import ghidra.util.SystemUtilities; import ghidra.util.SystemUtilities;
@ -150,7 +147,7 @@ public class DebuggerBreakpointMarkerPluginTest extends AbstractGhidraHeadedDebu
protected void addMapping(Trace trace) throws Exception { protected void addMapping(Trace trace) throws Exception {
try (UndoableTransaction tid = UndoableTransaction.start(trace, "Add mapping")) { try (UndoableTransaction tid = UndoableTransaction.start(trace, "Add mapping")) {
DebuggerStaticMappingUtils.addMapping( DebuggerStaticMappingUtils.addMapping(
new DefaultTraceLocation(trace, null, Range.atLeast(0L), addr(trace, 0x55550123)), new DefaultTraceLocation(trace, null, Lifespan.nowOn(0), addr(trace, 0x55550123)),
new ProgramLocation(program, addr(program, 0x00400123)), 0x1000, false); new ProgramLocation(program, addr(program, 0x00400123)), 0x1000, false);
} }
} }

View file

@ -27,8 +27,6 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.experimental.categories.Category; import org.junit.experimental.categories.Category;
import com.google.common.collect.Range;
import docking.widgets.table.RowWrappedEnumeratedColumnTableModel; import docking.widgets.table.RowWrappedEnumeratedColumnTableModel;
import generic.Unique; import generic.Unique;
import generic.test.category.NightlyCategory; import generic.test.category.NightlyCategory;
@ -47,8 +45,7 @@ import ghidra.program.model.address.AddressOverflowException;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.model.mem.MemoryConflictException; import ghidra.program.model.mem.MemoryConflictException;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.trace.model.DefaultTraceLocation; import ghidra.trace.model.*;
import ghidra.trace.model.Trace;
import ghidra.trace.model.breakpoint.TraceBreakpoint; import ghidra.trace.model.breakpoint.TraceBreakpoint;
import ghidra.util.SystemUtilities; import ghidra.util.SystemUtilities;
import ghidra.util.database.UndoableTransaction; import ghidra.util.database.UndoableTransaction;
@ -83,7 +80,7 @@ public class DebuggerBreakpointsProviderTest extends AbstractGhidraHeadedDebugge
protected void addMapping(Trace trace, Program prog) throws Exception { protected void addMapping(Trace trace, Program prog) throws Exception {
try (UndoableTransaction tid = UndoableTransaction.start(trace, "Add mapping")) { try (UndoableTransaction tid = UndoableTransaction.start(trace, "Add mapping")) {
DebuggerStaticMappingUtils.addMapping( DebuggerStaticMappingUtils.addMapping(
new DefaultTraceLocation(trace, null, Range.atLeast(0L), addr(trace, 0x55550000)), new DefaultTraceLocation(trace, null, Lifespan.nowOn(0), addr(trace, 0x55550000)),
new ProgramLocation(prog, addr(prog, 0x00400000)), 0x1000, false); new ProgramLocation(prog, addr(prog, 0x00400000)), 0x1000, false);
} }
} }

View file

@ -26,8 +26,6 @@ import java.util.concurrent.CompletableFuture;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import com.google.common.collect.Range;
import docking.ActionContext; import docking.ActionContext;
import docking.action.DockingAction; import docking.action.DockingAction;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
@ -61,7 +59,7 @@ import ghidra.program.model.lang.CompilerSpecID;
import ghidra.program.model.lang.LanguageID; import ghidra.program.model.lang.LanguageID;
import ghidra.program.model.listing.Instruction; import ghidra.program.model.listing.Instruction;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.trace.database.DBTraceUtils; import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.TraceMemoryFlag; import ghidra.trace.model.memory.TraceMemoryFlag;
import ghidra.trace.model.program.TraceVariableSnapProgramView; import ghidra.trace.model.program.TraceVariableSnapProgramView;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
@ -462,7 +460,7 @@ public class DebuggerControlPluginTest extends AbstractGhidraHeadedDebuggerGUITe
assertEquals(2, ins.getLength()); assertEquals(2, ins.getLength());
long snap = traceManager.getCurrent().getViewSnap(); long snap = traceManager.getCurrent().getViewSnap();
assertTrue(DBTraceUtils.isScratch(snap)); assertTrue(Lifespan.isScratch(snap));
byte[] bytes = new byte[2]; byte[] bytes = new byte[2];
view.getMemory().getBytes(tb.addr(0x00400123), bytes); view.getMemory().getBytes(tb.addr(0x00400123), bytes);
assertArrayEquals(tb.arr(0x30, 0xd2), bytes); assertArrayEquals(tb.arr(0x30, 0xd2), bytes);
@ -483,7 +481,7 @@ public class DebuggerControlPluginTest extends AbstractGhidraHeadedDebuggerGUITe
Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE)); Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE));
tb.trace.getCodeManager() tb.trace.getCodeManager()
.definedData() .definedData()
.create(Range.atLeast(0L), tb.addr(0x00400123), ShortDataType.dataType); .create(Lifespan.nowOn(0), tb.addr(0x00400123), ShortDataType.dataType);
} }
CodeViewerProvider listingProvider = listingPlugin.getProvider(); CodeViewerProvider listingProvider = listingPlugin.getProvider();
@ -515,7 +513,7 @@ public class DebuggerControlPluginTest extends AbstractGhidraHeadedDebuggerGUITe
// assertEquals(2, data.getLength()); // assertEquals(2, data.getLength());
long snap = traceManager.getCurrent().getViewSnap(); long snap = traceManager.getCurrent().getViewSnap();
assertTrue(DBTraceUtils.isScratch(snap)); assertTrue(Lifespan.isScratch(snap));
byte[] bytes = new byte[2]; byte[] bytes = new byte[2];
view.getMemory().getBytes(tb.addr(0x00400123), bytes); view.getMemory().getBytes(tb.addr(0x00400123), bytes);
assertArrayEquals(tb.arr(0, 5), bytes); assertArrayEquals(tb.arr(0, 5), bytes);
@ -575,7 +573,7 @@ public class DebuggerControlPluginTest extends AbstractGhidraHeadedDebuggerGUITe
byte[] bytes = new byte[4]; byte[] bytes = new byte[4];
waitForPass(noExc(() -> { waitForPass(noExc(() -> {
long snap = traceManager.getCurrent().getViewSnap(); long snap = traceManager.getCurrent().getViewSnap();
assertTrue(DBTraceUtils.isScratch(snap)); assertTrue(Lifespan.isScratch(snap));
view.getMemory().getBytes(tb.addr(0x00400123), bytes); view.getMemory().getBytes(tb.addr(0x00400123), bytes);
assertArrayEquals(tb.arr(0x12, 0x34, 0x56, 0x78), bytes); assertArrayEquals(tb.arr(0x12, 0x34, 0x56, 0x78), bytes);
})); }));

View file

@ -24,8 +24,6 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.experimental.categories.Category; import org.junit.experimental.categories.Category;
import com.google.common.collect.Range;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import generic.Unique; import generic.Unique;
import generic.test.category.NightlyCategory; import generic.test.category.NightlyCategory;
@ -46,8 +44,7 @@ import ghidra.program.model.mem.MemoryBlock;
import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramLocation;
import ghidra.test.ToyProgramBuilder; import ghidra.test.ToyProgramBuilder;
import ghidra.trace.database.memory.DBTraceMemoryManager; import ghidra.trace.database.memory.DBTraceMemoryManager;
import ghidra.trace.model.DefaultTraceLocation; import ghidra.trace.model.*;
import ghidra.trace.model.TraceLocation;
import ghidra.trace.model.memory.TraceMemoryFlag; import ghidra.trace.model.memory.TraceMemoryFlag;
import ghidra.util.database.UndoableTransaction; import ghidra.util.database.UndoableTransaction;
@ -237,7 +234,7 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerG
} }
TraceLocation tloc = TraceLocation tloc =
new DefaultTraceLocation(tb.trace, null, Range.atLeast(0L), tb.addr(0x55550000)); new DefaultTraceLocation(tb.trace, null, Lifespan.nowOn(0), tb.addr(0x55550000));
ProgramLocation ploc = new ProgramLocation(program, tb.addr(stSpace, 0x00400000)); ProgramLocation ploc = new ProgramLocation(program, tb.addr(stSpace, 0x00400000));
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
mappingService.addMapping(tloc, ploc, 0x10000, true); mappingService.addMapping(tloc, ploc, 0x10000, true);
@ -299,7 +296,7 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerG
} }
TraceLocation tloc = TraceLocation tloc =
new DefaultTraceLocation(tb.trace, null, Range.atLeast(0L), tb.addr(0x55550000)); new DefaultTraceLocation(tb.trace, null, Lifespan.nowOn(0), tb.addr(0x55550000));
ProgramLocation ploc = new ProgramLocation(program, tb.addr(stSpace, 0x00400000)); ProgramLocation ploc = new ProgramLocation(program, tb.addr(stSpace, 0x00400000));
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
mappingService.addMapping(tloc, ploc, 0x10000, true); mappingService.addMapping(tloc, ploc, 0x10000, true);

View file

@ -26,8 +26,6 @@ import javax.swing.JCheckBox;
import org.junit.Test; import org.junit.Test;
import com.google.common.collect.Range;
import ghidra.app.plugin.assembler.Assembler; import ghidra.app.plugin.assembler.Assembler;
import ghidra.app.plugin.assembler.Assemblers; import ghidra.app.plugin.assembler.Assemblers;
import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest; import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest;
@ -47,6 +45,7 @@ import ghidra.trace.database.breakpoint.DBTraceBreakpointManager;
import ghidra.trace.database.memory.DBTraceMemoryManager; import ghidra.trace.database.memory.DBTraceMemoryManager;
import ghidra.trace.database.program.DBTraceVariableSnapProgramView; import ghidra.trace.database.program.DBTraceVariableSnapProgramView;
import ghidra.trace.database.symbol.*; import ghidra.trace.database.symbol.*;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.breakpoint.TraceBreakpointKind; import ghidra.trace.model.breakpoint.TraceBreakpointKind;
import ghidra.trace.model.memory.TraceMemoryFlag; import ghidra.trace.model.memory.TraceMemoryFlag;
import ghidra.trace.model.memory.TraceMemoryState; import ghidra.trace.model.memory.TraceMemoryState;
@ -290,7 +289,7 @@ public class DebuggerCopyPlanTests extends AbstractGhidraHeadedDebuggerGUITest {
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.createRegion(".text", 0, trng, TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); memory.createRegion(".text", 0, trng, TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
tb.trace.getRegisterContextManager().setValue(tb.language, rv, Range.atLeast(0L), trng); tb.trace.getRegisterContextManager().setValue(tb.language, rv, Lifespan.nowOn(0), trng);
// TODO: Once GP-1426 is resolved, use the assembler // TODO: Once GP-1426 is resolved, use the assembler
/* /*

View file

@ -27,8 +27,6 @@ import java.util.Set;
import org.junit.*; import org.junit.*;
import org.junit.experimental.categories.Category; import org.junit.experimental.categories.Category;
import com.google.common.collect.Range;
import docking.menu.ActionState; import docking.menu.ActionState;
import docking.menu.MultiStateDockingAction; import docking.menu.MultiStateDockingAction;
import docking.widgets.EventTrigger; import docking.widgets.EventTrigger;
@ -121,10 +119,10 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
} }
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
TraceLocation from = TraceLocation from =
new DefaultTraceLocation(tb.trace, null, Range.atLeast(0L), tb.addr(0x00400000)); new DefaultTraceLocation(tb.trace, null, Lifespan.nowOn(0), tb.addr(0x00400000));
ProgramLocation to = new ProgramLocation(program, ss.getAddress(0x00600000)); ProgramLocation to = new ProgramLocation(program, ss.getAddress(0x00600000));
DebuggerStaticMappingUtils.addMapping(from, to, 0x8000, false); DebuggerStaticMappingUtils.addMapping(from, to, 0x8000, false);
} }
@ -140,7 +138,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
traceManager.activateTrace(tb.trace); traceManager.activateTrace(tb.trace);
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -154,7 +152,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -170,7 +168,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
TraceThread thread = tb.getOrAddThread("Thread1", 0); TraceThread thread = tb.getOrAddThread("Thread1", 0);
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -196,7 +194,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
TraceThread thread = tb.getOrAddThread("Thread1", 0); TraceThread thread = tb.getOrAddThread("Thread1", 0);
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -229,7 +227,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceThread thread2; TraceThread thread2;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread1 = tb.getOrAddThread("Thread1", 0); thread1 = tb.getOrAddThread("Thread1", 0);
thread2 = tb.getOrAddThread("Thread2", 0); thread2 = tb.getOrAddThread("Thread2", 0);
@ -275,7 +273,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
.get(); .get();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread1 = tb.getOrAddThread("Thread1", 0); thread1 = tb.getOrAddThread("Thread1", 0);
thread2 = tb.getOrAddThread("Thread2", 0); thread2 = tb.getOrAddThread("Thread2", 0);
@ -311,9 +309,9 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
memory.addRegion("[stack]", Range.atLeast(0L), tb.range(0x01000000, 0x01ffffff), memory.addRegion("[stack]", Lifespan.nowOn(0), tb.range(0x01000000, 0x01ffffff),
TraceMemoryFlag.READ, TraceMemoryFlag.WRITE); TraceMemoryFlag.READ, TraceMemoryFlag.WRITE);
TraceThread thread = tb.getOrAddThread("Thread1", 0); TraceThread thread = tb.getOrAddThread("Thread1", 0);
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -351,7 +349,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
try (UndoableTransaction tid = b1.startTransaction()) { try (UndoableTransaction tid = b1.startTransaction()) {
b1.trace.getTimeManager().createSnapshot("First snap"); b1.trace.getTimeManager().createSnapshot("First snap");
DBTraceMemoryManager memory = b1.trace.getMemoryManager(); DBTraceMemoryManager memory = b1.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), b1.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), b1.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
t1 = b1.getOrAddThread("Thread1", 0); t1 = b1.getOrAddThread("Thread1", 0);
@ -363,7 +361,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
try (UndoableTransaction tid = b2.startTransaction()) { try (UndoableTransaction tid = b2.startTransaction()) {
b2.trace.getTimeManager().createSnapshot("First snap"); b2.trace.getTimeManager().createSnapshot("First snap");
DBTraceMemoryManager memory = b2.trace.getMemoryManager(); DBTraceMemoryManager memory = b2.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), b2.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), b2.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
t2 = b2.getOrAddThread("Thread2", 0); t2 = b2.getOrAddThread("Thread2", 0);
@ -407,7 +405,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
try (UndoableTransaction tid = b1.startTransaction()) { try (UndoableTransaction tid = b1.startTransaction()) {
b1.trace.getTimeManager().createSnapshot("First snap"); b1.trace.getTimeManager().createSnapshot("First snap");
DBTraceMemoryManager memory = b1.trace.getMemoryManager(); DBTraceMemoryManager memory = b1.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), b1.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), b1.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
t1 = b1.getOrAddThread("Thread1", 0); t1 = b1.getOrAddThread("Thread1", 0);
@ -419,7 +417,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
try (UndoableTransaction tid = b2.startTransaction()) { try (UndoableTransaction tid = b2.startTransaction()) {
b2.trace.getTimeManager().createSnapshot("First snap"); b2.trace.getTimeManager().createSnapshot("First snap");
DBTraceMemoryManager memory = b2.trace.getMemoryManager(); DBTraceMemoryManager memory = b2.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), b2.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), b2.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
t2 = b2.getOrAddThread("Thread2", 0); t2 = b2.getOrAddThread("Thread2", 0);
@ -496,10 +494,10 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
TraceLocation from = TraceLocation from =
new DefaultTraceLocation(tb.trace, null, Range.atLeast(0L), tb.addr(0x00400000)); new DefaultTraceLocation(tb.trace, null, Lifespan.nowOn(0), tb.addr(0x00400000));
ProgramLocation to = new ProgramLocation(program, ss.getAddress(0x00600000)); ProgramLocation to = new ProgramLocation(program, ss.getAddress(0x00600000));
DebuggerStaticMappingUtils.addMapping(from, to, 0x8000, false); DebuggerStaticMappingUtils.addMapping(from, to, 0x8000, false);
@ -575,7 +573,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
// To keep gray out of the color equation // To keep gray out of the color equation
memory.setState(0, tb.range(0x00401233, 0x00401235), TraceMemoryState.KNOWN); memory.setState(0, tb.range(0x00401233, 0x00401235), TraceMemoryState.KNOWN);
@ -609,10 +607,10 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
TraceLocation from = TraceLocation from =
new DefaultTraceLocation(tb.trace, null, Range.atLeast(0L), tb.addr(0x00400000)); new DefaultTraceLocation(tb.trace, null, Lifespan.nowOn(0), tb.addr(0x00400000));
ProgramLocation to = new ProgramLocation(program, ss.getAddress(0x00600000)); ProgramLocation to = new ProgramLocation(program, ss.getAddress(0x00600000));
DebuggerStaticMappingUtils.addMapping(from, to, 0x8000, false); DebuggerStaticMappingUtils.addMapping(from, to, 0x8000, false);
@ -765,7 +763,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
memory.setState(0, tb.addr(0x00401234), TraceMemoryState.KNOWN); memory.setState(0, tb.addr(0x00401234), TraceMemoryState.KNOWN);
memory.setState(0, tb.addr(0x00401235), TraceMemoryState.ERROR); memory.setState(0, tb.addr(0x00401235), TraceMemoryState.ERROR);
@ -825,7 +823,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true); TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true);
@ -866,9 +864,9 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
mm.addRegion("[stack]", Range.atLeast(0L), tb.range(0x1f000000, 0x1fffffff), mm.addRegion("[stack]", Lifespan.nowOn(0), tb.range(0x1f000000, 0x1fffffff),
TraceMemoryFlag.READ, TraceMemoryFlag.WRITE); TraceMemoryFlag.READ, TraceMemoryFlag.WRITE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true); TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true);
@ -1013,7 +1011,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceThread thread2; TraceThread thread2;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread1 = tb.getOrAddThread("Thread1", 0); thread1 = tb.getOrAddThread("Thread1", 0);
thread2 = tb.getOrAddThread("Thread2", 0); thread2 = tb.getOrAddThread("Thread2", 0);
@ -1065,7 +1063,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x55550000, 0x555500ff), .addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x55550000, 0x555500ff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
ProgramSelection sel = new ProgramSelection(tb.set(tb.range(0x55550040, 0x5555004f))); ProgramSelection sel = new ProgramSelection(tb.set(tb.range(0x55550040, 0x5555004f)));
@ -1181,7 +1179,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("bash:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0041ffff), .addRegion("bash:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0041ffff),
Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE)); Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE));
TraceModule bin = tb.trace.getModuleManager() TraceModule bin = tb.trace.getModuleManager()
@ -1212,7 +1210,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("bash:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0041ffff), .addRegion("bash:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0041ffff),
Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE)); Set.of(TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE));
tb.trace.getModuleManager() tb.trace.getModuleManager()
@ -1243,7 +1241,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("test_region", Range.atLeast(0L), tb.range(0x55550000, 0x555502ff), .addRegion("test_region", Lifespan.nowOn(0), tb.range(0x55550000, 0x555502ff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -1253,7 +1251,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
modExe = tb.trace.getModuleManager() modExe = tb.trace.getModuleManager()
.addModule("modExe", "modExe", tb.range(0x55550000, 0x555501ff), .addModule("modExe", "modExe", tb.range(0x55550000, 0x555501ff),
Range.atLeast(0L)); Lifespan.nowOn(0));
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
waitForPass(() -> assertEquals("modExe", listingProvider.locationLabel.getText())); waitForPass(() -> assertEquals("modExe", listingProvider.locationLabel.getText()));
@ -1319,7 +1317,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceThread thread2; TraceThread thread2;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread1 = tb.getOrAddThread("Thread 1", 0); thread1 = tb.getOrAddThread("Thread 1", 0);
thread2 = tb.getOrAddThread("Thread 2", 0); thread2 = tb.getOrAddThread("Thread 2", 0);
@ -1350,7 +1348,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true); TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true);
@ -1378,13 +1376,13 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
DBTraceStackManager sm = tb.trace.getStackManager(); DBTraceStackManager sm = tb.trace.getStackManager();
TraceStack stack = sm.getStack(thread, 0, true); TraceStack stack = sm.getStack(thread, 0, true);
stack.getFrame(0, true).setProgramCounter(Range.all(), tb.addr(0x00401234)); stack.getFrame(0, true).setProgramCounter(Lifespan.ALL, tb.addr(0x00401234));
stack.getFrame(1, true).setProgramCounter(Range.all(), tb.addr(0x00404321)); stack.getFrame(1, true).setProgramCounter(Lifespan.ALL, tb.addr(0x00404321));
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
traceManager.activateThread(thread); traceManager.activateThread(thread);
@ -1408,7 +1406,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
Register pc = tb.language.getProgramCounter(); Register pc = tb.language.getProgramCounter();
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true); TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true);
@ -1439,7 +1437,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
Register pc = tb.language.getProgramCounter(); Register pc = tb.language.getProgramCounter();
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true); TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true);
@ -1474,11 +1472,11 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceStack stack = sm.getStack(thread, 0, true); TraceStack stack = sm.getStack(thread, 0, true);
stack.getFrame(0, true).setProgramCounter(Range.all(), tb.addr(0x00401234)); stack.getFrame(0, true).setProgramCounter(Lifespan.ALL, tb.addr(0x00401234));
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
traceManager.activateThread(thread); traceManager.activateThread(thread);
@ -1488,7 +1486,7 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceStack stack = sm.getStack(thread, 0, true); TraceStack stack = sm.getStack(thread, 0, true);
stack.getFrame(0, true).setProgramCounter(Range.all(), tb.addr(0x00404321)); stack.getFrame(0, true).setProgramCounter(Lifespan.ALL, tb.addr(0x00404321));
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -1512,10 +1510,10 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI
} }
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
TraceLocation from = TraceLocation from =
new DefaultTraceLocation(tb.trace, null, Range.atLeast(0L), tb.addr(0x00400000)); new DefaultTraceLocation(tb.trace, null, Lifespan.nowOn(0), tb.addr(0x00400000));
ProgramLocation to = new ProgramLocation(program, ss.getAddress(0x00600000)); ProgramLocation to = new ProgramLocation(program, ss.getAddress(0x00600000));
mappingService.addMapping(from, to, 0x8000, false); mappingService.addMapping(from, to, 0x8000, false);
} }

View file

@ -30,8 +30,6 @@ import java.util.Objects;
import org.junit.*; import org.junit.*;
import org.junit.experimental.categories.Category; import org.junit.experimental.categories.Category;
import com.google.common.collect.Range;
import docking.ActionContext; import docking.ActionContext;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import docking.dnd.GClipboard; import docking.dnd.GClipboard;
@ -63,6 +61,7 @@ import ghidra.program.util.ProgramSelection;
import ghidra.trace.database.ToyDBTraceBuilder; import ghidra.trace.database.ToyDBTraceBuilder;
import ghidra.trace.database.memory.DBTraceMemoryManager; import ghidra.trace.database.memory.DBTraceMemoryManager;
import ghidra.trace.database.stack.DBTraceStackManager; import ghidra.trace.database.stack.DBTraceStackManager;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.memory.*; import ghidra.trace.model.memory.*;
import ghidra.trace.model.modules.TraceModule; import ghidra.trace.model.modules.TraceModule;
@ -115,7 +114,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
traceManager.activateTrace(tb.trace); traceManager.activateTrace(tb.trace);
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -131,7 +130,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -147,7 +146,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
TraceThread thread = tb.getOrAddThread("Thread1", 0); TraceThread thread = tb.getOrAddThread("Thread1", 0);
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -173,7 +172,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
TraceThread thread = tb.getOrAddThread("Thread1", 0); TraceThread thread = tb.getOrAddThread("Thread1", 0);
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -207,7 +206,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
TraceThread thread2; TraceThread thread2;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread1 = tb.getOrAddThread("Thread1", 0); thread1 = tb.getOrAddThread("Thread1", 0);
thread2 = tb.getOrAddThread("Thread2", 0); thread2 = tb.getOrAddThread("Thread2", 0);
@ -253,7 +252,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
.get(); .get();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread1 = tb.getOrAddThread("Thread1", 0); thread1 = tb.getOrAddThread("Thread1", 0);
thread2 = tb.getOrAddThread("Thread2", 0); thread2 = tb.getOrAddThread("Thread2", 0);
@ -289,9 +288,9 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
memory.addRegion("[stack]", Range.atLeast(0L), tb.range(0x01000000, 0x01ffffff), memory.addRegion("[stack]", Lifespan.nowOn(0), tb.range(0x01000000, 0x01ffffff),
TraceMemoryFlag.READ, TraceMemoryFlag.WRITE); TraceMemoryFlag.READ, TraceMemoryFlag.WRITE);
TraceThread thread = tb.getOrAddThread("Thread1", 0); TraceThread thread = tb.getOrAddThread("Thread1", 0);
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -328,7 +327,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
try (UndoableTransaction tid = b1.startTransaction()) { try (UndoableTransaction tid = b1.startTransaction()) {
b1.trace.getTimeManager().createSnapshot("First snap"); b1.trace.getTimeManager().createSnapshot("First snap");
DBTraceMemoryManager memory = b1.trace.getMemoryManager(); DBTraceMemoryManager memory = b1.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), b1.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), b1.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
t1 = b1.getOrAddThread("Thread1", 0); t1 = b1.getOrAddThread("Thread1", 0);
@ -340,7 +339,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
try (UndoableTransaction tid = b2.startTransaction()) { try (UndoableTransaction tid = b2.startTransaction()) {
b2.trace.getTimeManager().createSnapshot("First snap"); b2.trace.getTimeManager().createSnapshot("First snap");
DBTraceMemoryManager memory = b2.trace.getMemoryManager(); DBTraceMemoryManager memory = b2.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), b2.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), b2.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
t2 = b2.getOrAddThread("Thread2", 0); t2 = b2.getOrAddThread("Thread2", 0);
@ -379,7 +378,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
try (UndoableTransaction tid = b1.startTransaction()) { try (UndoableTransaction tid = b1.startTransaction()) {
b1.trace.getTimeManager().createSnapshot("First snap"); b1.trace.getTimeManager().createSnapshot("First snap");
DBTraceMemoryManager memory = b1.trace.getMemoryManager(); DBTraceMemoryManager memory = b1.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), b1.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), b1.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
t1 = b1.getOrAddThread("Thread1", 0); t1 = b1.getOrAddThread("Thread1", 0);
@ -391,7 +390,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
try (UndoableTransaction tid = b2.startTransaction()) { try (UndoableTransaction tid = b2.startTransaction()) {
b2.trace.getTimeManager().createSnapshot("First snap"); b2.trace.getTimeManager().createSnapshot("First snap");
DBTraceMemoryManager memory = b2.trace.getMemoryManager(); DBTraceMemoryManager memory = b2.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), b2.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), b2.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
t2 = b2.getOrAddThread("Thread2", 0); t2 = b2.getOrAddThread("Thread2", 0);
@ -450,7 +449,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
// To keep gray out of the color equation // To keep gray out of the color equation
memory.setState(0, tb.range(0x00401233, 0x00401235), TraceMemoryState.KNOWN); memory.setState(0, tb.range(0x00401233, 0x00401235), TraceMemoryState.KNOWN);
@ -552,7 +551,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
memory.setState(0, tb.addr(0x00401234), TraceMemoryState.KNOWN); memory.setState(0, tb.addr(0x00401234), TraceMemoryState.KNOWN);
memory.setState(0, tb.addr(0x00401235), TraceMemoryState.ERROR); memory.setState(0, tb.addr(0x00401235), TraceMemoryState.ERROR);
@ -615,7 +614,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true); TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true);
@ -656,9 +655,9 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
mm.addRegion("[stack]", Range.atLeast(0L), tb.range(0x1f000000, 0x1fffffff), mm.addRegion("[stack]", Lifespan.nowOn(0), tb.range(0x1f000000, 0x1fffffff),
TraceMemoryFlag.READ, TraceMemoryFlag.WRITE); TraceMemoryFlag.READ, TraceMemoryFlag.WRITE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true); TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true);
@ -709,7 +708,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
TraceThread thread2; TraceThread thread2;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager memory = tb.trace.getMemoryManager(); DBTraceMemoryManager memory = tb.trace.getMemoryManager();
memory.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), memory.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread1 = tb.getOrAddThread("Thread1", 0); thread1 = tb.getOrAddThread("Thread1", 0);
thread2 = tb.getOrAddThread("Thread2", 0); thread2 = tb.getOrAddThread("Thread2", 0);
@ -762,7 +761,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
createAndOpenTrace(); createAndOpenTrace();
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x55550000, 0x555500ff), .addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x55550000, 0x555500ff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
ProgramSelection sel = new ProgramSelection(tb.set(tb.range(0x55550040, 0x5555004f))); ProgramSelection sel = new ProgramSelection(tb.set(tb.range(0x55550040, 0x5555004f)));
@ -882,7 +881,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
tb.trace.getMemoryManager() tb.trace.getMemoryManager()
.addRegion("test_region", Range.atLeast(0L), tb.range(0x55550000, 0x555502ff), .addRegion("test_region", Lifespan.nowOn(0), tb.range(0x55550000, 0x555502ff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -894,7 +893,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
modExe = tb.trace.getModuleManager() modExe = tb.trace.getModuleManager()
.addModule("modExe", "modExe", tb.range(0x55550000, 0x555501ff), .addModule("modExe", "modExe", tb.range(0x55550000, 0x555501ff),
Range.atLeast(0L)); Lifespan.nowOn(0));
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
waitForPass(() -> assertEquals("modExe", memBytesProvider.locationLabel.getText())); waitForPass(() -> assertEquals("modExe", memBytesProvider.locationLabel.getText()));
@ -917,7 +916,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
TraceThread thread2; TraceThread thread2;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread1 = tb.getOrAddThread("Thread 1", 0); thread1 = tb.getOrAddThread("Thread 1", 0);
thread2 = tb.getOrAddThread("Thread 2", 0); thread2 = tb.getOrAddThread("Thread 2", 0);
@ -948,7 +947,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true); TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true);
@ -976,13 +975,13 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
DBTraceStackManager sm = tb.trace.getStackManager(); DBTraceStackManager sm = tb.trace.getStackManager();
TraceStack stack = sm.getStack(thread, 0, true); TraceStack stack = sm.getStack(thread, 0, true);
stack.getFrame(0, true).setProgramCounter(Range.all(), tb.addr(0x00401234)); stack.getFrame(0, true).setProgramCounter(Lifespan.ALL, tb.addr(0x00401234));
stack.getFrame(1, true).setProgramCounter(Range.all(), tb.addr(0x00404321)); stack.getFrame(1, true).setProgramCounter(Lifespan.ALL, tb.addr(0x00404321));
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
traceManager.activateThread(thread); traceManager.activateThread(thread);
@ -1006,7 +1005,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
Register pc = tb.language.getProgramCounter(); Register pc = tb.language.getProgramCounter();
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true); TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true);
@ -1037,7 +1036,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
Register pc = tb.language.getProgramCounter(); Register pc = tb.language.getProgramCounter();
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true); TraceMemorySpace regs = mm.getMemoryRegisterSpace(thread, true);
@ -1072,11 +1071,11 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
TraceThread thread; TraceThread thread;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
DBTraceMemoryManager mm = tb.trace.getMemoryManager(); DBTraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("exe:.text", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("exe:.text", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
thread = tb.getOrAddThread("Thread 1", 0); thread = tb.getOrAddThread("Thread 1", 0);
TraceStack stack = sm.getStack(thread, 0, true); TraceStack stack = sm.getStack(thread, 0, true);
stack.getFrame(0, true).setProgramCounter(Range.all(), tb.addr(0x00401234)); stack.getFrame(0, true).setProgramCounter(Lifespan.ALL, tb.addr(0x00401234));
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
traceManager.activateThread(thread); traceManager.activateThread(thread);
@ -1086,7 +1085,7 @@ public class DebuggerMemoryBytesProviderTest extends AbstractGhidraHeadedDebugge
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceStack stack = sm.getStack(thread, 0, true); TraceStack stack = sm.getStack(thread, 0, true);
stack.getFrame(0, true).setProgramCounter(Range.all(), tb.addr(0x00404321)); stack.getFrame(0, true).setProgramCounter(Lifespan.ALL, tb.addr(0x00404321));
} }
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);

View file

@ -23,8 +23,6 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.experimental.categories.Category; import org.junit.experimental.categories.Category;
import com.google.common.collect.Range;
import generic.Unique; import generic.Unique;
import generic.test.category.NightlyCategory; import generic.test.category.NightlyCategory;
import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest; import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest;
@ -39,6 +37,7 @@ import ghidra.program.model.address.AddressSet;
import ghidra.program.model.mem.Memory; import ghidra.program.model.mem.Memory;
import ghidra.program.model.mem.MemoryBlock; import ghidra.program.model.mem.MemoryBlock;
import ghidra.program.util.ProgramSelection; import ghidra.program.util.ProgramSelection;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.memory.*; import ghidra.trace.model.memory.*;
import ghidra.trace.model.modules.TraceStaticMapping; import ghidra.trace.model.modules.TraceStaticMapping;
import ghidra.util.database.UndoableTransaction; import ghidra.util.database.UndoableTransaction;
@ -107,7 +106,7 @@ public class DebuggerRegionsProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceMemoryRegion region; TraceMemoryRegion region;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceMemoryManager mm = tb.trace.getMemoryManager(); TraceMemoryManager mm = tb.trace.getMemoryManager();
region = mm.addRegion("Memory[bin:.text]", Range.atLeast(0L), region = mm.addRegion("Memory[bin:.text]", Lifespan.nowOn(0),
tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
@ -124,7 +123,7 @@ public class DebuggerRegionsProviderTest extends AbstractGhidraHeadedDebuggerGUI
assertEquals(0x10000, row.getLength()); assertEquals(0x10000, row.getLength());
assertEquals(0L, row.getCreatedSnap()); assertEquals(0L, row.getCreatedSnap());
assertEquals("", row.getDestroyedSnap()); assertEquals("", row.getDestroyedSnap());
assertEquals(Range.atLeast(0L), row.getLifespan()); assertEquals(Lifespan.nowOn(0), row.getLifespan());
} }
@Test @Test
@ -135,7 +134,7 @@ public class DebuggerRegionsProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceMemoryRegion region; TraceMemoryRegion region;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceMemoryManager mm = tb.trace.getMemoryManager(); TraceMemoryManager mm = tb.trace.getMemoryManager();
region = mm.addRegion("Memory[bin:.text]", Range.atLeast(0L), region = mm.addRegion("Memory[bin:.text]", Lifespan.nowOn(0),
tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
@ -152,7 +151,7 @@ public class DebuggerRegionsProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceMemoryRegion region; TraceMemoryRegion region;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceMemoryManager mm = tb.trace.getMemoryManager(); TraceMemoryManager mm = tb.trace.getMemoryManager();
region = mm.addRegion("Memory[bin:.text]", Range.atLeast(0L), region = mm.addRegion("Memory[bin:.text]", Lifespan.nowOn(0),
tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
@ -177,7 +176,7 @@ public class DebuggerRegionsProviderTest extends AbstractGhidraHeadedDebuggerGUI
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceMemoryManager mm = tb.trace.getMemoryManager(); TraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("Memory[bin:.text]", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("Memory[bin:.text]", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
@ -200,7 +199,7 @@ public class DebuggerRegionsProviderTest extends AbstractGhidraHeadedDebuggerGUI
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceMemoryManager mm = tb.trace.getMemoryManager(); TraceMemoryManager mm = tb.trace.getMemoryManager();
mm.addRegion("Memory[bin:.text]", Range.atLeast(0L), tb.range(0x00400000, 0x0040ffff), mm.addRegion("Memory[bin:.text]", Lifespan.nowOn(0), tb.range(0x00400000, 0x0040ffff),
TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
waitForDomainObject(tb.trace); waitForDomainObject(tb.trace);
@ -221,7 +220,7 @@ public class DebuggerRegionsProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceMemoryRegion region; TraceMemoryRegion region;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceMemoryManager mm = tb.trace.getMemoryManager(); TraceMemoryManager mm = tb.trace.getMemoryManager();
region = mm.addRegion("Memory[bin:.text]", Range.atLeast(0L), region = mm.addRegion("Memory[bin:.text]", Lifespan.nowOn(0),
tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
@ -309,13 +308,13 @@ public class DebuggerRegionsProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceStaticMapping sm; TraceStaticMapping sm;
sm = mit.next(); sm = mit.next();
assertEquals(Range.atLeast(0L), sm.getLifespan()); assertEquals(Lifespan.nowOn(0), sm.getLifespan());
assertEquals("ram:00400000", sm.getStaticAddress()); assertEquals("ram:00400000", sm.getStaticAddress());
assertEquals(0x100, sm.getLength()); assertEquals(0x100, sm.getLength());
assertEquals(tb.addr(0x55550000), sm.getMinTraceAddress()); assertEquals(tb.addr(0x55550000), sm.getMinTraceAddress());
sm = mit.next(); sm = mit.next();
assertEquals(Range.atLeast(0L), sm.getLifespan()); assertEquals(Lifespan.nowOn(0), sm.getLifespan());
assertEquals("ram:00600000", sm.getStaticAddress()); assertEquals("ram:00600000", sm.getStaticAddress());
assertEquals(0x80, sm.getLength()); assertEquals(0x80, sm.getLength());
assertEquals(tb.addr(0x55750000), sm.getMinTraceAddress()); assertEquals(tb.addr(0x55750000), sm.getMinTraceAddress());
@ -336,7 +335,7 @@ public class DebuggerRegionsProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceMemoryRegion region; TraceMemoryRegion region;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceMemoryManager mm = tb.trace.getMemoryManager(); TraceMemoryManager mm = tb.trace.getMemoryManager();
region = mm.addRegion("Memory[bin:.text]", Range.atLeast(0L), region = mm.addRegion("Memory[bin:.text]", Lifespan.nowOn(0),
tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }
@ -368,7 +367,7 @@ public class DebuggerRegionsProviderTest extends AbstractGhidraHeadedDebuggerGUI
TraceMemoryRegion region; TraceMemoryRegion region;
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceMemoryManager mm = tb.trace.getMemoryManager(); TraceMemoryManager mm = tb.trace.getMemoryManager();
region = mm.addRegion("Memory[bin:.text]", Range.atLeast(0L), region = mm.addRegion("Memory[bin:.text]", Lifespan.nowOn(0),
tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE); tb.range(0x00400000, 0x0040ffff), TraceMemoryFlag.READ, TraceMemoryFlag.EXECUTE);
} }

View file

@ -23,8 +23,6 @@ import java.util.Set;
import org.jdom.JDOMException; import org.jdom.JDOMException;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Range;
import docking.widgets.table.DynamicTableColumn; import docking.widgets.table.DynamicTableColumn;
import docking.widgets.table.GDynamicColumnTableModel; import docking.widgets.table.GDynamicColumnTableModel;
import docking.widgets.tree.support.GTreeSelectionEvent.EventOrigin; import docking.widgets.tree.support.GTreeSelectionEvent.EventOrigin;
@ -41,6 +39,7 @@ import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.SchemaContext; import ghidra.dbg.target.schema.SchemaContext;
import ghidra.dbg.target.schema.TargetObjectSchema.SchemaName; import ghidra.dbg.target.schema.TargetObjectSchema.SchemaName;
import ghidra.dbg.target.schema.XmlSchemaContext; import ghidra.dbg.target.schema.XmlSchemaContext;
import ghidra.trace.model.Lifespan;
import ghidra.trace.model.target.*; import ghidra.trace.model.target.*;
import ghidra.trace.model.target.TraceObject.ConflictResolution; import ghidra.trace.model.target.TraceObject.ConflictResolution;
import ghidra.trace.model.thread.TraceObjectThread; import ghidra.trace.model.thread.TraceObjectThread;
@ -145,17 +144,17 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerGUITe
TraceObjectManager objects = tb.trace.getObjectManager(); TraceObjectManager objects = tb.trace.getObjectManager();
TraceObjectKeyPath threadContainerPath = TraceObjectKeyPath.parse("Processes[0].Threads"); TraceObjectKeyPath threadContainerPath = TraceObjectKeyPath.parse("Processes[0].Threads");
TraceObject thread = objects.createObject(threadContainerPath.index(i)); TraceObject thread = objects.createObject(threadContainerPath.index(i));
thread.insert(Range.closed(i, 10L), ConflictResolution.DENY); thread.insert(Lifespan.span(i, 10), ConflictResolution.DENY);
thread.insert(Range.atLeast(10 + i), ConflictResolution.DENY); thread.insert(Lifespan.nowOn(10 + i), ConflictResolution.DENY);
thread.setAttribute(Range.atLeast(i), "Attribute " + i, "Some value"); thread.setAttribute(Lifespan.nowOn(i), "Attribute " + i, "Some value");
thread.setAttribute(Range.atLeast(i), "_display", "Thread " + i); thread.setAttribute(Lifespan.nowOn(i), "_display", "Thread " + i);
thread.setAttribute(Range.atLeast(i), "_self", thread); thread.setAttribute(Lifespan.nowOn(i), "_self", thread);
if (prevThread != null) { if (prevThread != null) {
thread.setAttribute(Range.atLeast(i), "_prev", prevThread); thread.setAttribute(Lifespan.nowOn(i), "_prev", prevThread);
prevThread.setAttribute(Range.atLeast(i), "_next", thread); prevThread.setAttribute(Lifespan.nowOn(i), "_next", thread);
} }
objects.getRootObject() objects.getRootObject()
.setAttribute(Range.atLeast(i), TargetEventScope.EVENT_OBJECT_ATTRIBUTE_NAME, .setAttribute(Lifespan.nowOn(i), TargetEventScope.EVENT_OBJECT_ATTRIBUTE_NAME,
thread); thread);
return thread; return thread;
} }
@ -166,9 +165,9 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerGUITe
TraceObjectManager objects = tb.trace.getObjectManager(); TraceObjectManager objects = tb.trace.getObjectManager();
TraceObject stack = objects.createObject(stackPath); TraceObject stack = objects.createObject(stackPath);
objects.createObject(stackPath.index(0)) objects.createObject(stackPath.index(0))
.insert(thread.getLife().span(), ConflictResolution.TRUNCATE); .insert(thread.getLife().bound(), ConflictResolution.TRUNCATE);
objects.createObject(stackPath.index(1)) objects.createObject(stackPath.index(1))
.insert(thread.getLife().span(), ConflictResolution.TRUNCATE); .insert(thread.getLife().bound(), ConflictResolution.TRUNCATE);
return stack; return stack;
} }
} }
@ -196,9 +195,9 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerGUITe
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceObject handleContainer = TraceObject handleContainer =
objects.createObject(TraceObjectKeyPath.parse("Processes[0].Handles")); objects.createObject(TraceObjectKeyPath.parse("Processes[0].Handles"));
handleContainer.insert(Range.atLeast(0L), ConflictResolution.DENY); handleContainer.insert(Lifespan.nowOn(0), ConflictResolution.DENY);
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
handleContainer.setElement(Range.atLeast((long) -i), i, handleContainer.setElement(Lifespan.nowOn(-i), i,
(i * 0xdeadbeef) % 0xbadc0de); (i * 0xdeadbeef) % 0xbadc0de);
} }
} }
@ -210,9 +209,9 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerGUITe
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceObject linkContainer = TraceObject linkContainer =
objects.createObject(TraceObjectKeyPath.parse("Processes[0].Links")); objects.createObject(TraceObjectKeyPath.parse("Processes[0].Links"));
linkContainer.insert(Range.atLeast(0L), ConflictResolution.DENY); linkContainer.insert(Lifespan.nowOn(0), ConflictResolution.DENY);
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
linkContainer.setElement(Range.atLeast(0L), i, linkContainer.setElement(Lifespan.nowOn(0), i,
objects.getObjectByCanonicalPath(threadContainerPath.index(9 - i))); objects.getObjectByCanonicalPath(threadContainerPath.index(9 - i)));
} }
} }
@ -223,9 +222,9 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerGUITe
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceObject boxed = TraceObject boxed =
objects.createObject(TraceObjectKeyPath.parse("Processes[0].Boxed")); objects.createObject(TraceObjectKeyPath.parse("Processes[0].Boxed"));
boxed.insert(Range.atLeast(0L), ConflictResolution.DENY); boxed.insert(Lifespan.nowOn(0), ConflictResolution.DENY);
boxed.setAttribute(Range.atLeast(2L), TargetObject.DISPLAY_ATTRIBUTE_NAME, "2"); boxed.setAttribute(Lifespan.nowOn(2), TargetObject.DISPLAY_ATTRIBUTE_NAME, "2");
boxed.setAttribute(Range.atLeast(4L), TargetObject.DISPLAY_ATTRIBUTE_NAME, "4"); boxed.setAttribute(Lifespan.nowOn(4), TargetObject.DISPLAY_ATTRIBUTE_NAME, "4");
} }
} }
@ -656,7 +655,7 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerGUITe
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceObject thread = tb.trace.getObjectManager().getObjectByCanonicalPath(path); TraceObject thread = tb.trace.getObjectManager().getObjectByCanonicalPath(path);
thread.setAttribute(Range.atLeast(0L), "NewAttribute", 11); thread.setAttribute(Lifespan.nowOn(0), "NewAttribute", 11);
} }
waitForTasks(); waitForTasks();
@ -677,7 +676,7 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerGUITe
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceObject threads = tb.trace.getObjectManager().getObjectByCanonicalPath(path); TraceObject threads = tb.trace.getObjectManager().getObjectByCanonicalPath(path);
threads.setElement(Range.all(), 2, null); threads.setElement(Lifespan.ALL, 2, null);
} }
waitForTasks(); waitForTasks();
@ -698,7 +697,7 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerGUITe
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
TraceObject thread = tb.trace.getObjectManager().getObjectByCanonicalPath(path); TraceObject thread = tb.trace.getObjectManager().getObjectByCanonicalPath(path);
thread.setAttribute(Range.all(), "_self", null); thread.setAttribute(Lifespan.ALL, "_self", null);
} }
waitForTasks(); waitForTasks();
@ -722,14 +721,14 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerGUITe
assertPathIs(path, 3, 0); assertPathIs(path, 3, 0);
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
element2.setLifespan(Range.atLeast(10L), ConflictResolution.DENY); element2.setLifespan(Lifespan.nowOn(10), ConflictResolution.DENY);
} }
waitForTasks(); waitForTasks();
assertPathIs(path, 2, 0); assertPathIs(path, 2, 0);
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
element2.setLifespan(Range.atLeast(2L), ConflictResolution.DENY); element2.setLifespan(Lifespan.nowOn(2), ConflictResolution.DENY);
} }
waitForTasks(); waitForTasks();
@ -754,14 +753,14 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerGUITe
assertPathIs(path, 0, 4); // _next created at snap 3 assertPathIs(path, 0, 4); // _next created at snap 3
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
attrSelf.setLifespan(Range.atLeast(10L), ConflictResolution.DENY); attrSelf.setLifespan(Lifespan.nowOn(10), ConflictResolution.DENY);
} }
waitForTasks(); waitForTasks();
assertPathIs(path, 0, 3); assertPathIs(path, 0, 3);
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
attrSelf.setLifespan(Range.atLeast(2L), ConflictResolution.DENY); attrSelf.setLifespan(Lifespan.nowOn(2), ConflictResolution.DENY);
} }
waitForTasks(); waitForTasks();
@ -784,7 +783,7 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerGUITe
assertEquals("<html>[2]", node.getDisplayText()); assertEquals("<html>[2]", node.getDisplayText());
try (UndoableTransaction tid = tb.startTransaction()) { try (UndoableTransaction tid = tb.startTransaction()) {
thread.setAttribute(Range.atLeast(0L), "_display", "Renamed Thread"); thread.setAttribute(Lifespan.nowOn(0), "_display", "Renamed Thread");
} }
waitForTasks(); waitForTasks();

Some files were not shown because too many files have changed in this diff Show more