mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 19:42:36 +02:00
GP-3162: refresh bool->enum
This commit is contained in:
parent
a9baf9f6d8
commit
15c4345d71
116 changed files with 376 additions and 266 deletions
|
@ -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");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue