mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-22 10:02:49 +08:00
Merge remote-tracking branch 'origin/GP-3162_d-millar_refresh_to_enum'
This commit is contained in:
+2
-1
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
+2
-1
@@ -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) {
|
||||
|
||||
+2
-1
@@ -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;
|
||||
|
||||
+2
-1
@@ -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);
|
||||
|
||||
+4
-3
@@ -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;
|
||||
}
|
||||
|
||||
+4
-3
@@ -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;
|
||||
}
|
||||
|
||||
+4
-3
@@ -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;
|
||||
}
|
||||
|
||||
+3
-2
@@ -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) {
|
||||
|
||||
+2
-1
@@ -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 -> {
|
||||
|
||||
+5
-4
@@ -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) {
|
||||
|
||||
+3
-2
@@ -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);
|
||||
}
|
||||
|
||||
+5
-4
@@ -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<>();
|
||||
|
||||
+2
-1
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -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();
|
||||
|
||||
+3
-2
@@ -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;
|
||||
});
|
||||
|
||||
+2
-1
@@ -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) {
|
||||
|
||||
+3
-2
@@ -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) {
|
||||
|
||||
+3
-2
@@ -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);
|
||||
}
|
||||
|
||||
+8
-7
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+6
-5
@@ -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);
|
||||
|
||||
+2
-1
@@ -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);
|
||||
}
|
||||
|
||||
+10
-9
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -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) {
|
||||
|
||||
+2
-1
@@ -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) {
|
||||
|
||||
+2
-1
@@ -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) {
|
||||
|
||||
+2
-1
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -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) {
|
||||
|
||||
+4
-3
@@ -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();
|
||||
|
||||
+4
-3
@@ -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();
|
||||
|
||||
+5
-4
@@ -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());
|
||||
|
||||
+4
-3
@@ -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());
|
||||
|
||||
+3
-2
@@ -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) {
|
||||
|
||||
+2
-1
@@ -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) {
|
||||
|
||||
+5
-4
@@ -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 =
|
||||
|
||||
+2
-1
@@ -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( //
|
||||
|
||||
+2
-1
@@ -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) {
|
||||
|
||||
+4
-3
@@ -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 =
|
||||
|
||||
+2
-1
@@ -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) {
|
||||
|
||||
+3
-2
@@ -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);
|
||||
|
||||
+2
-1
@@ -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) {
|
||||
|
||||
+3
-2
@@ -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);
|
||||
|
||||
+4
-3
@@ -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");
|
||||
});
|
||||
|
||||
+3
-2
@@ -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;
|
||||
}
|
||||
|
||||
+2
-1
@@ -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;
|
||||
});
|
||||
|
||||
+2
-1
@@ -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();
|
||||
}
|
||||
|
||||
+2
-1
@@ -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();
|
||||
}
|
||||
|
||||
+4
-3
@@ -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);
|
||||
}
|
||||
|
||||
+2
-1
@@ -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);
|
||||
|
||||
+3
-2
@@ -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);
|
||||
|
||||
+4
-3
@@ -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);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user