mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2024-10-23 21:50:49 +00:00
GP-3162: refresh bool->enum
This commit is contained in:
parent
a9baf9f6d8
commit
15c4345d71
|
@ -18,6 +18,7 @@ package agent.dbgeng.model.iface2;
|
|||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import agent.dbgeng.manager.DbgModuleMemory;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetMemory;
|
||||
import ghidra.program.model.address.Address;
|
||||
|
||||
|
@ -31,6 +32,6 @@ public interface DbgModelTargetMemoryContainer extends DbgModelTargetObject, Tar
|
|||
@Override
|
||||
public CompletableFuture<Void> writeMemory(Address address, byte[] data);
|
||||
|
||||
public CompletableFuture<Void> requestElements(boolean refresh);
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh);
|
||||
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||
import agent.dbgeng.model.iface1.DbgModelTargetConfigurable;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -50,7 +51,7 @@ public class DbgModelTargetAvailableContainerImpl extends DbgModelTargetObjectIm
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listAvailableProcesses().thenAccept(list -> {
|
||||
List<TargetObject> available;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -25,6 +25,7 @@ import agent.dbgeng.manager.DbgProcess;
|
|||
import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
|
||||
import agent.dbgeng.manager.impl.DbgManagerImpl;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -109,7 +110,7 @@ public class DbgModelTargetBreakpointContainerImpl extends DbgModelTargetObjectI
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
DbgManagerImpl manager = getManager();
|
||||
return manager.listBreakpoints().thenAccept(byNumber -> {
|
||||
List<TargetObject> specs;
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetBreakpointContainer;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetBreakpointSpec;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetBreakpointLocation;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
|
@ -163,7 +164,7 @@ public class DbgModelTargetBreakpointSpecImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getInfo().thenAccept(i -> {
|
||||
synchronized (this) {
|
||||
setBreakpointInfo(i);
|
||||
|
|
|
@ -26,6 +26,7 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
|
|||
import agent.dbgeng.manager.impl.DbgProcessImpl;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
@ -48,14 +49,14 @@ public class DbgModelTargetEventContainerImpl extends DbgModelTargetObjectImpl
|
|||
public DbgModelTargetEventContainerImpl(DbgModelTargetDebugContainer debug) {
|
||||
super(debug.getModel(), debug, "Events", "EventContainer");
|
||||
this.debug = debug;
|
||||
requestElements(true);
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
DbgModelTargetProcess targetProcess = getParentProcess();
|
||||
DbgProcessImpl currentProcess = getManager().getCurrentProcess();
|
||||
if (!refresh ||
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS) ||
|
||||
(currentProcess != null && !currentProcess.equals(targetProcess.getProcess()))) {
|
||||
return AsyncUtils.NIL;
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
|
|||
import agent.dbgeng.manager.impl.DbgProcessImpl;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
@ -48,14 +49,14 @@ public class DbgModelTargetExceptionContainerImpl extends DbgModelTargetObjectIm
|
|||
public DbgModelTargetExceptionContainerImpl(DbgModelTargetDebugContainer debug) {
|
||||
super(debug.getModel(), debug, "Exceptions", "ExceptionContainer");
|
||||
this.debug = debug;
|
||||
requestElements(true);
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
DbgModelTargetProcess targetProcess = getParentProcess();
|
||||
DbgProcessImpl currentProcess = getManager().getCurrentProcess();
|
||||
if (!refresh ||
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS) ||
|
||||
(currentProcess != null && !currentProcess.equals(targetProcess.getProcess()))) {
|
||||
return AsyncUtils.NIL;
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ import agent.dbgeng.model.iface2.*;
|
|||
import generic.ULongSpan;
|
||||
import generic.ULongSpan.ULongSpanSet;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerMemoryAccessException;
|
||||
import ghidra.dbg.error.DebuggerModelAccessException;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -54,15 +55,15 @@ public class DbgModelTargetMemoryContainerImpl extends DbgModelTargetObjectImpl
|
|||
super(process.getModel(), process, "Memory", "MemoryContainer");
|
||||
this.process = process;
|
||||
if (!getModel().isSuppressDescent()) {
|
||||
requestElements(true);
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
DbgModelTargetProcess targetProcess = getParentProcess();
|
||||
DbgProcessImpl currentProcess = getManager().getCurrentProcess();
|
||||
if (!refresh ||
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS) ||
|
||||
(currentProcess != null && !currentProcess.equals(targetProcess.getProcess()))) {
|
||||
return AsyncUtils.NIL;
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ import agent.dbgeng.manager.DbgModule;
|
|||
import agent.dbgeng.manager.DbgProcess;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetModule;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetModuleContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -49,7 +50,7 @@ public class DbgModelTargetModuleContainerImpl extends DbgModelTargetObjectImpl
|
|||
this.targetProcess = process;
|
||||
this.process = process.process;
|
||||
if (!getModel().isSuppressDescent()) {
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -99,7 +100,7 @@ public class DbgModelTargetModuleContainerImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
List<TargetObject> result = new ArrayList<>();
|
||||
return process.listModules().thenAccept(byName -> {
|
||||
synchronized (this) {
|
||||
|
|
|
@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
import agent.dbgeng.manager.DbgModule;
|
||||
import agent.dbgeng.manager.DbgModuleSection;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
|
@ -38,7 +39,7 @@ public class DbgModelTargetModuleSectionContainerImpl extends DbgModelTargetObje
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
/*
|
||||
return module.listSections().thenAccept(byStart -> {
|
||||
|
|
|
@ -26,6 +26,7 @@ import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
|
|||
import agent.dbgeng.model.iface1.DbgModelTargetConfigurable;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -103,7 +104,7 @@ public class DbgModelTargetProcessContainerImpl extends DbgModelTargetObjectImpl
|
|||
DbgModelTargetProcess process = getTargetProcess(proc);
|
||||
DbgModelTargetMemoryContainer memory = process.getMemory();
|
||||
if (memory != null) {
|
||||
memory.requestElements(true);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -116,7 +117,7 @@ public class DbgModelTargetProcessContainerImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
DbgModelTargetMemoryContainer memory = process.getMemory();
|
||||
if (memory != null) {
|
||||
memory.requestElements(true);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -126,12 +127,12 @@ public class DbgModelTargetProcessContainerImpl extends DbgModelTargetObjectImpl
|
|||
process.getModules().libraryUnloaded(info.toString());
|
||||
DbgModelTargetMemoryContainer memory = process.getMemory();
|
||||
if (memory != null) {
|
||||
memory.requestElements(false);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listProcesses().thenAccept(byIID -> {
|
||||
List<TargetObject> processes;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -24,6 +24,7 @@ import agent.dbgeng.manager.*;
|
|||
import agent.dbgeng.manager.impl.DbgManagerImpl;
|
||||
import agent.dbgeng.model.iface1.DbgModelTargetFocusScope;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.TargetEventScope.TargetEventType;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -263,9 +264,9 @@ public class DbgModelTargetProcessImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> resync(boolean refreshAttributes, boolean refreshElements) {
|
||||
public CompletableFuture<Void> resync(RefreshBehavior refreshAttributes, RefreshBehavior refreshElements) {
|
||||
if (memory != null) {
|
||||
memory.requestElements(true);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
return super.resync(refreshAttributes, refreshElements);
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
|
|||
import agent.dbgeng.manager.impl.DbgRegister;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerRegisterAccessException;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.TargetRegisterBank;
|
||||
|
@ -57,7 +58,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
|
|||
this.thread = thread.getThread();
|
||||
|
||||
if (!getModel().isSuppressDescent()) {
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
changeAttributes(List.of(), List.of(), Map.of( //
|
||||
TargetRegisterBank.DESCRIPTIONS_ATTRIBUTE_NAME, this //
|
||||
), "Initialized");
|
||||
|
@ -65,7 +66,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return thread.listRegisters().thenAccept(regs -> {
|
||||
if (regs.size() != registersByName.size()) {
|
||||
DbgModelImpl impl = (DbgModelImpl) model;
|
||||
|
@ -109,7 +110,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
|
|||
Collection<String> names) {
|
||||
return model.gateFuture(thread.listRegisters().thenCompose(regs -> {
|
||||
if (regs.size() != registersByName.size() || getCachedElements().isEmpty()) {
|
||||
return requestElements(false);
|
||||
return requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
return AsyncUtils.NIL;
|
||||
}).thenCompose(__ -> {
|
||||
|
@ -144,7 +145,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
|
|||
public CompletableFuture<Void> writeRegistersNamed(Map<String, byte[]> values) {
|
||||
DbgManagerImpl manager = getManager();
|
||||
return model.gateFuture(thread.listRegisters().thenCompose(regs -> {
|
||||
return requestElements(false);
|
||||
return requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}).thenCompose(__ -> {
|
||||
Map<String, ? extends TargetObject> regs = getCachedElements();
|
||||
Map<DbgRegister, BigInteger> toWrite = new LinkedHashMap<>();
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSession;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSessionAttributes;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(
|
||||
|
@ -58,7 +59,7 @@ public class DbgModelTargetSessionAttributesImpl extends DbgModelTargetObjectImp
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ import agent.dbgeng.dbgeng.DebugSessionId;
|
|||
import agent.dbgeng.manager.DbgCause;
|
||||
import agent.dbgeng.manager.DbgSession;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
|
@ -65,7 +66,7 @@ public class DbgModelTargetSessionContainerImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
/*
|
||||
DbgManagerImpl manager = getManager();
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import agent.dbgeng.manager.*;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.Msg;
|
||||
|
@ -52,7 +53,7 @@ public class DbgModelTargetStackImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return thread.getThread().listStackFrames().thenAccept(f -> {
|
||||
List<TargetObject> frames;
|
||||
synchronized (this) {
|
||||
|
@ -85,7 +86,7 @@ public class DbgModelTargetStackImpl extends DbgModelTargetObjectImpl
|
|||
|
||||
public void threadStateChangedSpecific(DbgState state, DbgReason reason) {
|
||||
if (!state.equals(DbgState.RUNNING)) {
|
||||
requestElements(true).exceptionally(e -> {
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS).exceptionally(e -> {
|
||||
Msg.error(this, "Could not update stack " + this + " on STOPPED");
|
||||
return null;
|
||||
});
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import agent.dbgeng.manager.impl.DbgMinimalSymbol;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSymbolContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -45,7 +46,7 @@ public class DbgModelTargetSymbolContainerImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return module.module.listMinimalSymbols().thenAccept(byName -> {
|
||||
List<TargetObject> symbols;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -26,6 +26,7 @@ import agent.dbgeng.manager.reason.*;
|
|||
import agent.dbgeng.model.iface1.DbgModelTargetConfigurable;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -53,7 +54,7 @@ public class DbgModelTargetThreadContainerImpl extends DbgModelTargetObjectImpl
|
|||
|
||||
getManager().addEventsListener(this);
|
||||
if (!getModel().isSuppressDescent()) {
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -119,7 +120,7 @@ public class DbgModelTargetThreadContainerImpl extends DbgModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return process.listThreads().thenAccept(byTID -> {
|
||||
List<TargetObject> threads;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
||||
|
@ -36,7 +37,7 @@ public class DbgModel2TargetAvailableContainerImpl extends DbgModel2TargetObject
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listAvailableProcesses().thenAccept(list -> {
|
||||
List<TargetObject> available;
|
||||
synchronized (this) {
|
||||
|
@ -49,7 +50,7 @@ public class DbgModel2TargetAvailableContainerImpl extends DbgModel2TargetObject
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
Map<String, Object> nmap = new HashMap<>();
|
||||
return addModelObjectAttributes(nmap);
|
||||
}
|
||||
|
|
|
@ -52,6 +52,7 @@ import agent.dbgmodel.jna.dbgmodel.DbgModelNative.ModelObjectKind;
|
|||
import agent.dbgmodel.jna.dbgmodel.DbgModelNative.TypeKind;
|
||||
import agent.dbgmodel.manager.DbgManager2Impl;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.target.TargetAccessConditioned;
|
||||
import ghidra.dbg.target.TargetAttacher;
|
||||
|
@ -142,11 +143,11 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAugmentedAttributes() {
|
||||
return requestAttributes(false);
|
||||
return requestAttributes(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
List<TargetObject> nlist = new ArrayList<>();
|
||||
List<String> rlist = new ArrayList<>();
|
||||
return requestNativeElements().thenCompose(list -> {
|
||||
|
@ -189,7 +190,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
Map<String, Object> nmap = new HashMap<>();
|
||||
List<String> rlist = new ArrayList<>();
|
||||
return requestNativeAttributes().thenCompose(map -> {
|
||||
|
@ -236,7 +237,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
if (proxy instanceof TargetStackFrame || //
|
||||
proxy instanceof TargetModule || //
|
||||
proxy instanceof TargetBreakpointSpec) {
|
||||
return delegate.requestAttributes(false);
|
||||
return delegate.requestAttributes(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
}
|
||||
return CompletableFuture.completedFuture(null);
|
||||
|
@ -328,7 +329,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
memory = new DbgModelTargetMemoryContainerImpl((DbgModelTargetProcess) proxy);
|
||||
}
|
||||
attrs.put(memory.getName(), memory);
|
||||
memory.requestElements(true);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
if (proxy instanceof TargetThread) {
|
||||
DbgModelTargetThread targetThread = (DbgModelTargetThread) proxy;
|
||||
|
@ -394,7 +395,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
if (elements.containsKey(trimKey)) {
|
||||
return CompletableFuture.completedFuture(elements.get(trimKey));
|
||||
}
|
||||
return requestElements(false).thenApply(__ -> getCachedElements().get(trimKey));
|
||||
return requestElements(RefreshBehavior.REFRESH_NEVER).thenApply(__ -> getCachedElements().get(trimKey));
|
||||
}
|
||||
}
|
||||
synchronized (attributes) {
|
||||
|
@ -412,7 +413,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
return obj;
|
||||
});
|
||||
}
|
||||
return requestAttributes(false).thenApply(__ -> getCachedAttribute(key));
|
||||
return requestAttributes(RefreshBehavior.REFRESH_NEVER).thenApply(__ -> getCachedAttribute(key));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -55,6 +55,7 @@ import agent.dbgmodel.dbgmodel.main.ModelObject;
|
|||
import agent.dbgmodel.manager.DbgManager2Impl;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.async.TypeSpec;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetEventScope;
|
||||
import ghidra.dbg.target.TargetExecutionStateful;
|
||||
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
|
||||
|
@ -227,7 +228,7 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
|
|||
stateful.changeAttributes(List.of(), Map.of( //
|
||||
TargetExecutionStateful.STATE_ATTRIBUTE_NAME, TargetExecutionState.ALIVE //
|
||||
), "Selected");
|
||||
stateful.fetchAttributes(true);
|
||||
stateful.fetchAttributes(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -263,7 +264,7 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
|
|||
stateful.changeAttributes(List.of(), Map.of( //
|
||||
TargetExecutionStateful.STATE_ATTRIBUTE_NAME, TargetExecutionState.ALIVE //
|
||||
), "Selected");
|
||||
stateful.fetchAttributes(true);
|
||||
stateful.fetchAttributes(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -283,7 +284,7 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
|
|||
DbgModelTargetProcess eventProcess = (DbgModelTargetProcess) p;
|
||||
DbgModel2TargetObjectImpl memory =
|
||||
(DbgModel2TargetObjectImpl) eventProcess.getCachedAttribute("Memory");
|
||||
memory.requestElements(false);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -304,7 +305,7 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
|
|||
DbgModelTargetProcess eventProcess = (DbgModelTargetProcess) p;
|
||||
DbgModel2TargetObjectImpl memory =
|
||||
(DbgModel2TargetObjectImpl) eventProcess.getCachedAttribute("Memory");
|
||||
memory.requestElements(false);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -642,7 +643,7 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
DbgManager2Impl manager2 = (DbgManager2Impl) getManager();
|
||||
List<String> pathX = PathUtils.extend(List.of("Debugger"), path);
|
||||
intrinsics.put(available.getName(), available);
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import agent.dbgeng.model.iface1.DbgModelTargetInterruptible;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetObject;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
|
||||
public class DbgModel2TargetSystemMarkerImpl extends DbgModel2TargetObjectImpl
|
||||
implements DbgModelTargetInterruptible {
|
||||
|
@ -32,7 +33,7 @@ public class DbgModel2TargetSystemMarkerImpl extends DbgModel2TargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
Map<String, Object> nmap = new HashMap<>();
|
||||
return addModelObjectAttributes(nmap);
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ import agent.dbgeng.model.iface1.*;
|
|||
import agent.dbgeng.model.iface2.*;
|
||||
import agent.dbgmodel.dbgmodel.main.ModelObject;
|
||||
import agent.dbgmodel.jna.dbgmodel.DbgModelNative.ModelObjectKind;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointAction;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
|
@ -320,13 +321,13 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
if (proxy instanceof DbgModelTargetSession || //
|
||||
proxy instanceof DbgModelTargetProcess || //
|
||||
proxy instanceof DbgModelTargetThread) {
|
||||
requestAttributes(false);
|
||||
requestAttributes(RefreshBehavior.REFRESH_NEVER);
|
||||
return;
|
||||
}
|
||||
if (proxy instanceof DbgModelTargetRegisterContainer || //
|
||||
proxy instanceof DbgModelTargetRegisterBank || //
|
||||
proxy.getName().equals("Stack") || proxy.getName().equals("Debug")) {
|
||||
requestAttributes(false);
|
||||
requestAttributes(RefreshBehavior.REFRESH_NEVER);
|
||||
return;
|
||||
}
|
||||
if (proxy instanceof DbgModelTargetProcessContainer || //
|
||||
|
@ -334,7 +335,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
proxy instanceof DbgModelTargetModuleContainer || //
|
||||
proxy instanceof DbgModelTargetBreakpointContainer || //
|
||||
proxy instanceof DbgModelTargetStack) {
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -439,20 +440,20 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
}
|
||||
if (proxy instanceof TargetRegisterContainer) {
|
||||
if (!getModel().isSuppressDescent()) {
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
requestAttributes(false);
|
||||
requestAttributes(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
if (proxy instanceof TargetRegisterBank) {
|
||||
TargetRegisterBank bank = (TargetRegisterBank) proxy;
|
||||
// requestElements(false);
|
||||
requestAttributes(false).thenAccept(__ -> {
|
||||
requestAttributes(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
|
||||
bank.readRegistersNamed(getCachedAttributes().keySet());
|
||||
});
|
||||
}
|
||||
if (proxy instanceof TargetStack) {
|
||||
requestAttributes(false);
|
||||
requestElements(false).thenAccept(__ -> {
|
||||
requestAttributes(RefreshBehavior.REFRESH_NEVER);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
|
||||
for (TargetObject obj : getCachedElements().values()) {
|
||||
if (obj instanceof TargetStackFrame) {
|
||||
DbgModelTargetObject frame = (DbgModelTargetObject) obj;
|
||||
|
@ -463,7 +464,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
});
|
||||
}
|
||||
if (proxy instanceof TargetStackFrame) {
|
||||
requestAttributes(false);
|
||||
requestAttributes(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||
import agent.frida.model.iface1.FridaModelTargetConfigurable;
|
||||
import agent.frida.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -55,7 +56,7 @@ public class FridaModelTargetAvailableDevicesContainerImpl extends FridaModelTar
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listAvailableDevices().thenAccept(list -> {
|
||||
List<TargetObject> available;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||
import agent.frida.model.iface1.FridaModelTargetConfigurable;
|
||||
import agent.frida.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -55,7 +56,7 @@ public class FridaModelTargetAvailableProcessesContainerImpl extends FridaModelT
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listAvailableProcesses().thenAccept(list -> {
|
||||
List<TargetObject> available;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import agent.frida.manager.FridaExport;
|
||||
import agent.frida.model.iface2.FridaModelTargetExportContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetElementType;
|
||||
|
@ -47,7 +48,7 @@ public class FridaModelTargetExportContainerImpl extends FridaModelTargetObjectI
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listModuleExports(module.getModule()).thenAccept(byName -> {
|
||||
List<TargetObject> symbols;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -18,6 +18,7 @@ package agent.frida.model.impl;
|
|||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import agent.frida.model.iface2.FridaModelTargetProcess;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
||||
|
@ -38,7 +39,7 @@ public class FridaModelTargetHeapMemoryContainerImpl extends FridaModelTargetMem
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listHeapMemory(process.getProcess());
|
||||
}
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import agent.frida.manager.FridaImport;
|
||||
import agent.frida.model.iface2.FridaModelTargetImportContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetElementType;
|
||||
|
@ -47,7 +48,7 @@ public class FridaModelTargetImportContainerImpl extends FridaModelTargetObjectI
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listModuleImports(module.getModule()).thenAccept(byName -> {
|
||||
List<TargetObject> symbols;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -27,6 +27,7 @@ import agent.frida.manager.impl.FridaManagerImpl;
|
|||
import agent.frida.model.iface2.FridaModelTargetMemoryContainer;
|
||||
import agent.frida.model.iface2.FridaModelTargetMemoryRegion;
|
||||
import agent.frida.model.methods.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerMemoryAccessException;
|
||||
import ghidra.dbg.error.DebuggerModelAccessException;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -74,12 +75,12 @@ public class FridaModelTargetKernelMemoryContainerImpl extends FridaModelTargetO
|
|||
), "Initialized");
|
||||
|
||||
getManager().addEventsListener(this);
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
if (refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
broadcast().invalidateCacheRequested(this);
|
||||
}
|
||||
return getManager().listKernelMemory();
|
||||
|
|
|
@ -23,6 +23,7 @@ import agent.frida.frida.FridaModuleInfo;
|
|||
import agent.frida.manager.*;
|
||||
import agent.frida.model.iface2.FridaModelTargetModule;
|
||||
import agent.frida.model.iface2.FridaModelTargetModuleContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -48,7 +49,7 @@ public class FridaModelTargetKernelModuleContainerImpl extends FridaModelTargetO
|
|||
this.kernel = kernel;
|
||||
|
||||
getManager().addEventsListener(this);
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -112,8 +113,8 @@ public class FridaModelTargetKernelModuleContainerImpl extends FridaModelTargetO
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
if (refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
broadcast().invalidateCacheRequested(this);
|
||||
}
|
||||
return getManager().listKernelModules();
|
||||
|
|
|
@ -26,6 +26,7 @@ import agent.frida.manager.cmd.FridaWriteMemoryCommand;
|
|||
import agent.frida.manager.impl.FridaManagerImpl;
|
||||
import agent.frida.model.iface2.*;
|
||||
import agent.frida.model.methods.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerMemoryAccessException;
|
||||
import ghidra.dbg.error.DebuggerModelAccessException;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -76,7 +77,7 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
|
|||
), "Initialized");
|
||||
|
||||
getManager().addEventsListener(this);
|
||||
requestElements(true);
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
|
||||
public FridaModelTargetMemoryContainerImpl(FridaModelTargetProcess process, String name) {
|
||||
|
@ -96,12 +97,12 @@ public class FridaModelTargetMemoryContainerImpl extends FridaModelTargetObjectI
|
|||
unload.getName(), unload //
|
||||
), "Initialized");
|
||||
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
if (refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
broadcast().invalidateCacheRequested(this);
|
||||
}
|
||||
return getManager().listMemory(process.getProcess());
|
||||
|
|
|
@ -23,6 +23,7 @@ import agent.frida.frida.FridaModuleInfo;
|
|||
import agent.frida.manager.*;
|
||||
import agent.frida.model.iface2.*;
|
||||
import agent.frida.model.methods.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -66,7 +67,7 @@ public class FridaModelTargetModuleContainerImpl extends FridaModelTargetObjectI
|
|||
), "Initialized");
|
||||
|
||||
getManager().addEventsListener(this);
|
||||
requestElements(true);
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -130,8 +131,8 @@ public class FridaModelTargetModuleContainerImpl extends FridaModelTargetObjectI
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
if (refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
broadcast().invalidateCacheRequested(this);
|
||||
}
|
||||
return getManager().listModules(session.getProcess());
|
||||
|
|
|
@ -25,6 +25,7 @@ import agent.frida.manager.FridaSection;
|
|||
import agent.frida.model.iface2.FridaModelTargetModule;
|
||||
import agent.frida.model.iface2.FridaModelTargetModuleSection;
|
||||
import agent.frida.model.iface2.FridaModelTargetModuleSectionContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetElementType;
|
||||
|
@ -47,11 +48,11 @@ public class FridaModelTargetModuleSectionContainerImpl extends FridaModelTarget
|
|||
public FridaModelTargetModuleSectionContainerImpl(FridaModelTargetModule module) {
|
||||
super(module.getModel(), module, "Sections", "ModuleSections");
|
||||
this.module = module;
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listModuleSections(module.getModule()).thenAccept(byStart -> {
|
||||
List<TargetObject> sections;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -25,6 +25,7 @@ import agent.frida.manager.*;
|
|||
import agent.frida.model.iface1.FridaModelTargetConfigurable;
|
||||
import agent.frida.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -99,7 +100,7 @@ public class FridaModelTargetProcessContainerImpl extends FridaModelTargetObject
|
|||
*/
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listProcesses(session.getSession()).thenAccept(byIID -> {
|
||||
List<TargetObject> processes;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -24,6 +24,7 @@ import java.util.stream.Collectors;
|
|||
import agent.frida.manager.*;
|
||||
import agent.frida.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerRegisterAccessException;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.TargetRegisterBank;
|
||||
|
@ -58,15 +59,15 @@ public class FridaModelTargetRegisterContainerImpl
|
|||
DISPLAY_ATTRIBUTE_NAME, getName(),
|
||||
DESCRIPTIONS_ATTRIBUTE_NAME, this), "Initialized");
|
||||
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
/**
|
||||
* Does both descriptions and then populates values
|
||||
*/
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
if (refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
broadcast().invalidateCacheRequested(this);
|
||||
}
|
||||
return getManager().listRegisters(thread.getThread()).thenAccept(registers -> {
|
||||
|
@ -100,7 +101,7 @@ public class FridaModelTargetRegisterContainerImpl
|
|||
|
||||
public void threadStateChangedSpecific(FridaState state, FridaReason reason) {
|
||||
if (state.equals(FridaState.FRIDA_THREAD_STOPPED)) {
|
||||
requestAttributes(false).thenAccept(__ -> {
|
||||
requestAttributes(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
|
||||
for (Object attribute : getCachedAttributes().values()) {
|
||||
if (attribute instanceof FridaModelTargetRegisterBank) {
|
||||
FridaModelTargetRegisterBank bank =
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.Map;
|
|||
import agent.frida.manager.FridaSession;
|
||||
import agent.frida.model.iface2.FridaModelTargetSession;
|
||||
import agent.frida.model.iface2.FridaModelTargetSessionAttributes;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(
|
||||
|
@ -51,7 +52,7 @@ public class FridaModelTargetSessionAttributesImpl extends FridaModelTargetObjec
|
|||
this.platformAttributes = new FridaModelTargetSessionAttributesPlatformImpl(this);
|
||||
this.environment = new FridaModelTargetSessionAttributesEnvironmentImpl(this);
|
||||
|
||||
requestAttributes(false);
|
||||
requestAttributes(RefreshBehavior.REFRESH_NEVER);
|
||||
|
||||
FridaSession s = (FridaSession) session.getModelObject();
|
||||
changeAttributes(List.of(), List.of( //
|
||||
|
|
|
@ -25,6 +25,7 @@ import agent.frida.manager.FridaSession;
|
|||
import agent.frida.model.iface2.FridaModelTargetRoot;
|
||||
import agent.frida.model.iface2.FridaModelTargetSession;
|
||||
import agent.frida.model.iface2.FridaModelTargetSessionContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetElementType;
|
||||
|
@ -77,7 +78,7 @@ public class FridaModelTargetSessionContainerImpl extends FridaModelTargetObject
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listSessions().thenAccept(byIID -> {
|
||||
List<TargetObject> sessions;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -27,6 +27,7 @@ import agent.frida.model.iface2.FridaModelTargetProcess;
|
|||
import agent.frida.model.iface2.FridaModelTargetStack;
|
||||
import agent.frida.model.iface2.FridaModelTargetStackFrame;
|
||||
import agent.frida.model.iface2.FridaModelTargetThread;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetElementType;
|
||||
|
@ -57,11 +58,11 @@ public class FridaModelTargetStackImpl extends FridaModelTargetObjectImpl
|
|||
public FridaModelTargetStackImpl(FridaModelTargetThread thread, FridaModelTargetProcess process) {
|
||||
super(thread.getModel(), thread, NAME, "Stack");
|
||||
this.thread = thread;
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listStackFrames(thread.getThread()).thenAccept(f -> {
|
||||
List<TargetObject> frames;
|
||||
synchronized (this) {
|
||||
|
@ -85,7 +86,7 @@ public class FridaModelTargetStackImpl extends FridaModelTargetObjectImpl
|
|||
|
||||
public void threadStateChangedSpecific(FridaState state, FridaReason reason) {
|
||||
if (state.equals(FridaState.FRIDA_THREAD_STOPPED)) {
|
||||
requestElements(true).thenAccept(__ -> {
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS).thenAccept(__ -> {
|
||||
for (TargetObject element : getCachedElements().values()) {
|
||||
if (element instanceof FridaModelTargetStackFrame) {
|
||||
FridaModelTargetStackFrameImpl frame =
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.util.stream.Collectors;
|
|||
import agent.frida.manager.FridaSymbol;
|
||||
import agent.frida.model.iface2.FridaModelTargetSymbolContainer;
|
||||
import agent.frida.model.methods.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetElementType;
|
||||
|
@ -61,7 +62,7 @@ public class FridaModelTargetSymbolContainerImpl extends FridaModelTargetObjectI
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listModuleSymbols(module.getModule()).thenAccept(byName -> {
|
||||
List<TargetObject> symbols;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -25,6 +25,7 @@ import agent.frida.model.iface1.FridaModelTargetConfigurable;
|
|||
import agent.frida.model.iface2.*;
|
||||
import agent.frida.model.methods.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -131,8 +132,8 @@ public class FridaModelTargetThreadContainerImpl extends FridaModelTargetObjectI
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
if (refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
broadcast().invalidateCacheRequested(this);
|
||||
}
|
||||
return getManager().listThreads(process);
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import agent.gdb.manager.GdbProcessThreadGroup;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
|
@ -51,7 +52,7 @@ public class GdbModelTargetAvailableContainer
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return impl.gdb.listAvailableProcesses().thenAccept(list -> {
|
||||
List<GdbModelTargetAttachable> available;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -27,6 +27,7 @@ import agent.gdb.manager.breakpoint.GdbBreakpointType;
|
|||
import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
|
||||
import ghidra.dbg.target.TargetBreakpointSpecContainer;
|
||||
|
@ -179,8 +180,8 @@ public class GdbModelTargetBreakpointContainer
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
if (!refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
return updateUsingBreakpoints(impl.gdb.getKnownBreakpoints());
|
||||
}
|
||||
return impl.gdb.listBreakpoints().thenCompose(this::updateUsingBreakpoints);
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import agent.gdb.manager.breakpoint.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec;
|
||||
import ghidra.dbg.target.TargetBreakpointSpecContainer.TargetBreakpointKindSet;
|
||||
|
@ -134,8 +135,8 @@ public class GdbModelTargetBreakpointSpec extends
|
|||
actions.remove(action);
|
||||
}
|
||||
|
||||
protected CompletableFuture<GdbBreakpointInfo> getInfo(boolean refresh) {
|
||||
if (!refresh) {
|
||||
protected CompletableFuture<GdbBreakpointInfo> getInfo(RefreshBehavior refresh) {
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
return CompletableFuture.completedFuture(impl.gdb.getKnownBreakpoints().get(number));
|
||||
}
|
||||
return impl.gdb.listBreakpoints()
|
||||
|
@ -143,7 +144,7 @@ public class GdbModelTargetBreakpointSpec extends
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getInfo(refresh).thenCompose(i -> {
|
||||
return updateInfo(info, i, "Refreshed");
|
||||
});
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.util.stream.Collectors;
|
|||
import agent.gdb.manager.*;
|
||||
import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
|
@ -136,8 +137,8 @@ public class GdbModelTargetInferiorContainer
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
if (!refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
updateUsingInferiors(impl.gdb.getKnownInferiors());
|
||||
return AsyncUtils.NIL;
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import agent.gdb.manager.GdbInferior;
|
||||
import agent.gdb.manager.GdbModule;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.target.TargetModule;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -83,7 +84,7 @@ public class GdbModelTargetModule extends
|
|||
}
|
||||
|
||||
public CompletableFuture<Void> init() {
|
||||
return sections.requestElements(true).exceptionally(ex -> {
|
||||
return sections.requestElements(RefreshBehavior.REFRESH_ALWAYS).exceptionally(ex -> {
|
||||
impl.reportError(this, "Could not initialize module sections and base", ex);
|
||||
return null;
|
||||
});
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
import agent.gdb.manager.GdbInferior;
|
||||
import agent.gdb.manager.GdbModule;
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.error.DebuggerUserException;
|
||||
import ghidra.dbg.target.*;
|
||||
|
@ -99,7 +100,7 @@ public class GdbModelTargetModuleContainer
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
// Ignore 'refresh' because inferior.getKnownModules may exclude executable
|
||||
return doRefresh();
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
|
|||
import generic.ULongSpan;
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.error.DebuggerMemoryAccessException;
|
||||
import ghidra.dbg.target.TargetMemory;
|
||||
|
@ -118,7 +119,7 @@ public class GdbModelTargetProcessMemory
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
// Can't use refresh getKnownMappings is only populated by listMappings
|
||||
return doRefresh();
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.util.stream.Collectors;
|
|||
import agent.gdb.manager.*;
|
||||
import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.target.TargetRegisterContainer;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
|
@ -53,8 +54,8 @@ public class GdbModelTargetRegisterContainer
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
if (!refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
return completeUsingThreads(inferior.getKnownThreads());
|
||||
}
|
||||
return doRefresh();
|
||||
|
@ -96,7 +97,7 @@ public class GdbModelTargetRegisterContainer
|
|||
}
|
||||
|
||||
public void stateChanged(GdbStateChangeRecord sco) {
|
||||
requestElements(false).thenAccept(__ -> {
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
|
||||
for (GdbModelTargetRegister modelRegister : registersByNumber.values()) {
|
||||
modelRegister.stateChanged(sco);
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
import java.util.stream.Collectors;
|
||||
|
||||
import agent.gdb.manager.GdbModuleSection;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.TargetSectionContainer;
|
||||
|
@ -60,7 +61,7 @@ public class GdbModelTargetSectionContainer
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
// getKnownSections is not guaranteed to be populated
|
||||
// listSections is cached by manager, so just use it always
|
||||
return module.module.listSections().thenAccept(this::updateUsingSections);
|
||||
|
|
|
@ -24,6 +24,7 @@ import agent.gdb.manager.GdbStackFrame;
|
|||
import agent.gdb.manager.GdbThread;
|
||||
import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.target.TargetStack;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
|
@ -53,7 +54,7 @@ public class GdbModelTargetStack extends
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return thread.listStackFrames().thenAccept(f -> {
|
||||
List<GdbModelTargetStackFrame> frames;
|
||||
synchronized (this) {
|
||||
|
@ -92,7 +93,7 @@ public class GdbModelTargetStack extends
|
|||
* target. Thus, every time we're STOPPED, this method should be called.
|
||||
*/
|
||||
public CompletableFuture<Void> stateChanged(GdbStateChangeRecord sco) {
|
||||
return requestElements(true).thenCompose(__ -> {
|
||||
return requestElements(RefreshBehavior.REFRESH_ALWAYS).thenCompose(__ -> {
|
||||
GdbModelTargetStackFrame innermost = framesByLevel.get(0);
|
||||
if (innermost != null) {
|
||||
return innermost.stateChanged(sco);
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.util.stream.Collectors;
|
|||
import agent.gdb.manager.GdbRegister;
|
||||
import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.error.DebuggerRegisterAccessException;
|
||||
import ghidra.dbg.target.TargetRegisterBank;
|
||||
|
@ -126,7 +127,7 @@ public class GdbModelTargetStackFrameRegisterContainer
|
|||
* Does both descriptions and then populates values
|
||||
*/
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
// NB. GDB manager caches these per thread
|
||||
return ensureRegisterDescriptions().thenCompose(regs -> {
|
||||
if (!regs.isEmpty()) {
|
||||
|
@ -180,12 +181,12 @@ public class GdbModelTargetStackFrameRegisterContainer
|
|||
}).thenCompose(__ -> {
|
||||
return updateRegisterValues(toWrite.keySet());
|
||||
}).thenCompose(__ -> {
|
||||
return frame.getParent().fetchElements(true);
|
||||
return frame.getParent().fetchElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
})).thenApply(__ -> null);
|
||||
}
|
||||
|
||||
public CompletableFuture<Void> stateChanged(GdbStateChangeRecord sco) {
|
||||
return requestElements(false).exceptionally(ex -> {
|
||||
return requestElements(RefreshBehavior.REFRESH_NEVER).exceptionally(ex -> {
|
||||
if (!valid) {
|
||||
Msg.info(this,
|
||||
"Ignoring error when refreshing now-invalid thread registers: " + ex);
|
||||
|
|
|
@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
import java.util.stream.Collectors;
|
||||
|
||||
import agent.gdb.manager.impl.GdbMinimalSymbol;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.TargetSymbolNamespace;
|
||||
|
@ -48,7 +49,7 @@ public class GdbModelTargetSymbolContainer
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return module.module.listMinimalSymbols().thenAccept(byName -> {
|
||||
List<GdbModelTargetSymbol> symbols;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -25,6 +25,7 @@ import agent.gdb.manager.impl.cmd.GdbStateChangeRecord;
|
|||
import agent.gdb.manager.reason.GdbBreakpointHitReason;
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
|
@ -90,8 +91,8 @@ public class GdbModelTargetThreadContainer
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
if (!refresh) {
|
||||
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
updateUsingThreads(inferior.getKnownThreads());
|
||||
return AsyncUtils.NIL;
|
||||
}
|
||||
|
@ -136,7 +137,7 @@ public class GdbModelTargetThreadContainer
|
|||
if (sco.getState() != GdbState.STOPPED) {
|
||||
return updateThreadStates(sco);
|
||||
}
|
||||
return requestElements(false).thenCompose(__ -> {
|
||||
return requestElements(RefreshBehavior.REFRESH_NEVER).thenCompose(__ -> {
|
||||
return updateThreadStates(sco);
|
||||
}).exceptionally(__ -> {
|
||||
Msg.error(this, "Could not update threads " + this + " on STOPPED");
|
||||
|
|
|
@ -23,6 +23,7 @@ import SWIG.SBTarget;
|
|||
import agent.lldb.lldb.DebugClient;
|
||||
import agent.lldb.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetBreakpointSpecContainer.TargetBreakpointKindSet;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
|
@ -126,10 +127,10 @@ public abstract class LldbModelTargetAbstractXpointSpec extends LldbModelTargetO
|
|||
actions.remove(action);
|
||||
}
|
||||
|
||||
protected CompletableFuture<Object> getInfo(boolean refresh) {
|
||||
protected CompletableFuture<Object> getInfo(RefreshBehavior refresh) {
|
||||
SBTarget session = getManager().getCurrentSession();
|
||||
String id = DebugClient.getId(getModelObject());
|
||||
if (!refresh) {
|
||||
if (!refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
return CompletableFuture
|
||||
.completedFuture(getManager().getKnownBreakpoints(session).get(id));
|
||||
}
|
||||
|
@ -138,7 +139,7 @@ public abstract class LldbModelTargetAbstractXpointSpec extends LldbModelTargetO
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getInfo(refresh).thenAccept(i -> {
|
||||
updateInfo(i, "Refreshed");
|
||||
});
|
||||
|
|
|
@ -23,17 +23,14 @@ import java.util.stream.Collectors;
|
|||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import agent.lldb.model.iface1.LldbModelTargetConfigurable;
|
||||
import agent.lldb.model.iface2.LldbModelTargetAvailable;
|
||||
import agent.lldb.model.iface2.LldbModelTargetAvailableContainer;
|
||||
import agent.lldb.model.iface2.LldbModelTargetRoot;
|
||||
import agent.lldb.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetElementType;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
||||
@TargetObjectSchemaInfo(
|
||||
|
@ -59,7 +56,7 @@ public class LldbModelTargetAvailableContainerImpl extends LldbModelTargetObject
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listAvailableProcesses().thenAccept(list -> {
|
||||
List<TargetObject> available;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -25,6 +25,7 @@ import SWIG.*;
|
|||
import agent.lldb.lldb.DebugClient;
|
||||
import agent.lldb.manager.LldbCause;
|
||||
import agent.lldb.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -137,7 +138,7 @@ public class LldbModelTargetBreakpointContainerImpl extends LldbModelTargetObjec
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listBreakpoints(getSession()).thenAccept(byNumber -> {
|
||||
List<TargetObject> specs;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.Map;
|
|||
import SWIG.SBBreakpointLocation;
|
||||
import SWIG.SBTarget;
|
||||
import agent.lldb.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
|
@ -44,7 +45,7 @@ public class LldbModelTargetBreakpointLocationContainerImpl extends LldbModelTar
|
|||
this.targetProcess = (LldbModelTargetProcessImpl) targetProcess;
|
||||
|
||||
getManager().addEventsListener(this);
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
public LldbModelTargetBreakpointLocation getTargetBreakpointLocation(SBBreakpointLocation loc) {
|
||||
|
|
|
@ -25,6 +25,7 @@ import agent.lldb.manager.cmd.LldbReadMemoryCommand;
|
|||
import agent.lldb.manager.cmd.LldbWriteMemoryCommand;
|
||||
import agent.lldb.manager.impl.LldbManagerImpl;
|
||||
import agent.lldb.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerMemoryAccessException;
|
||||
import ghidra.dbg.error.DebuggerModelAccessException;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -54,11 +55,11 @@ public class LldbModelTargetMemoryContainerImpl extends LldbModelTargetObjectImp
|
|||
public LldbModelTargetMemoryContainerImpl(LldbModelTargetProcess process) {
|
||||
super(process.getModel(), process, "Memory", "MemoryContainer");
|
||||
this.process = process;
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listMemory(process.getProcess()).thenAccept(byName -> {
|
||||
List<TargetObject> regions;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -22,6 +22,7 @@ import SWIG.*;
|
|||
import agent.lldb.lldb.DebugModuleInfo;
|
||||
import agent.lldb.model.iface2.LldbModelTargetModule;
|
||||
import agent.lldb.model.iface2.LldbModelTargetModuleContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -47,7 +48,7 @@ public class LldbModelTargetModuleContainerImpl extends LldbModelTargetObjectImp
|
|||
super(session.getModel(), session, "Modules", "ModuleContainer");
|
||||
this.targetSession = session;
|
||||
this.session = session.getSession();
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -103,7 +104,7 @@ public class LldbModelTargetModuleContainerImpl extends LldbModelTargetObjectImp
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listModules(session).thenAccept(byName -> {
|
||||
List<LldbModelTargetModule> result = new ArrayList<>();
|
||||
synchronized (this) {
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.util.stream.Collectors;
|
|||
import SWIG.SBModule;
|
||||
import SWIG.SBSection;
|
||||
import agent.lldb.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.program.model.address.Address;
|
||||
|
@ -43,11 +44,11 @@ public class LldbModelTargetModuleSectionContainerImpl extends LldbModelTargetOb
|
|||
public LldbModelTargetModuleSectionContainerImpl(LldbModelTargetModule module) {
|
||||
super(module.getModel(), module, "Sections", "ModuleSections");
|
||||
this.module = module;
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listModuleSections(module.getModule()).thenAccept(byStart -> {
|
||||
List<TargetObject> sections;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -28,12 +28,11 @@ import agent.lldb.manager.LldbReason;
|
|||
import agent.lldb.model.iface1.LldbModelTargetConfigurable;
|
||||
import agent.lldb.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetElementType;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(
|
||||
name = "ProcessContainer",
|
||||
|
@ -143,7 +142,7 @@ public class LldbModelTargetProcessContainerImpl extends LldbModelTargetObjectIm
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listProcesses(session.getSession()).thenAccept(byIID -> {
|
||||
List<TargetObject> processes;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -28,6 +28,7 @@ import agent.lldb.manager.impl.LldbManagerImpl;
|
|||
import agent.lldb.model.iface1.LldbModelTargetFocusScope;
|
||||
import agent.lldb.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.TargetEventScope.TargetEventType;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -151,10 +152,10 @@ public class LldbModelTargetProcessImpl extends LldbModelTargetObjectImpl
|
|||
TargetExecutionState targetState = DebugClient.convertState(state);
|
||||
setExecutionState(targetState, "ThreadStateChanged");
|
||||
if (state.equals(StateType.eStateStopped)) {
|
||||
threads.requestElements(true);
|
||||
threads.requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
StopReason stopReason = getManager().getCurrentThread().GetStopReason();
|
||||
if (!stopReason.equals(StopReason.eStopReasonPlanComplete)) {
|
||||
memory.requestElements(true);
|
||||
memory.requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,9 +23,8 @@ import SWIG.ByteOrder;
|
|||
import SWIG.SBTarget;
|
||||
import agent.lldb.model.iface2.LldbModelTargetSession;
|
||||
import agent.lldb.model.iface2.LldbModelTargetSessionAttributes;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetElementType;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(
|
||||
name = "SessionAttributes",
|
||||
|
@ -91,7 +90,7 @@ public class LldbModelTargetSessionAttributesImpl extends LldbModelTargetObjectI
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.util.stream.Collectors;
|
|||
import SWIG.SBTarget;
|
||||
import agent.lldb.manager.LldbCause;
|
||||
import agent.lldb.model.iface2.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
|
@ -73,7 +74,7 @@ public class LldbModelTargetSessionContainerImpl extends LldbModelTargetObjectIm
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listSessions().thenAccept(byIID -> {
|
||||
List<TargetObject> sessions;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -16,28 +16,21 @@
|
|||
package agent.lldb.model.impl;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import SWIG.SBStream;
|
||||
import SWIG.SBValue;
|
||||
import SWIG.StateType;
|
||||
import SWIG.*;
|
||||
import agent.lldb.manager.LldbReason;
|
||||
import agent.lldb.model.iface2.LldbModelTargetRegister;
|
||||
import agent.lldb.model.iface2.LldbModelTargetStackFrameRegisterBank;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerRegisterAccessException;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetElementType;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.util.Msg;
|
||||
|
||||
@TargetObjectSchemaInfo(
|
||||
name = "RegisterValueBank",
|
||||
|
@ -69,7 +62,7 @@ public class LldbModelTargetStackFrameRegisterBankImpl
|
|||
DISPLAY_ATTRIBUTE_NAME, getName(),
|
||||
DESCRIPTIONS_ATTRIBUTE_NAME, container), "Initialized");
|
||||
|
||||
requestElements(true);
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -84,7 +77,7 @@ public class LldbModelTargetStackFrameRegisterBankImpl
|
|||
* Does both descriptions and then populates values
|
||||
*/
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
SBValue bank = (SBValue) getModelObject();
|
||||
return getManager().listStackFrameRegisters(bank).thenAccept(regs -> {
|
||||
if (regs.isEmpty()) {
|
||||
|
@ -118,7 +111,7 @@ public class LldbModelTargetStackFrameRegisterBankImpl
|
|||
@Override
|
||||
public void threadStateChangedSpecific(StateType state, LldbReason reason) {
|
||||
if (state.equals(StateType.eStateStopped)) {
|
||||
requestElements(false).thenAccept(__ -> {
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
|
||||
readRegistersNamed(getCachedElements().keySet());
|
||||
});
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ import agent.lldb.model.iface2.LldbModelTargetObject;
|
|||
import agent.lldb.model.iface2.LldbModelTargetRegisterBank;
|
||||
import agent.lldb.model.iface2.LldbModelTargetStackFrameRegisterBank;
|
||||
import agent.lldb.model.iface2.LldbModelTargetStackFrameRegisterContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -57,14 +58,14 @@ public class LldbModelTargetStackFrameRegisterContainerImpl
|
|||
public LldbModelTargetStackFrameRegisterContainerImpl(LldbModelTargetStackFrameImpl frame) {
|
||||
super(frame.getModel(), frame, NAME, "StackFrameRegisterContainer");
|
||||
this.frame = frame;
|
||||
requestAttributes(true);
|
||||
requestAttributes(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Does both descriptions and then populates values
|
||||
*/
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
return getManager().listStackFrameRegisterBanks(frame.getFrame()).thenAccept(banks -> {
|
||||
if (banks.isEmpty()) {
|
||||
return;
|
||||
|
@ -93,7 +94,7 @@ public class LldbModelTargetStackFrameRegisterContainerImpl
|
|||
|
||||
public void threadStateChangedSpecific(StateType state, LldbReason reason) {
|
||||
if (state.equals(StateType.eStateStopped)) {
|
||||
requestAttributes(false).thenAccept(__ -> {
|
||||
requestAttributes(RefreshBehavior.REFRESH_NEVER).thenAccept(__ -> {
|
||||
for (Object attribute : getCachedAttributes().values()) {
|
||||
if (attribute instanceof LldbModelTargetRegisterBank) {
|
||||
LldbModelTargetRegisterBank bank = (LldbModelTargetRegisterBank) attribute;
|
||||
|
|
|
@ -24,7 +24,7 @@ import SWIG.SBFrame;
|
|||
import SWIG.StateType;
|
||||
import agent.lldb.manager.LldbReason;
|
||||
import agent.lldb.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -53,11 +53,11 @@ public class LldbModelTargetStackImpl extends LldbModelTargetObjectImpl
|
|||
public LldbModelTargetStackImpl(LldbModelTargetThread thread, LldbModelTargetProcess process) {
|
||||
super(thread.getModel(), thread, NAME, "Stack");
|
||||
this.thread = thread;
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listStackFrames(thread.getThread()).thenAccept(f -> {
|
||||
if (f.isEmpty()) {
|
||||
return;
|
||||
|
@ -84,7 +84,7 @@ public class LldbModelTargetStackImpl extends LldbModelTargetObjectImpl
|
|||
|
||||
public void threadStateChangedSpecific(StateType state, LldbReason reason) {
|
||||
if (state.equals(StateType.eStateStopped)) {
|
||||
requestElements(true).thenAccept(__ -> {
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS).thenAccept(__ -> {
|
||||
for (TargetObject element : getCachedElements().values()) {
|
||||
if (element instanceof LldbModelTargetStackFrame) {
|
||||
LldbModelTargetStackFrameImpl frame =
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import SWIG.SBSymbol;
|
||||
import agent.lldb.model.iface2.LldbModelTargetSymbolContainer;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -45,7 +46,7 @@ public class LldbModelTargetSymbolContainerImpl extends LldbModelTargetObjectImp
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listModuleSymbols(module.getModule()).thenAccept(byName -> {
|
||||
List<TargetObject> symbols;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -27,6 +27,7 @@ import agent.lldb.manager.LldbReason;
|
|||
import agent.lldb.model.iface1.LldbModelTargetConfigurable;
|
||||
import agent.lldb.model.iface2.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
import ghidra.dbg.target.TargetConfigurable;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -55,7 +56,7 @@ public class LldbModelTargetThreadContainerImpl extends LldbModelTargetObjectImp
|
|||
this.changeAttributes(List.of(), Map.of(BASE_ATTRIBUTE_NAME, 16), "Initialized");
|
||||
|
||||
getManager().addEventsListener(this);
|
||||
requestElements(false);
|
||||
requestElements(RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -130,7 +131,7 @@ public class LldbModelTargetThreadContainerImpl extends LldbModelTargetObjectImp
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getManager().listThreads(process).thenAccept(byTID -> {
|
||||
List<TargetObject> threads;
|
||||
synchronized (this) {
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.lang.reflect.Method;
|
|||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.gadp.GadpRegistry;
|
||||
import ghidra.dbg.gadp.client.annot.GadpEventHandler;
|
||||
|
@ -185,22 +186,22 @@ public class DelegateGadpClientTargetObject
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> resync(boolean attributes, boolean elements) {
|
||||
public CompletableFuture<Void> resync(RefreshBehavior attributes, RefreshBehavior elements) {
|
||||
return client.sendChecked(Gadp.ResyncRequest.newBuilder()
|
||||
.setPath(GadpValueUtils.makePath(path))
|
||||
.setAttributes(attributes)
|
||||
.setElements(elements),
|
||||
.setAttributes(attributes.equals(RefreshBehavior.REFRESH_ALWAYS))
|
||||
.setElements(elements.equals(RefreshBehavior.REFRESH_ALWAYS)),
|
||||
Gadp.ResyncReply.getDefaultInstance()).thenApply(rep -> null);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
return resync(refresh, false);
|
||||
protected CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
return resync(refresh, RefreshBehavior.REFRESH_NEVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
return resync(false, refresh);
|
||||
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return resync(RefreshBehavior.REFRESH_NEVER, refresh);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -27,6 +27,7 @@ import ghidra.async.TypeSpec;
|
|||
import ghidra.comm.service.AbstractAsyncClientHandler;
|
||||
import ghidra.dbg.DebuggerModelListener;
|
||||
import ghidra.dbg.DebuggerObjectModel;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.*;
|
||||
import ghidra.dbg.gadp.GadpVersion;
|
||||
import ghidra.dbg.gadp.client.GadpValueUtils;
|
||||
|
@ -509,7 +510,11 @@ public class GadpClientHandler
|
|||
List<String> path = req.getPath().getEList();
|
||||
return model.fetchModelObject(path).thenCompose(obj -> {
|
||||
DebuggerObjectModel.requireNonNull(obj, path);
|
||||
return obj.resync(req.getAttributes(), req.getElements());
|
||||
RefreshBehavior reqAttributes = req.getAttributes() ?
|
||||
RefreshBehavior.REFRESH_ALWAYS : RefreshBehavior.REFRESH_NEVER;
|
||||
RefreshBehavior reqElements = req.getElements() ?
|
||||
RefreshBehavior.REFRESH_ALWAYS : RefreshBehavior.REFRESH_NEVER;
|
||||
return obj.resync(reqAttributes, reqElements);
|
||||
}).thenCompose(__ -> {
|
||||
return model.flushEvents();
|
||||
}).thenCompose(__ -> {
|
||||
|
|
|
@ -38,6 +38,7 @@ import generic.ID;
|
|||
import generic.Unique;
|
||||
import ghidra.async.*;
|
||||
import ghidra.dbg.*;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.*;
|
||||
import ghidra.dbg.attributes.TargetStringList;
|
||||
import ghidra.dbg.error.DebuggerIllegalArgumentException;
|
||||
|
@ -337,8 +338,8 @@ public class GadpClientServerTest implements AsyncTestUtils {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
if (refresh) {
|
||||
protected CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
if (refresh.equals(RefreshBehavior.REFRESH_ALWAYS)) {
|
||||
List<String> toRemove = new ArrayList<>();
|
||||
for (String name : attributes.keySet()) {
|
||||
if (PathUtils.isInvocation(name)) {
|
||||
|
@ -513,7 +514,7 @@ public class GadpClientServerTest implements AsyncTestUtils {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
setElements(List.of(new TestGadpTargetAvailable(this, 1, "echo"),
|
||||
new TestGadpTargetAvailable(this, 2, "dd")), Map.of(), "Refreshed");
|
||||
return super.requestElements(refresh);
|
||||
|
@ -839,7 +840,7 @@ public class GadpClientServerTest implements AsyncTestUtils {
|
|||
assertEquals(0, invocations.count.get().intValue());
|
||||
|
||||
// Flush the cache
|
||||
waitOn(avail.fetchAttributes(true));
|
||||
waitOn(avail.fetchAttributes(RefreshBehavior.REFRESH_ALWAYS));
|
||||
CompletableFuture<?> future2 = avail.fetchAttribute("greet(World)");
|
||||
waitOn(invocations.count.waitValue(1));
|
||||
TestMethodInvocation invocation2 = invocations.poll();
|
||||
|
|
|
@ -21,12 +21,13 @@ import java.util.stream.Collectors;
|
|||
|
||||
import com.sun.jdi.Location;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.manager.JdiCause;
|
||||
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
||||
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.TargetBreakpointSpecContainer;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
|
||||
import ghidra.dbg.target.TargetBreakpointSpecContainer;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.program.model.address.AddressRange;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
@ -142,7 +143,7 @@ public class JdiModelTargetBreakpointContainer extends JdiModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ package ghidra.dbg.jdi.model;
|
|||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
|
||||
import ghidra.dbg.jdi.model.iface1.JdiModelTargetDeletable;
|
||||
import ghidra.dbg.target.TargetBreakpointLocation;
|
||||
|
@ -104,7 +105,7 @@ public class JdiModelTargetBreakpointSpec extends JdiModelTargetObjectImpl
|
|||
actions.remove(action);
|
||||
}
|
||||
|
||||
protected CompletableFuture<JdiBreakpointInfo> getInfo(boolean refresh) {
|
||||
protected CompletableFuture<JdiBreakpointInfo> getInfo(RefreshBehavior refresh) {
|
||||
return CompletableFuture.completedFuture(info);
|
||||
}
|
||||
|
||||
|
@ -126,7 +127,7 @@ public class JdiModelTargetBreakpointSpec extends JdiModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return getInfo(refresh).thenCompose(i -> {
|
||||
return updateInfo(info, i, "Refreshed");
|
||||
});
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
import com.sun.jdi.ReferenceType;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.Msg;
|
||||
|
||||
|
@ -45,7 +46,7 @@ public class JdiModelTargetClassContainer extends JdiModelTargetObjectImpl {
|
|||
super(vm, "Classes");
|
||||
this.vm = vm;
|
||||
|
||||
requestElements(true);
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
|
||||
protected CompletableFuture<Void> updateUsingClasses(Map<String, ReferenceType> byName) {
|
||||
|
@ -64,7 +65,7 @@ public class JdiModelTargetClassContainer extends JdiModelTargetObjectImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
// Ignore 'refresh' because inferior.getKnownModules may exclude executable
|
||||
return doRefresh();
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ import com.sun.jdi.VirtualMachineManager;
|
|||
import com.sun.jdi.connect.Connector;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.Msg;
|
||||
|
||||
|
@ -64,7 +65,7 @@ public class JdiModelTargetConnectorContainer extends JdiModelTargetObjectImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
// Ignore 'refresh' because inferior.getKnownModules may exclude executable
|
||||
return doRefresh();
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetMemoryRegion;
|
||||
import ghidra.dbg.target.TargetSection;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -59,7 +60,7 @@ public class JdiModelTargetConstantPool extends JdiModelTargetObjectImpl impleme
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
this.range = impl.getAddressRange(getClassType(), pool.length);
|
||||
if (range != null) {
|
||||
|
|
|
@ -22,6 +22,7 @@ import com.sun.jdi.ClassNotLoadedException;
|
|||
import com.sun.jdi.Field;
|
||||
import com.sun.jdi.request.*;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -78,7 +79,7 @@ public class JdiModelTargetField extends JdiModelTargetObjectImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
this.declaringType = (JdiModelTargetReferenceType) getInstance(field.declaringType());
|
||||
|
||||
populateAttributes();
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
import com.sun.jdi.Field;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
||||
|
@ -66,7 +67,7 @@ public class JdiModelTargetFieldContainer extends JdiModelTargetObjectImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
Map<String, Field> map = new HashMap<>();
|
||||
List<Field> fields = useAll ? reftype.reftype.allFields() : reftype.reftype.fields();
|
||||
for (Field f : fields) {
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
import com.sun.jdi.ClassNotLoadedException;
|
||||
import com.sun.jdi.LocalVariable;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(
|
||||
|
@ -63,7 +64,7 @@ public class JdiModelTargetLocalVariable extends JdiModelTargetObjectImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
populateAttributes();
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
import com.sun.jdi.LocalVariable;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
|
@ -63,7 +64,7 @@ public class JdiModelTargetLocalVariableContainer extends JdiModelTargetObjectIm
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
Map<String, LocalVariable> map = new HashMap<>();
|
||||
try {
|
||||
for (LocalVariable var : vars) {
|
||||
|
|
|
@ -24,6 +24,7 @@ import com.sun.jdi.Location;
|
|||
import com.sun.jdi.request.BreakpointRequest;
|
||||
import com.sun.jdi.request.EventRequestManager;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -72,7 +73,7 @@ public class JdiModelTargetLocation extends JdiModelTargetObjectImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
this.declaringType = (JdiModelTargetReferenceType) getInstance(location.declaringType());
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
import com.sun.jdi.Location;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
|
@ -63,7 +64,7 @@ public class JdiModelTargetLocationContainer extends JdiModelTargetObjectImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
Map<String, Location> map = new HashMap<>();
|
||||
if (locations != null) {
|
||||
for (Location loc : locations) {
|
||||
|
|
|
@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
|
@ -84,7 +85,7 @@ public class JdiModelTargetMethod extends JdiModelTargetObjectImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
populateAttributes();
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
import com.sun.jdi.Method;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
||||
|
@ -64,7 +65,7 @@ public class JdiModelTargetMethodContainer extends JdiModelTargetObjectImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
Map<String, Method> map = new HashMap<>();
|
||||
List<Method> methods = useAll ? reftype.reftype.allMethods() : reftype.reftype.methods();
|
||||
for (Method var : methods) {
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
import com.sun.jdi.ModuleReference;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.error.DebuggerUserException;
|
||||
import ghidra.dbg.target.TargetModule;
|
||||
import ghidra.dbg.target.TargetModuleContainer;
|
||||
|
@ -100,7 +101,7 @@ public class JdiModelTargetModuleContainer extends JdiModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return doRefresh();
|
||||
}
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
import com.sun.jdi.Mirror;
|
||||
import com.sun.jdi.ThreadReference;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.agent.DefaultTargetObject;
|
||||
import ghidra.dbg.jdi.manager.JdiCause;
|
||||
import ghidra.dbg.jdi.manager.JdiStateListener;
|
||||
|
@ -158,8 +159,8 @@ public class JdiModelTargetObjectImpl extends
|
|||
Map<String, ?> existingAttributes = getCachedAttributes();
|
||||
Boolean autoupdate = (Boolean) existingAttributes.get("autoupdate");
|
||||
if (autoupdate != null && autoupdate) {
|
||||
requestAttributes(true);
|
||||
requestElements(true);
|
||||
requestAttributes(RefreshBehavior.REFRESH_ALWAYS);
|
||||
requestElements(RefreshBehavior.REFRESH_ALWAYS);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
|
@ -60,7 +61,7 @@ public class JdiModelTargetObjectReference extends JdiModelTargetValue {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
this.referenceType = (JdiModelTargetReferenceType) getInstance(objref.referenceType());
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
import com.sun.jdi.ObjectReference;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -66,7 +67,7 @@ public class JdiModelTargetObjectReferenceContainer extends JdiModelTargetObject
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
Map<String, ObjectReference> map = new HashMap<>();
|
||||
for (ObjectReference ref : refs) {
|
||||
map.put(ref.toString(), ref);
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
import com.sun.jdi.*;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.TargetModule;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -113,7 +114,7 @@ public class JdiModelTargetReferenceType extends JdiModelTargetType implements T
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
this.allFields = new JdiModelTargetFieldContainer(this, true);
|
||||
this.allMethods = new JdiModelTargetMethodContainer(this, true);
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import com.sun.jdi.Location;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.TargetRegister;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -55,7 +56,7 @@ public class JdiModelTargetRegister extends JdiModelTargetObjectImpl implements
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
changeAttributes(List.of(), List.of(), Map.of( //
|
||||
DISPLAY_ATTRIBUTE_NAME, getDisplay() //
|
||||
|
|
|
@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import com.sun.jdi.Location;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetRegisterBank;
|
||||
import ghidra.dbg.target.TargetRegisterContainer;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -136,7 +137,7 @@ public class JdiModelTargetRegisterContainer extends JdiModelTargetObjectImpl
|
|||
}
|
||||
|
||||
protected CompletableFuture<?> update() {
|
||||
return fetchElements(true).exceptionally(e -> {
|
||||
return fetchElements(RefreshBehavior.REFRESH_ALWAYS).exceptionally(e -> {
|
||||
Msg.error(this, "Could not update registers " + this + " on STOPPED");
|
||||
return null;
|
||||
});
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import com.sun.jdi.Method;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetMemoryRegion;
|
||||
import ghidra.dbg.target.TargetSection;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -70,7 +71,7 @@ public class JdiModelTargetSection extends JdiModelTargetObjectImpl implements /
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
this.range = method == null ? impl.defaultRange : impl.getAddressRange(method);
|
||||
if (range != null) {
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
import com.sun.jdi.Method;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetMemory;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.program.model.address.Address;
|
||||
|
@ -56,7 +57,7 @@ public class JdiModelTargetSectionContainer extends JdiModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
protected CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
constantPool = new JdiModelTargetConstantPool(this, reftype.reftype.constantPool(), false);
|
||||
changeAttributes(List.of(), List.of( //
|
||||
|
@ -67,7 +68,7 @@ public class JdiModelTargetSectionContainer extends JdiModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
updateUsingSections(reftype.reftype.methods());
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.target.TargetStack;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.Msg;
|
||||
|
@ -49,7 +50,7 @@ public class JdiModelTargetStack extends JdiModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
List<JdiModelTargetStackFrame> targetFrames = new ArrayList<>();
|
||||
List<StackFrame> frames;
|
||||
try {
|
||||
|
@ -103,7 +104,7 @@ public class JdiModelTargetStack extends JdiModelTargetObjectImpl
|
|||
* @return null
|
||||
*/
|
||||
protected CompletableFuture<?> update() {
|
||||
return fetchElements(true).exceptionally(e -> {
|
||||
return fetchElements(RefreshBehavior.REFRESH_ALWAYS).exceptionally(e -> {
|
||||
Msg.error(this, "Could not update stack " + this + " on STOPPED");
|
||||
return null;
|
||||
});
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.manager.JdiCause;
|
||||
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
||||
import ghidra.dbg.jdi.model.iface1.JdiModelSelectableObject;
|
||||
|
@ -75,7 +76,7 @@ public class JdiModelTargetStackFrame extends JdiModelTargetObjectImpl implement
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
//this.arguments = new JdiModelTargetValueContainer(this, "Arguments", frame.getArgumentValues());
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ import com.sun.jdi.request.EventRequestManager;
|
|||
import com.sun.jdi.request.StepRequest;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.manager.*;
|
||||
import ghidra.dbg.jdi.model.iface1.*;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
|
@ -124,7 +125,7 @@ public class JdiModelTargetThread extends JdiModelTargetObjectReference implemen
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
populateAttributes();
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.util.stream.Collectors;
|
|||
import com.sun.jdi.ThreadReference;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.manager.*;
|
||||
import ghidra.dbg.jdi.model.iface1.JdiModelTargetEventScope;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
|
@ -118,7 +119,7 @@ public class JdiModelTargetThreadContainer extends JdiModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
return updateUsingThreads(threads);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import com.sun.jdi.ThreadGroupReference;
|
||||
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
@ -61,7 +62,7 @@ public class JdiModelTargetThreadGroupContainer extends JdiModelTargetObjectImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
protected CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
List<ThreadGroupReference> groups;
|
||||
if (parent instanceof JdiModelTargetVM) {
|
||||
JdiModelTargetVM vm = (JdiModelTargetVM) parent;
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||
import com.sun.jdi.Type;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||
|
@ -64,7 +65,7 @@ public class JdiModelTargetTypeContainer extends JdiModelTargetObjectImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestElements(boolean refresh) {
|
||||
public CompletableFuture<Void> requestElements(RefreshBehavior refresh) {
|
||||
Map<String, Type> map = new HashMap<>();
|
||||
try {
|
||||
for (Type type : types) {
|
||||
|
|
|
@ -27,6 +27,7 @@ import com.sun.jdi.event.*;
|
|||
import com.sun.jdi.request.*;
|
||||
|
||||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.DebuggerObjectModel.RefreshBehavior;
|
||||
import ghidra.dbg.jdi.manager.*;
|
||||
import ghidra.dbg.jdi.manager.impl.JdiManagerImpl;
|
||||
import ghidra.dbg.jdi.model.iface1.*;
|
||||
|
@ -191,7 +192,7 @@ public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements //
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
public CompletableFuture<Void> requestAttributes(RefreshBehavior refresh) {
|
||||
|
||||
this.threadGroups = new JdiModelTargetThreadGroupContainer(this);
|
||||
this.modules = new JdiModelTargetModuleContainer(this);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user