mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 17:59:46 +02:00
GP-1543: Replace Range<Long> with Lifespan, ULongSpan, KeySpan,
FieldSpan
This commit is contained in:
parent
d0b55e1d33
commit
776413921f
349 changed files with 6102 additions and 4225 deletions
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)));
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
@ -56,12 +53,11 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
|
||||||
protected final FridaModelTargetMemoryScanImpl scan;
|
protected final FridaModelTargetMemoryScanImpl scan;
|
||||||
protected final FridaModelTargetMemoryProtectImpl prot;
|
protected final FridaModelTargetMemoryProtectImpl prot;
|
||||||
protected final FridaModelTargetMemoryWatchImpl watch;
|
protected final FridaModelTargetMemoryWatchImpl watch;
|
||||||
protected final FridaModelTargetUnloadScriptImpl unload;
|
protected final FridaModelTargetUnloadScriptImpl unload;
|
||||||
|
|
||||||
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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
@ -68,12 +53,11 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
|
||||||
protected final FridaModelTargetMemoryPatchImpl patch;
|
protected final FridaModelTargetMemoryPatchImpl patch;
|
||||||
protected final FridaModelTargetMemoryProtectImpl prot;
|
protected final FridaModelTargetMemoryProtectImpl prot;
|
||||||
protected final FridaModelTargetMemoryWatchImpl watch;
|
protected final FridaModelTargetMemoryWatchImpl watch;
|
||||||
protected final FridaModelTargetUnloadScriptImpl unload;
|
protected final FridaModelTargetUnloadScriptImpl unload;
|
||||||
|
|
||||||
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;
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 -> {
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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]);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 -> {
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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<>();
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 =
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue