GP-571: dbgeng schema implementation

This commit is contained in:
d-millar 2021-01-07 19:16:39 +00:00 committed by Dan
parent eb66a90f6c
commit c81a17405d
49 changed files with 397 additions and 80 deletions

View file

@ -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 {

View file

@ -15,7 +15,6 @@
*/
package agent.dbgeng.model.iface2;
public interface DbgModelTargetDebugContainer extends
DbgModelTargetObject {
public interface DbgModelTargetDebugContainer extends DbgModelTargetObject {
}

View file

@ -15,7 +15,6 @@
*/
package agent.dbgeng.model.iface2;
public interface DbgModelTargetModuleSectionContainer
extends DbgModelTargetObject {
public interface DbgModelTargetModuleSectionContainer extends DbgModelTargetObject {
}

View file

@ -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);
}
}

View file

@ -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();

View file

@ -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 {

View file

@ -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;

View file

@ -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 {

View file

@ -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 {

View file

@ -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;

View file

@ -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 {

View file

@ -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 {

View file

@ -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 {

View file

@ -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 {

View file

@ -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.

View file

@ -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) {

View file

@ -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 {

View file

@ -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;

View file

@ -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");

View file

@ -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 {

View file

@ -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 {

View file

@ -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");

View file

@ -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 {

View file

@ -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 {

View file

@ -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 {

View file

@ -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);

View file

@ -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 {

View file

@ -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");

View file

@ -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 {

View file

@ -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");

View file

@ -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 {

View file

@ -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;
}

View file

@ -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 {

View file

@ -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) {

View file

@ -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 {

View file

@ -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");

View file

@ -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 {