mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
GP-3666: Remove duplicative MODULE_[UN]LOADED events. Fix NPEs in GDB
connector.
This commit is contained in:
parent
4fbb7bf45a
commit
ccf18d75a7
12 changed files with 9 additions and 110 deletions
|
@ -75,11 +75,7 @@ public class DbgModelTargetModuleContainerImpl extends DbgModelTargetObjectImpl
|
||||||
//modulesByName.remove(name);
|
//modulesByName.remove(name);
|
||||||
module = getTargetModule(name);
|
module = getTargetModule(name);
|
||||||
}
|
}
|
||||||
TargetThread eventThread =
|
|
||||||
(TargetThread) getModel().getModelObject(getManager().getEventThread());
|
|
||||||
changeElements(List.of(), List.of(module), Map.of(), "Loaded");
|
changeElements(List.of(), List.of(module), Map.of(), "Loaded");
|
||||||
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_LOADED,
|
|
||||||
"Library " + name + " loaded", List.of(module));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -87,10 +83,6 @@ public class DbgModelTargetModuleContainerImpl extends DbgModelTargetObjectImpl
|
||||||
public void libraryUnloaded(String name) {
|
public void libraryUnloaded(String name) {
|
||||||
DbgModelTargetModule targetModule = getTargetModule(name);
|
DbgModelTargetModule targetModule = getTargetModule(name);
|
||||||
if (targetModule != null) {
|
if (targetModule != null) {
|
||||||
TargetThread eventThread =
|
|
||||||
(TargetThread) getModel().getModelObject(getManager().getEventThread());
|
|
||||||
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_UNLOADED,
|
|
||||||
"Library " + name + " unloaded", List.of(targetModule));
|
|
||||||
DbgModelImpl impl = (DbgModelImpl) model;
|
DbgModelImpl impl = (DbgModelImpl) model;
|
||||||
impl.deleteModelObject(targetModule.getDbgModule());
|
impl.deleteModelObject(targetModule.getDbgModule());
|
||||||
}
|
}
|
||||||
|
|
|
@ -181,9 +181,8 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
|
||||||
|
|
||||||
public void objectSelected(Object object) {
|
public void objectSelected(Object object) {
|
||||||
List<String> objPath = findObject(object);
|
List<String> objPath = findObject(object);
|
||||||
model.fetchModelObject(objPath, RefreshBehavior.REFRESH_WHEN_ABSENT).thenAccept(obj ->
|
model.fetchModelObject(objPath, RefreshBehavior.REFRESH_WHEN_ABSENT)
|
||||||
update(obj)
|
.thenAccept(obj -> update(obj));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -241,11 +240,6 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
|
||||||
if (mod == null) {
|
if (mod == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
getObject(getManager().getEventThread()).thenAccept(t -> {
|
|
||||||
TargetThread eventThread = (TargetThread) t;
|
|
||||||
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_LOADED,
|
|
||||||
"Library " + info.getModuleName() + " loaded", List.of(mod));
|
|
||||||
});
|
|
||||||
getObject(getManager().getEventProcess()).thenAccept(p -> {
|
getObject(getManager().getEventProcess()).thenAccept(p -> {
|
||||||
DbgModelTargetProcess eventProcess = (DbgModelTargetProcess) p;
|
DbgModelTargetProcess eventProcess = (DbgModelTargetProcess) p;
|
||||||
DbgModel2TargetObjectImpl memory =
|
DbgModel2TargetObjectImpl memory =
|
||||||
|
@ -262,11 +256,6 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
|
||||||
if (mod == null) {
|
if (mod == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
getObject(getManager().getEventThread()).thenAccept(t -> {
|
|
||||||
TargetThread eventThread = (TargetThread) t;
|
|
||||||
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_UNLOADED,
|
|
||||||
"Library " + info.getModuleName() + " unloaded", List.of(mod));
|
|
||||||
});
|
|
||||||
getObject(getManager().getEventProcess()).thenAccept(p -> {
|
getObject(getManager().getEventProcess()).thenAccept(p -> {
|
||||||
DbgModelTargetProcess eventProcess = (DbgModelTargetProcess) p;
|
DbgModelTargetProcess eventProcess = (DbgModelTargetProcess) p;
|
||||||
DbgModel2TargetObjectImpl memory =
|
DbgModel2TargetObjectImpl memory =
|
||||||
|
|
|
@ -69,12 +69,7 @@ public class FridaModelTargetKernelModuleContainerImpl extends FridaModelTargetO
|
||||||
Msg.error(this, "Module " + info.getModuleName(index) + " not found!");
|
Msg.error(this, "Module " + info.getModuleName(index) + " not found!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
FridaThread thread = getManager().getCurrentThread();
|
|
||||||
TargetThread eventThread =
|
|
||||||
(TargetThread) getModel().getModelObject(thread);
|
|
||||||
changeElements(List.of(), List.of(targetModule), Map.of(), "Loaded");
|
changeElements(List.of(), List.of(targetModule), Map.of(), "Loaded");
|
||||||
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_LOADED,
|
|
||||||
"Library " + info.getModuleName(index) + " loaded", List.of(targetModule));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -91,11 +86,6 @@ public class FridaModelTargetKernelModuleContainerImpl extends FridaModelTargetO
|
||||||
FridaCause cause) {
|
FridaCause cause) {
|
||||||
FridaModelTargetModule targetModule = getTargetModule(info.getModule(index));
|
FridaModelTargetModule targetModule = getTargetModule(info.getModule(index));
|
||||||
if (targetModule != null) {
|
if (targetModule != null) {
|
||||||
FridaThread thread = getManager().getCurrentThread();
|
|
||||||
TargetThread eventThread =
|
|
||||||
(TargetThread) getModel().getModelObject(thread);
|
|
||||||
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_UNLOADED,
|
|
||||||
"Library " + info.getModuleName(index) + " unloaded", List.of(targetModule));
|
|
||||||
FridaModelImpl impl = (FridaModelImpl) model;
|
FridaModelImpl impl = (FridaModelImpl) model;
|
||||||
impl.deleteModelObject(targetModule.getModule());
|
impl.deleteModelObject(targetModule.getModule());
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,12 +87,7 @@ public class FridaModelTargetModuleContainerImpl extends FridaModelTargetObjectI
|
||||||
Msg.error(this, "Module " + info.getModuleName(index) + " not found!");
|
Msg.error(this, "Module " + info.getModuleName(index) + " not found!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
FridaThread thread = getManager().getCurrentThread();
|
|
||||||
TargetThread eventThread =
|
|
||||||
(TargetThread) getModel().getModelObject(thread);
|
|
||||||
changeElements(List.of(), List.of(targetModule), Map.of(), "Loaded");
|
changeElements(List.of(), List.of(targetModule), Map.of(), "Loaded");
|
||||||
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_LOADED,
|
|
||||||
"Library " + info.getModuleName(index) + " loaded", List.of(targetModule));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -109,11 +104,6 @@ public class FridaModelTargetModuleContainerImpl extends FridaModelTargetObjectI
|
||||||
FridaCause cause) {
|
FridaCause cause) {
|
||||||
FridaModelTargetModule targetModule = getTargetModule(info.getModule(index));
|
FridaModelTargetModule targetModule = getTargetModule(info.getModule(index));
|
||||||
if (targetModule != null) {
|
if (targetModule != null) {
|
||||||
FridaThread thread = getManager().getCurrentThread();
|
|
||||||
TargetThread eventThread =
|
|
||||||
(TargetThread) getModel().getModelObject(thread);
|
|
||||||
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_UNLOADED,
|
|
||||||
"Library " + info.getModuleName(index) + " unloaded", List.of(targetModule));
|
|
||||||
FridaModelImpl impl = (FridaModelImpl) model;
|
FridaModelImpl impl = (FridaModelImpl) model;
|
||||||
impl.deleteModelObject(targetModule.getModule());
|
impl.deleteModelObject(targetModule.getModule());
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,17 +107,12 @@ public class GdbModelTargetInferiorContainer
|
||||||
@Override
|
@Override
|
||||||
public void libraryLoaded(GdbInferior inf, String name, GdbCause cause) {
|
public void libraryLoaded(GdbInferior inf, String name, GdbCause cause) {
|
||||||
GdbModelTargetInferior inferior = getTargetInferior(inf);
|
GdbModelTargetInferior inferior = getTargetInferior(inf);
|
||||||
GdbModelTargetModule module = inferior.modules.libraryLoaded(name);
|
inferior.modules.libraryLoaded(name);
|
||||||
broadcast().event(parent, null, TargetEventType.MODULE_LOADED,
|
|
||||||
"Library " + name + " loaded", List.of(module));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void libraryUnloaded(GdbInferior inf, String name, GdbCause cause) {
|
public void libraryUnloaded(GdbInferior inf, String name, GdbCause cause) {
|
||||||
GdbModelTargetInferior inferior = getTargetInferior(inf);
|
GdbModelTargetInferior inferior = getTargetInferior(inf);
|
||||||
GdbModelTargetModule module = inferior.modules.getTargetModuleIfPresent(name);
|
|
||||||
broadcast().event(parent, null, TargetEventType.MODULE_UNLOADED,
|
|
||||||
"Library " + name + " unloaded", List.of(module));
|
|
||||||
inferior.modules.libraryUnloaded(name);
|
inferior.modules.libraryUnloaded(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,11 @@ public class GdbModelTargetModuleContainer
|
||||||
|
|
||||||
@Internal
|
@Internal
|
||||||
public GdbModelTargetModule libraryLoaded(String name) {
|
public GdbModelTargetModule libraryLoaded(String name) {
|
||||||
GdbModule mod = Objects.requireNonNull(inferior.getKnownModules().get(name));
|
GdbModule mod = inferior.getKnownModules().get(name);
|
||||||
|
if (mod == null) {
|
||||||
|
// We'll catch it the next time around.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
GdbModelTargetModule module = getTargetModule(mod);
|
GdbModelTargetModule module = getTargetModule(mod);
|
||||||
changeElements(List.of(), List.of(module), "Loaded");
|
changeElements(List.of(), List.of(module), "Loaded");
|
||||||
return module;
|
return module;
|
||||||
|
|
|
@ -69,12 +69,7 @@ public class LldbModelTargetModuleContainerImpl extends LldbModelTargetObjectImp
|
||||||
System.err.println("Module " + info.getModuleName(index) + " not found!");
|
System.err.println("Module " + info.getModuleName(index) + " not found!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SBThread thread = getManager().getEventThread();
|
|
||||||
TargetThread eventThread =
|
|
||||||
(TargetThread) getModel().getModelObject(thread);
|
|
||||||
changeElements(List.of(), List.of(targetModule), Map.of(), "Loaded");
|
changeElements(List.of(), List.of(targetModule), Map.of(), "Loaded");
|
||||||
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_LOADED,
|
|
||||||
"Library " + info.getModuleName(index) + " loaded", List.of(targetModule));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -82,11 +77,6 @@ public class LldbModelTargetModuleContainerImpl extends LldbModelTargetObjectImp
|
||||||
public void libraryUnloaded(DebugModuleInfo info, int index) {
|
public void libraryUnloaded(DebugModuleInfo info, int index) {
|
||||||
LldbModelTargetModule targetModule = getTargetModule(info.getModule(index));
|
LldbModelTargetModule targetModule = getTargetModule(info.getModule(index));
|
||||||
if (targetModule != null) {
|
if (targetModule != null) {
|
||||||
SBThread thread = getManager().getEventThread();
|
|
||||||
TargetThread eventThread =
|
|
||||||
(TargetThread) getModel().getModelObject(thread);
|
|
||||||
broadcast().event(getProxy(), eventThread, TargetEventType.MODULE_UNLOADED,
|
|
||||||
"Library " + info.getModuleName(index) + " unloaded", List.of(targetModule));
|
|
||||||
LldbModelImpl impl = (LldbModelImpl) model;
|
LldbModelImpl impl = (LldbModelImpl) model;
|
||||||
impl.deleteModelObject(targetModule.getModule());
|
impl.deleteModelObject(targetModule.getModule());
|
||||||
}
|
}
|
||||||
|
|
|
@ -234,10 +234,6 @@ public enum GadpValueUtils {
|
||||||
return TargetEventType.THREAD_CREATED;
|
return TargetEventType.THREAD_CREATED;
|
||||||
case EV_THREAD_EXITED:
|
case EV_THREAD_EXITED:
|
||||||
return TargetEventType.THREAD_EXITED;
|
return TargetEventType.THREAD_EXITED;
|
||||||
case EV_MODULE_LOADED:
|
|
||||||
return TargetEventType.MODULE_LOADED;
|
|
||||||
case EV_MODULE_UNLOADED:
|
|
||||||
return TargetEventType.MODULE_UNLOADED;
|
|
||||||
case EV_BREAKPOINT_HIT:
|
case EV_BREAKPOINT_HIT:
|
||||||
return TargetEventType.BREAKPOINT_HIT;
|
return TargetEventType.BREAKPOINT_HIT;
|
||||||
case EV_STEP_COMPLETED:
|
case EV_STEP_COMPLETED:
|
||||||
|
@ -264,10 +260,6 @@ public enum GadpValueUtils {
|
||||||
return Gadp.TargetEventType.EV_THREAD_CREATED;
|
return Gadp.TargetEventType.EV_THREAD_CREATED;
|
||||||
case THREAD_EXITED:
|
case THREAD_EXITED:
|
||||||
return Gadp.TargetEventType.EV_THREAD_EXITED;
|
return Gadp.TargetEventType.EV_THREAD_EXITED;
|
||||||
case MODULE_LOADED:
|
|
||||||
return Gadp.TargetEventType.EV_MODULE_LOADED;
|
|
||||||
case MODULE_UNLOADED:
|
|
||||||
return Gadp.TargetEventType.EV_MODULE_UNLOADED;
|
|
||||||
case BREAKPOINT_HIT:
|
case BREAKPOINT_HIT:
|
||||||
return Gadp.TargetEventType.EV_BREAKPOINT_HIT;
|
return Gadp.TargetEventType.EV_BREAKPOINT_HIT;
|
||||||
case STEP_COMPLETED:
|
case STEP_COMPLETED:
|
||||||
|
|
|
@ -484,8 +484,6 @@ enum TargetEventType {
|
||||||
EV_PROCESS_EXITED = 3;
|
EV_PROCESS_EXITED = 3;
|
||||||
EV_THREAD_CREATED = 4;
|
EV_THREAD_CREATED = 4;
|
||||||
EV_THREAD_EXITED = 5;
|
EV_THREAD_EXITED = 5;
|
||||||
EV_MODULE_LOADED = 6;
|
|
||||||
EV_MODULE_UNLOADED = 7;
|
|
||||||
EV_BREAKPOINT_HIT = 8;
|
EV_BREAKPOINT_HIT = 8;
|
||||||
EV_STEP_COMPLETED = 9;
|
EV_STEP_COMPLETED = 9;
|
||||||
EV_EXCEPTION = 10;
|
EV_EXCEPTION = 10;
|
||||||
|
|
|
@ -34,11 +34,9 @@ import ghidra.program.model.address.*;
|
||||||
import ghidra.trace.model.Trace;
|
import ghidra.trace.model.Trace;
|
||||||
import ghidra.trace.model.memory.TraceMemoryManager;
|
import ghidra.trace.model.memory.TraceMemoryManager;
|
||||||
import ghidra.trace.model.memory.TraceMemoryState;
|
import ghidra.trace.model.memory.TraceMemoryState;
|
||||||
import ghidra.trace.model.modules.TraceModule;
|
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
import ghidra.util.TimedMsg;
|
import ghidra.util.TimedMsg;
|
||||||
import ghidra.util.datastruct.PrivatelyQueuedListener;
|
import ghidra.util.datastruct.PrivatelyQueuedListener;
|
||||||
import ghidra.util.exception.DuplicateNameException;
|
|
||||||
|
|
||||||
public class TraceEventListener extends AnnotatedDebuggerAttributeListener {
|
public class TraceEventListener extends AnnotatedDebuggerAttributeListener {
|
||||||
|
|
||||||
|
@ -143,28 +141,6 @@ public class TraceEventListener extends AnnotatedDebuggerAttributeListener {
|
||||||
ManagedThreadRecorder rec = recorder.getThreadRecorder(eventThread);
|
ManagedThreadRecorder rec = recorder.getThreadRecorder(eventThread);
|
||||||
recorder.createSnapshot(description, rec == null ? null : rec.getTraceThread(), null);
|
recorder.createSnapshot(description, rec == null ? null : rec.getTraceThread(), null);
|
||||||
ignoreInvalidation = false;
|
ignoreInvalidation = false;
|
||||||
|
|
||||||
if (type == TargetEventType.MODULE_LOADED) {
|
|
||||||
long snap = recorder.getSnap();
|
|
||||||
Object p0 = parameters.get(0);
|
|
||||||
if (!(p0 instanceof TargetModule)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
TargetModule mod = (TargetModule) p0;
|
|
||||||
String modPath = mod.getJoinedPath(".");
|
|
||||||
recorder.parTx.execute("Adjust module load: " + modPath, () -> {
|
|
||||||
TraceModule traceModule = recorder.getTraceModule(mod);
|
|
||||||
if (traceModule == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
traceModule.setLoadedSnap(snap);
|
|
||||||
}
|
|
||||||
catch (DuplicateNameException e) {
|
|
||||||
Msg.error(this, "Could not set module loaded snap", e);
|
|
||||||
}
|
|
||||||
}, modPath);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@AttributeCallback(TargetExecutionStateful.STATE_ATTRIBUTE_NAME)
|
@AttributeCallback(TargetExecutionStateful.STATE_ATTRIBUTE_NAME)
|
||||||
|
|
|
@ -64,17 +64,6 @@ public interface TargetEventScope extends TargetObject {
|
||||||
* A target thread in this session has exited
|
* A target thread in this session has exited
|
||||||
*/
|
*/
|
||||||
THREAD_EXITED(false),
|
THREAD_EXITED(false),
|
||||||
/**
|
|
||||||
* A new module has been loaded by this session
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* The new module must be passed as a parameter.
|
|
||||||
*/
|
|
||||||
MODULE_LOADED(false),
|
|
||||||
/**
|
|
||||||
* A module has been unloaded by this session
|
|
||||||
*/
|
|
||||||
MODULE_UNLOADED(false),
|
|
||||||
/**
|
/**
|
||||||
* The session has stopped, because one if its targets was trapped by a breakpoint
|
* The session has stopped, because one if its targets was trapped by a breakpoint
|
||||||
*
|
*
|
||||||
|
|
|
@ -203,12 +203,6 @@ public class EventValidator
|
||||||
case THREAD_EXITED:
|
case THREAD_EXITED:
|
||||||
validateDestroyed(type.name(), TargetThread.class, threads, parameters);
|
validateDestroyed(type.name(), TargetThread.class, threads, parameters);
|
||||||
break;
|
break;
|
||||||
case MODULE_LOADED:
|
|
||||||
validateCreated(type.name(), TargetModule.class, modules, parameters);
|
|
||||||
break;
|
|
||||||
case MODULE_UNLOADED:
|
|
||||||
validateDestroyed(type.name(), TargetModule.class, modules, parameters);
|
|
||||||
break;
|
|
||||||
case STOPPED:
|
case STOPPED:
|
||||||
case RUNNING:
|
case RUNNING:
|
||||||
case BREAKPOINT_HIT:
|
case BREAKPOINT_HIT:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue