mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 10:49:34 +02:00
GP-571: dbgeng schema implementation
This commit is contained in:
parent
eb66a90f6c
commit
c81a17405d
49 changed files with 397 additions and 80 deletions
|
@ -26,8 +26,14 @@ import agent.dbgeng.manager.breakpoint.DbgBreakpointType;
|
|||
import ghidra.async.AsyncFence;
|
||||
import ghidra.dbg.target.TargetBreakpointContainer;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.program.model.address.AddressRange;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "BreakpointContainer", elements = {
|
||||
@TargetElementType(type = DbgModelTargetBreakpointSpec.class)
|
||||
}, attributes = {
|
||||
@TargetAttributeType(type = Void.class)
|
||||
}, canonicalContainer = true)
|
||||
public interface DbgModelTargetBreakpointContainer extends DbgModelTargetObject,
|
||||
TargetBreakpointContainer<DbgModelTargetBreakpointContainer>, DbgEventsListenerAdapter {
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
*/
|
||||
package agent.dbgeng.model.iface2;
|
||||
|
||||
public interface DbgModelTargetDebugContainer extends
|
||||
DbgModelTargetObject {
|
||||
public interface DbgModelTargetDebugContainer extends DbgModelTargetObject {
|
||||
|
||||
}
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
*/
|
||||
package agent.dbgeng.model.iface2;
|
||||
|
||||
public interface DbgModelTargetModuleSectionContainer
|
||||
extends DbgModelTargetObject {
|
||||
public interface DbgModelTargetModuleSectionContainer extends DbgModelTargetObject {
|
||||
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
package agent.dbgeng.model.impl;
|
||||
|
||||
import ghidra.dbg.target.TargetAggregate;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema;
|
||||
|
||||
public class DbgModelDefaultTargetModelRoot extends DbgModelTargetObjectImpl
|
||||
implements TargetAggregate {
|
||||
|
@ -23,4 +24,10 @@ public class DbgModelDefaultTargetModelRoot extends DbgModelTargetObjectImpl
|
|||
public DbgModelDefaultTargetModelRoot(DbgModelImpl model, String typeHint) {
|
||||
super(model, null, null, typeHint);
|
||||
}
|
||||
|
||||
public DbgModelDefaultTargetModelRoot(DbgModelImpl model, String typeHint,
|
||||
TargetObjectSchema schema) {
|
||||
super(model, null, null, typeHint, schema);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -26,6 +26,8 @@ import agent.dbgeng.model.AbstractDbgModel;
|
|||
import agent.dbgeng.model.iface2.DbgModelTargetSession;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSessionContainer;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.AnnotatedSchemaContext;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema;
|
||||
import ghidra.program.model.address.*;
|
||||
|
||||
public class DbgModelImpl extends AbstractDbgModel {
|
||||
|
@ -33,6 +35,10 @@ public class DbgModelImpl extends AbstractDbgModel {
|
|||
// The model must convert to and from Ghidra's address space names
|
||||
protected static final String SPACE_NAME = "ram";
|
||||
|
||||
protected static final AnnotatedSchemaContext SCHEMA_CTX = new AnnotatedSchemaContext();
|
||||
protected static final TargetObjectSchema ROOT_SCHEMA =
|
||||
SCHEMA_CTX.getSchemaForClass(DbgModelTargetRootImpl.class);
|
||||
|
||||
// Don't make this static, so each model has a unique "GDB" space
|
||||
protected final AddressSpace space =
|
||||
new GenericAddressSpace(SPACE_NAME, 64, AddressSpace.TYPE_RAM, 0);
|
||||
|
@ -47,7 +53,8 @@ public class DbgModelImpl extends AbstractDbgModel {
|
|||
|
||||
public DbgModelImpl() {
|
||||
this.dbg = DbgManager.newInstance();
|
||||
this.root = new DbgModelTargetRootImpl(this);
|
||||
//System.out.println(XmlSchemaContext.serialize(SCHEMA_CTX));
|
||||
this.root = new DbgModelTargetRootImpl(this, ROOT_SCHEMA);
|
||||
this.completedRoot = CompletableFuture.completedFuture(root);
|
||||
DbgSessionImpl s = new DbgSessionImpl((DbgManagerImpl) dbg, new DebugSessionId(0));
|
||||
s.add();
|
||||
|
|
|
@ -24,8 +24,14 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "AvailableContainer", elements = { //
|
||||
@TargetElementType(type = DbgModelTargetAvailableImpl.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetAvailableContainerImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetAvailableContainer {
|
||||
|
||||
|
|
|
@ -20,8 +20,14 @@ import java.util.Map;
|
|||
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetAvailable;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetAvailableContainer;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "Available", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetAvailableImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetAvailable {
|
||||
|
||||
|
@ -44,7 +50,7 @@ public class DbgModelTargetAvailableImpl extends DbgModelTargetObjectImpl
|
|||
this.pid = pid;
|
||||
|
||||
this.changeAttributes(List.of(), List.of(), Map.of(//
|
||||
PID_ATTRIBUTE_NAME, pid, //
|
||||
PID_ATTRIBUTE_NAME, (long) pid, //
|
||||
DISPLAY_ATTRIBUTE_NAME, keyAttachable(pid) + " : " + name.trim(),
|
||||
UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED //
|
||||
), "Initialized");
|
||||
|
@ -61,6 +67,7 @@ public class DbgModelTargetAvailableImpl extends DbgModelTargetObjectImpl
|
|||
), "Initialized");
|
||||
}
|
||||
|
||||
@TargetAttributeType(name = PID_ATTRIBUTE_NAME, hidden = true)
|
||||
@Override
|
||||
public long getPid() {
|
||||
return pid;
|
||||
|
|
|
@ -26,8 +26,14 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
|
|||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "BreakpointContainer", elements = { //
|
||||
@TargetElementType(type = DbgModelTargetBreakpointSpecImpl.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetBreakpointContainerImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetBreakpointContainer {
|
||||
|
||||
|
|
|
@ -22,9 +22,14 @@ import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
|
|||
import agent.dbgeng.model.iface2.DbgModelTargetBreakpointContainer;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetBreakpointSpec;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.util.datastruct.ListenerSet;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "BreakpointSpec", attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetBreakpointSpecImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetBreakpointSpec {
|
||||
|
||||
|
|
|
@ -20,7 +20,16 @@ import java.util.Map;
|
|||
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetConnector;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetRoot;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "ConnectorContainer", attributes = { //
|
||||
@TargetAttributeType(name = "Launch process", type = DbgModelTargetProcessLaunchConnectorImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(name = "Attach to process", type = DbgModelTargetProcessAttachConnectorImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(name = "Load trace/dump", type = DbgModelTargetTraceOrDumpConnectorImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(name = "Attach to kernel", type = DbgModelTargetKernelConnectorImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetConnectorContainerImpl extends DbgModelTargetObjectImpl {
|
||||
|
||||
protected final DbgModelTargetRoot root;
|
||||
|
|
|
@ -20,7 +20,13 @@ import java.util.Map;
|
|||
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetDebugContainer;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetProcess;
|
||||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "DebugContainer", attributes = { //
|
||||
@TargetAttributeType(name = "Breakpoints", type = DbgModelTargetBreakpointContainerImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetDebugContainerImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetDebugContainer {
|
||||
|
||||
|
|
|
@ -26,7 +26,13 @@ import ghidra.dbg.error.DebuggerUserException;
|
|||
import ghidra.dbg.target.TargetMethod;
|
||||
import ghidra.dbg.target.TargetMethod.ParameterDescription;
|
||||
import ghidra.dbg.target.TargetMethod.TargetParameterMap;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "KernelConnector", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetKernelConnectorImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetConnector {
|
||||
|
||||
|
|
|
@ -31,9 +31,15 @@ import ghidra.dbg.error.DebuggerMemoryAccessException;
|
|||
import ghidra.dbg.error.DebuggerModelAccessException;
|
||||
import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "Memory", elements = { //
|
||||
@TargetElementType(type = DbgModelTargetMemoryRegionImpl.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetMemoryContainerImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetMemoryContainer {
|
||||
|
||||
|
|
|
@ -21,9 +21,23 @@ import java.util.Map;
|
|||
import agent.dbgeng.manager.DbgModuleMemory;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetMemoryContainer;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetMemoryRegion;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.program.model.address.*;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "MemoryRegion", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(name = "BaseAddress", type = Address.class), //
|
||||
@TargetAttributeType(name = "EndAddress", type = Address.class), //
|
||||
@TargetAttributeType(name = "RegionSize", type = String.class), //
|
||||
@TargetAttributeType(name = "AllocationBase", type = Address.class), //
|
||||
@TargetAttributeType(name = "AllocationProtect", type = String.class), //
|
||||
@TargetAttributeType(name = "Protect", type = String.class), //
|
||||
@TargetAttributeType(name = "State", type = String.class), //
|
||||
@TargetAttributeType(name = "Type", type = String.class), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetMemoryRegionImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetMemoryRegion {
|
||||
|
||||
|
|
|
@ -26,9 +26,15 @@ import ghidra.async.AsyncFence;
|
|||
import ghidra.async.AsyncLazyMap;
|
||||
import ghidra.dbg.target.TargetModule;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.lifecycle.Internal;
|
||||
import ghidra.util.Msg;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "ModuleContainer", elements = { //
|
||||
@TargetElementType(type = DbgModelTargetModuleImpl.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetModuleContainerImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetModuleContainer {
|
||||
// NOTE: -file-list-shared-libraries omits the main module and system-supplied DSO.
|
||||
|
|
|
@ -20,9 +20,20 @@ import java.util.Map;
|
|||
|
||||
import agent.dbgeng.manager.*;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetModule;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.program.model.address.*;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "Module", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(name = "Symbols", type = DbgModelTargetSymbolContainerImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(name = "BaseAddress", type = Address.class), //
|
||||
@TargetAttributeType(name = "ImageName", type = String.class), //
|
||||
@TargetAttributeType(name = "TimeStamp", type = Integer.class), //
|
||||
@TargetAttributeType(name = "Len", type = String.class), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetModuleImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetModule {
|
||||
protected static String indexModule(DbgModule module) {
|
||||
|
|
|
@ -21,8 +21,14 @@ import java.util.concurrent.CompletableFuture;
|
|||
import agent.dbgeng.manager.DbgModule;
|
||||
import agent.dbgeng.manager.DbgModuleSection;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "SectionContainer", elements = { //
|
||||
@TargetElementType(type = DbgModelTargetModuleSectionImpl.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetModuleSectionContainerImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetModuleSectionContainer {
|
||||
|
||||
|
|
|
@ -20,8 +20,14 @@ import java.util.Map;
|
|||
|
||||
import agent.dbgeng.manager.DbgModuleSection;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetModuleSection;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.program.model.address.*;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "Section", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetModuleSectionImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetModuleSection {
|
||||
protected static final String OBJFILE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "objfile";
|
||||
|
@ -46,6 +52,7 @@ public class DbgModelTargetModuleSectionImpl extends DbgModelTargetObjectImpl
|
|||
), "Initialized");
|
||||
}
|
||||
|
||||
@TargetAttributeType(name = RANGE_ATTRIBUTE_NAME)
|
||||
@Override
|
||||
public AddressRange getRange() {
|
||||
return range;
|
||||
|
|
|
@ -29,6 +29,7 @@ import ghidra.dbg.target.*;
|
|||
import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility;
|
||||
import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibilityListener;
|
||||
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema;
|
||||
|
||||
public class DbgModelTargetObjectImpl extends DefaultTargetObject<TargetObject, TargetObject>
|
||||
implements DbgModelTargetObject {
|
||||
|
@ -43,6 +44,12 @@ public class DbgModelTargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
getManager().addStateListener(accessListener);
|
||||
}
|
||||
|
||||
public DbgModelTargetObjectImpl(AbstractDbgModel impl, TargetObject parent, String name,
|
||||
String typeHint, TargetObjectSchema schema) {
|
||||
super(impl, parent, name, typeHint, schema);
|
||||
getManager().addStateListener(accessListener);
|
||||
}
|
||||
|
||||
public void setAttribute(String key, String value) {
|
||||
changeAttributes(List.of(), List.of(), Map.of( //
|
||||
key, value), "Initialized");
|
||||
|
|
|
@ -27,7 +27,13 @@ import ghidra.dbg.error.DebuggerUserException;
|
|||
import ghidra.dbg.target.TargetMethod;
|
||||
import ghidra.dbg.target.TargetMethod.ParameterDescription;
|
||||
import ghidra.dbg.target.TargetMethod.TargetParameterMap;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "ProcessAttachConnector", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetProcessAttachConnectorImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetConnector {
|
||||
|
||||
|
|
|
@ -25,9 +25,15 @@ import agent.dbgeng.dbgeng.DebugThreadId;
|
|||
import agent.dbgeng.manager.*;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "ProcessContainer", elements = { //
|
||||
@TargetElementType(type = DbgModelTargetProcessImpl.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetProcessContainerImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetProcessContainer {
|
||||
|
||||
|
|
|
@ -33,14 +33,27 @@ import ghidra.dbg.DebuggerObjectModel;
|
|||
import ghidra.dbg.attributes.TargetObjectRef;
|
||||
import ghidra.dbg.attributes.TypedTargetObjectRef;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "Process", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(name = "Debug", type = DbgModelTargetDebugContainerImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(name = "Memory", type = DbgModelTargetMemoryContainerImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(name = "Modules", type = DbgModelTargetModuleContainerImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(name = "Threads", type = DbgModelTargetThreadContainerImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetProcessImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetProcess {
|
||||
|
||||
public static final String PID_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "pid";
|
||||
public static final String EXIT_CODE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "exit_code";
|
||||
|
||||
protected static final TargetAttachKindSet SUPPORTED_KINDS = TargetAttachKindSet.of( //
|
||||
TargetAttachKind.BY_OBJECT_REF, TargetAttachKind.BY_ID);
|
||||
|
||||
protected static String indexProcess(DebugProcessId debugProcessId) {
|
||||
return PathUtils.makeIndex(debugProcessId.id);
|
||||
}
|
||||
|
@ -79,8 +92,11 @@ public class DbgModelTargetProcessImpl extends DbgModelTargetObjectImpl
|
|||
//sections, //
|
||||
threads //
|
||||
), Map.of( //
|
||||
ACCESSIBLE_ATTRIBUTE_NAME, false, //
|
||||
DISPLAY_ATTRIBUTE_NAME, getDisplay(), //
|
||||
TargetMethod.PARAMETERS_ATTRIBUTE_NAME, PARAMETERS //
|
||||
TargetMethod.PARAMETERS_ATTRIBUTE_NAME, PARAMETERS, //
|
||||
SUPPORTED_ATTACH_KINDS_ATTRIBUTE_NAME, SUPPORTED_KINDS, //
|
||||
SUPPORTED_STEP_KINDS_ATTRIBUTE_NAME, DbgModelTargetThreadImpl.SUPPORTED_KINDS //
|
||||
), "Initialized");
|
||||
setExecutionState(TargetExecutionState.ALIVE, "Initialized");
|
||||
|
||||
|
|
|
@ -25,7 +25,13 @@ import ghidra.dbg.error.DebuggerUserException;
|
|||
import ghidra.dbg.target.TargetMethod;
|
||||
import ghidra.dbg.target.TargetMethod.ParameterDescription;
|
||||
import ghidra.dbg.target.TargetMethod.TargetParameterMap;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "ProcessLaunchConnector", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetProcessLaunchConnectorImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetConnector {
|
||||
|
||||
|
|
|
@ -31,8 +31,14 @@ import ghidra.dbg.error.DebuggerRegisterAccessException;
|
|||
import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.TargetRegisterBank;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.util.ConversionUtils;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "RegisterContainer", elements = { //
|
||||
@TargetElementType(type = DbgModelTargetRegisterImpl.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetRegisterContainerAndBank {
|
||||
|
||||
|
|
|
@ -21,8 +21,14 @@ import java.util.Map;
|
|||
import agent.dbgeng.manager.impl.DbgRegister;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetRegister;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetRegisterContainerAndBank;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "RegisterDescriptor", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetRegisterImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetRegister {
|
||||
|
||||
|
|
|
@ -27,7 +27,16 @@ import ghidra.async.AsyncUtils;
|
|||
import ghidra.async.TypeSpec;
|
||||
import ghidra.dbg.error.DebuggerUserException;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "Debugger", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(name = "Available", type = DbgModelTargetAvailableContainerImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(name = "Connectors", type = DbgModelTargetConnectorContainerImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(name = "Sessions", type = DbgModelTargetSessionContainerImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetRootImpl extends DbgModelDefaultTargetModelRoot
|
||||
implements DbgModelTargetRoot {
|
||||
|
||||
|
@ -39,8 +48,8 @@ public class DbgModelTargetRootImpl extends DbgModelDefaultTargetModelRoot
|
|||
|
||||
protected DbgModelSelectableObject focus;
|
||||
|
||||
public DbgModelTargetRootImpl(DbgModelImpl impl) {
|
||||
super(impl, "Debugger");
|
||||
public DbgModelTargetRootImpl(DbgModelImpl impl, TargetObjectSchema schema) {
|
||||
super(impl, "Debugger", schema);
|
||||
|
||||
this.available = new DbgModelTargetAvailableContainerImpl(this);
|
||||
this.connectors = new DbgModelTargetConnectorContainerImpl(this);
|
||||
|
|
|
@ -21,7 +21,14 @@ import java.util.concurrent.CompletableFuture;
|
|||
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSession;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSessionAttributes;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "SessionAttributes", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(name = "Machine", type = DbgModelTargetSessionAttributesMachineImpl.class, fixed = true), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetSessionAttributesImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetSessionAttributes {
|
||||
|
||||
|
|
|
@ -28,13 +28,23 @@ import agent.dbgeng.model.iface2.DbgModelTargetSessionAttributes;
|
|||
import agent.dbgeng.model.iface2.DbgModelTargetSessionAttributesMachine;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.async.TypeSpec;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "SessionAttributesMachine", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(name = "Arch", type = String.class), //
|
||||
@TargetAttributeType(name = "Debugger", type = String.class), //
|
||||
@TargetAttributeType(name = "OS", type = String.class), //
|
||||
@TargetAttributeType(name = "Mode", type = String.class), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetSessionAttributesMachineImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetSessionAttributesMachine {
|
||||
|
||||
String ARCH_ATTRIBUTE_NAME = "Arch";
|
||||
String DEBUGGER_ATTRIBUTE_NAME = "Debugger";
|
||||
String OS_ATTRIBUTE_NAME = "OS";
|
||||
static String ARCH_ATTRIBUTE_NAME = "Arch";
|
||||
static String DEBUGGER_ATTRIBUTE_NAME = "Debugger";
|
||||
static String OS_ATTRIBUTE_NAME = "OS";
|
||||
|
||||
public DbgModelTargetSessionAttributesMachineImpl(DbgModelTargetSessionAttributes attributes) {
|
||||
super(attributes.getModel(), attributes, "Machine", "SessionMachineAttributes");
|
||||
|
|
|
@ -23,8 +23,14 @@ import agent.dbgeng.dbgeng.DebugSessionId;
|
|||
import agent.dbgeng.manager.DbgCause;
|
||||
import agent.dbgeng.manager.DbgSession;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "SessionContainer", elements = { //
|
||||
@TargetElementType(type = DbgModelTargetSessionImpl.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetSessionContainerImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetSessionContainer {
|
||||
|
||||
|
|
|
@ -24,8 +24,16 @@ import agent.dbgeng.manager.*;
|
|||
import agent.dbgeng.model.iface1.DbgModelSelectableObject;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetProcessContainer;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSession;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "Session", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(name = "Attributes", type = DbgModelTargetSessionAttributesImpl.class, fixed = true), //
|
||||
@TargetAttributeType(name = "Processes", type = DbgModelTargetProcessContainerImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetSessionImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetSession {
|
||||
|
||||
|
@ -61,8 +69,9 @@ public class DbgModelTargetSessionImpl extends DbgModelTargetObjectImpl
|
|||
attributes, //
|
||||
processes //
|
||||
), Map.of( //
|
||||
ACCESSIBLE_ATTRIBUTE_NAME, true, //
|
||||
PROMPT_ATTRIBUTE_NAME, DBG_PROMPT, //
|
||||
//STATE_ATTRIBUTE_NAME, TargetExecutionState.RUNNING, //
|
||||
STATE_ATTRIBUTE_NAME, TargetExecutionState.ALIVE, //
|
||||
UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED //
|
||||
), "Initialized");
|
||||
|
||||
|
|
|
@ -30,9 +30,26 @@ import ghidra.async.AsyncUtils;
|
|||
import ghidra.async.TypeSpec;
|
||||
import ghidra.dbg.DebugModelConventions;
|
||||
import ghidra.dbg.attributes.TargetObjectRef;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.program.model.address.Address;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "StackFrame", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.FUNC_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.FUNC_TABLE_ENTRY_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.INST_OFFSET_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.FRAME_OFFSET_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.RETURN_OFFSET_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.STACK_OFFSET_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.VIRTUAL_ATTRIBUTE_NAME, type = Boolean.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.PARAM0_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.PARAM1_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.PARAM2_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.PARAM3_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetStackFrameImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetStackFrame {
|
||||
|
||||
|
|
|
@ -24,19 +24,27 @@ import agent.dbgeng.manager.DbgStackFrame;
|
|||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.Msg;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "Stack", elements = { //
|
||||
@TargetElementType(type = DbgModelTargetStackFrameImpl.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetStackImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetStack {
|
||||
|
||||
protected final DbgModelTargetThread thread;
|
||||
|
||||
public static final String NAME = "Stack";
|
||||
|
||||
protected final Map<Integer, DbgModelTargetStackFrameImpl> framesByLevel =
|
||||
new WeakValueHashMap<>();
|
||||
|
||||
public DbgModelTargetStackImpl(DbgModelTargetThread thread, DbgModelTargetProcess process) {
|
||||
super(thread.getModel(), thread, "Stack", "Stack");
|
||||
super(thread.getModel(), thread, NAME, "Stack");
|
||||
this.thread = thread;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,8 +23,14 @@ import java.util.stream.Collectors;
|
|||
import agent.dbgeng.manager.impl.DbgMinimalSymbol;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSymbolContainer;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "SymbolContainer", elements = { //
|
||||
@TargetElementType(type = DbgModelTargetSymbolImpl.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetSymbolContainerImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetSymbolContainer {
|
||||
|
||||
|
|
|
@ -20,9 +20,15 @@ import java.util.Map;
|
|||
|
||||
import agent.dbgeng.manager.impl.DbgMinimalSymbol;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSymbol;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.program.model.address.Address;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "Symbol", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetSymbolImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetSymbol {
|
||||
protected static String indexSymbol(DbgMinimalSymbol symbol) {
|
||||
|
|
|
@ -25,9 +25,14 @@ import agent.dbgeng.manager.*;
|
|||
import agent.dbgeng.manager.reason.*;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.util.datastruct.WeakValueHashMap;
|
||||
|
||||
// TODO: Should TargetThreadContainer be a thing?
|
||||
@TargetObjectSchemaInfo(name = "ThreadContainer", elements = { //
|
||||
@TargetElementType(type = DbgModelTargetThreadImpl.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetThreadContainerImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetThreadContainer {
|
||||
|
||||
|
|
|
@ -31,8 +31,17 @@ import ghidra.async.AsyncUtils;
|
|||
import ghidra.async.TypeSpec;
|
||||
import ghidra.dbg.DebugModelConventions;
|
||||
import ghidra.dbg.target.TargetEnvironment;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "Thread", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(name = "Registers", type = DbgModelTargetRegisterContainerImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(name = "Stack", type = DbgModelTargetStackImpl.class, required = true, fixed = true), //
|
||||
@TargetAttributeType(name = TargetEnvironment.ARCH_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetThreadImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetThread {
|
||||
|
||||
|
@ -72,6 +81,7 @@ public class DbgModelTargetThreadImpl extends DbgModelTargetObjectImpl
|
|||
registers, //
|
||||
stack //
|
||||
), Map.of( //
|
||||
ACCESSIBLE_ATTRIBUTE_NAME, false, //
|
||||
DISPLAY_ATTRIBUTE_NAME, getDisplay(), //
|
||||
SUPPORTED_STEP_KINDS_ATTRIBUTE_NAME, SUPPORTED_KINDS //
|
||||
), "Initialized");
|
||||
|
|
|
@ -25,7 +25,13 @@ import ghidra.dbg.error.DebuggerUserException;
|
|||
import ghidra.dbg.target.TargetMethod;
|
||||
import ghidra.dbg.target.TargetMethod.ParameterDescription;
|
||||
import ghidra.dbg.target.TargetMethod.TargetParameterMap;
|
||||
import ghidra.dbg.target.schema.*;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "TraceOrDumpConnector", elements = { //
|
||||
@TargetElementType(type = Void.class) //
|
||||
}, attributes = { //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
})
|
||||
public class DbgModelTargetTraceOrDumpConnectorImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetConnector {
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue