diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetAvailableImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetAvailableImpl.java index e634a21106..ce4793266f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetAvailableImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetAvailableImpl.java @@ -61,7 +61,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), // UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED // ), "Initialized"); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelImpl.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelImpl.java index 3e858e6dbb..282a0c6145 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelImpl.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelImpl.java @@ -25,6 +25,8 @@ import ghidra.async.AsyncUtils; import ghidra.dbg.agent.AbstractDebuggerObjectModel; import ghidra.dbg.jdi.manager.JdiManager; import ghidra.dbg.target.TargetObject; +import ghidra.dbg.target.schema.AnnotatedSchemaContext; +import ghidra.dbg.target.schema.TargetObjectSchema; import ghidra.program.model.address.*; public class JdiModelImpl extends AbstractDebuggerObjectModel { @@ -35,6 +37,10 @@ public class JdiModelImpl extends AbstractDebuggerObjectModel { public static final long BLOCK_SIZE = 0x1000L; public static final long DEFAULT_SECTION = 0x0000L; + protected static final AnnotatedSchemaContext SCHEMA_CTX = new AnnotatedSchemaContext(); + protected static final TargetObjectSchema ROOT_SCHEMA = + SCHEMA_CTX.getSchemaForClass(JdiModelTargetRoot.class); + protected JdiManager jdi; protected final AddressSpace ram = new GenericAddressSpace("ram", 64, AddressSpace.TYPE_RAM, 0); protected Long ramIndex = Long.valueOf(0x1000L); @@ -51,7 +57,9 @@ public class JdiModelImpl extends AbstractDebuggerObjectModel { public JdiModelImpl() { this.jdi = JdiManager.newInstance(); - this.root = new JdiModelTargetRoot(this); + //System.out.println(XmlSchemaContext.serialize(SCHEMA_CTX)); + this.root = new JdiModelTargetRoot(this, ROOT_SCHEMA); + //this.root = new JdiModelTargetRoot(this, EnumerableTargetObjectSchema.OBJECT); this.completedRoot = CompletableFuture.completedFuture(root); Address start = ram.getAddress(0L); @@ -106,44 +114,46 @@ public class JdiModelImpl extends AbstractDebuggerObjectModel { JdiModelTargetVM targetVM = getTargetVM(declaringType); JdiModelTargetReferenceType classRef = (JdiModelTargetReferenceType) targetVM.getTargetObject(declaringType); - JdiModelTargetSectionContainer sectionContainer = classRef.sections; - for (Method m : declaringType.methods()) { - if (m.location() != null && targetVM.vm.canGetBytecodes()) { - byte[] bytecodes = m.bytecodes(); - int length = bytecodes.length; - if (length > 0) { - synchronized (ramIndex) { - Address start = ram.getAddress(ramIndex); + if (classRef != null) { + JdiModelTargetSectionContainer sectionContainer = classRef.sections; + for (Method m : declaringType.methods()) { + if (m.location() != null && targetVM.vm.canGetBytecodes()) { + byte[] bytecodes = m.bytecodes(); + int length = bytecodes.length; + if (length > 0) { + synchronized (ramIndex) { + Address start = ram.getAddress(ramIndex); + AddressRangeImpl range = + new AddressRangeImpl(start, start.add(BLOCK_SIZE - 1)); + String key = methodToKey(m); + if (addressRangeByMethod.containsKey(key)) { + System.err.println("non-null location: " + m.location() + + " with " + length + " bytes"); + //throw new RuntimeException("non-null location: " + + // m.location() + " with " + length + " bytes"); + } + addressRangeByMethod.put(key, range); + if (sectionContainer != null) { + sectionContainer.addSection(m); + } + else { + System.err.println("null sectionContainer"); + } + ramIndex += 0x1000; //bytecodes.length; + } + } + else { + Address start = ram.getAddress(DEFAULT_SECTION); AddressRangeImpl range = new AddressRangeImpl(start, start.add(BLOCK_SIZE - 1)); String key = methodToKey(m); if (addressRangeByMethod.containsKey(key)) { - System.err.println("non-null location: " + m.location() + - " with " + length + " bytes"); - //throw new RuntimeException("non-null location: " + - // m.location() + " with " + length + " bytes"); + throw new RuntimeException("non-null location: " + + m.location() + " with " + length + " bytes"); } addressRangeByMethod.put(key, range); - if (sectionContainer != null) { - sectionContainer.addSection(m); - } - else { - System.err.println("null sectionContainer"); - } - ramIndex += 0x1000; //bytecodes.length; } } - else { - Address start = ram.getAddress(DEFAULT_SECTION); - AddressRangeImpl range = - new AddressRangeImpl(start, start.add(BLOCK_SIZE - 1)); - String key = methodToKey(m); - if (addressRangeByMethod.containsKey(key)) { - throw new RuntimeException("non-null location: " + m.location() + - " with " + length + " bytes"); - } - addressRangeByMethod.put(key, range); - } } } } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetAttributesContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetAttributesContainer.java index ad08c082d1..348012e9f5 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetAttributesContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetAttributesContainer.java @@ -20,9 +20,13 @@ import java.util.Map; import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.*; -// TODO: Should TargetThreadContainer be a thing? - +@TargetObjectSchemaInfo(name = "AttributesContainer", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(type = Object.class) // +}, canonicalContainer = true) public class JdiModelTargetAttributesContainer extends JdiModelTargetObjectImpl implements JdiEventsListenerAdapter { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java index fde92b7dc8..887a2ef873 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java @@ -27,9 +27,15 @@ import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.TargetBreakpointContainer; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; +import ghidra.dbg.target.schema.*; import ghidra.program.model.address.AddressRange; import ghidra.util.datastruct.WeakValueHashMap; +@TargetObjectSchemaInfo(name = "BreakpointContainer", elements = { // + @TargetElementType(type = JdiModelTargetBreakpointSpec.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetBreakpointContainer extends JdiModelTargetObjectImpl implements TargetBreakpointContainer, JdiEventsListenerAdapter { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java index 17343d0d2b..b220ed405b 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java @@ -21,10 +21,22 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo; import ghidra.dbg.jdi.model.iface1.JdiModelTargetDeletable; import ghidra.dbg.target.TargetBreakpointContainer.TargetBreakpointKindSet; +import ghidra.dbg.target.TargetBreakpointLocation; import ghidra.dbg.target.TargetBreakpointSpec; +import ghidra.dbg.target.schema.TargetAttributeType; +import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.dbg.util.CollectionUtils.Delta; import ghidra.util.datastruct.ListenerSet; +@TargetObjectSchemaInfo(name = "BreakpointSpec", attributes = { // + @TargetAttributeType( // + name = TargetBreakpointSpec.CONTAINER_ATTRIBUTE_NAME, // + type = JdiModelTargetBreakpointContainer.class), // + @TargetAttributeType( // + name = TargetBreakpointLocation.SPEC_ATTRIBUTE_NAME, // + type = JdiModelTargetBreakpointSpec.class), // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetBreakpointSpec extends JdiModelTargetObjectImpl implements // TargetBreakpointSpec, // JdiModelTargetDeletable { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetClassContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetClassContainer.java index 54ae68300e..e6dec7b001 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetClassContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetClassContainer.java @@ -23,8 +23,14 @@ import com.sun.jdi.ReferenceType; import ghidra.async.AsyncFence; import ghidra.async.AsyncUtils; +import ghidra.dbg.target.schema.*; import ghidra.util.Msg; +@TargetObjectSchemaInfo(name = "ClassContainer", elements = { // + @TargetElementType(type = JdiModelTargetReferenceType.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetClassContainer extends JdiModelTargetObjectImpl { protected final JdiModelTargetVM vm; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnector.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnector.java index 2e0139a729..9337b74059 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnector.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnector.java @@ -27,7 +27,16 @@ import ghidra.dbg.jdi.model.iface1.JdiModelTargetLauncher; import ghidra.dbg.target.TargetMethod; import ghidra.dbg.target.TargetMethod.ParameterDescription; import ghidra.dbg.target.TargetMethod.TargetParameterMap; +import ghidra.dbg.target.schema.*; +@TargetObjectSchemaInfo(name = "Connector", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(name = "Description", type = String.class, required = true, fixed = true), // + @TargetAttributeType(name = "Default Arguments", type = Object.class, required = true, fixed = true), // + @TargetAttributeType(name = "Transport", type = Object.class, required = true, fixed = true), // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetConnector extends JdiModelTargetObjectImpl implements JdiModelSelectableObject, // TODO: Make a JidModelTargetLaunchingConnector and JdiModelTargetAttachingConnector @@ -35,7 +44,7 @@ public class JdiModelTargetConnector extends JdiModelTargetObjectImpl protected final JdiModelTargetConnectorContainer connectors; protected final Connector cx; - protected final Map> paramDescs; + protected final TargetParameterMap paramDescs; public JdiModelTargetConnector(JdiModelTargetConnectorContainer connectors, Connector cx) { super(connectors, cx.name(), cx); @@ -47,7 +56,8 @@ public class JdiModelTargetConnector extends JdiModelTargetObjectImpl "Description", cx.description(), // "Default Arguments", cx.defaultArguments(), // "Transport", cx.transport(), // - TargetMethod.PARAMETERS_ATTRIBUTE_NAME, paramDescs = computeParameters(), // + TargetMethod.PARAMETERS_ATTRIBUTE_NAME, + paramDescs = TargetParameterMap.copyOf(computeParameters()), // UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED // ), "Initialized"); } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java index b8f08ec742..68529197a3 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java @@ -24,8 +24,14 @@ import com.sun.jdi.connect.Connector; import ghidra.async.AsyncFence; import ghidra.async.AsyncUtils; +import ghidra.dbg.target.schema.*; import ghidra.util.Msg; +@TargetObjectSchemaInfo(name = "ConnectorContainer", elements = { // + @TargetElementType(type = JdiModelTargetConnector.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetConnectorContainer extends JdiModelTargetObjectImpl { protected final JdiModelTargetRoot root; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java index 12ecb3a601..2954b488f5 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java @@ -21,8 +21,14 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.target.TargetMemoryRegion; import ghidra.dbg.target.TargetSection; +import ghidra.dbg.target.schema.*; import ghidra.program.model.address.AddressRange; +@TargetObjectSchemaInfo(name = "ConstantPool", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetConstantPool extends JdiModelTargetObjectImpl implements // //TargetMemory, TargetMemoryRegion, TargetSection { @@ -40,7 +46,8 @@ public class JdiModelTargetConstantPool extends JdiModelTargetObjectImpl impleme DISPLAY_ATTRIBUTE_NAME, getDisplay(), // MODULE_ATTRIBUTE_NAME, parent.getClassType(), // READABLE_ATTRIBUTE_NAME, true, // - MEMORY_ATTRIBUTE_NAME, parent, TargetMemoryRegion.RANGE_ATTRIBUTE_NAME, range, // + MEMORY_ATTRIBUTE_NAME, parent, // + TargetMemoryRegion.RANGE_ATTRIBUTE_NAME, range, // UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED // ), "Initialized"); } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetElementsContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetElementsContainer.java index 9426c0a008..d3174902b3 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetElementsContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetElementsContainer.java @@ -23,10 +23,15 @@ import com.sun.jdi.ThreadGroupReference; import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.TargetObject; +import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.util.datastruct.WeakValueHashMap; -// TODO: Should TargetThreadContainer be a thing? +@TargetObjectSchemaInfo(name = "ElementsContainer", elements = { // + @TargetElementType(type = JdiModelTargetObject.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetElementsContainer extends JdiModelTargetObjectImpl implements JdiEventsListenerAdapter { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetField.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetField.java index 6bcf7d5b5d..22c620d579 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetField.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetField.java @@ -24,7 +24,15 @@ import com.sun.jdi.request.*; import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.TargetAttributeType; +import ghidra.dbg.target.schema.TargetObjectSchemaInfo; +@TargetObjectSchemaInfo(name = "Field", elements = { // + //@TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), // + @TargetAttributeType(type = Void.class) // +}) public class JdiModelTargetField extends JdiModelTargetObjectImpl { protected final Field field; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetFieldContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetFieldContainer.java index 87146adb8f..a7b598c644 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetFieldContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetFieldContainer.java @@ -22,7 +22,13 @@ import java.util.stream.Collectors; import com.sun.jdi.Field; import ghidra.async.AsyncFence; +import ghidra.dbg.target.schema.*; +@TargetObjectSchemaInfo(name = "FieldsContainer", elements = { // + @TargetElementType(type = JdiModelTargetField.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetFieldContainer extends JdiModelTargetObjectImpl { // NOTE: -file-list-shared-libraries omits the main module and system-supplied DSO. diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariable.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariable.java index 785b3309fc..e8ac09dc24 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariable.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariable.java @@ -21,6 +21,17 @@ import java.util.concurrent.CompletableFuture; import com.sun.jdi.ClassNotLoadedException; import com.sun.jdi.LocalVariable; +import ghidra.dbg.target.schema.*; + +@TargetObjectSchemaInfo(name = "LocalVariable", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), // + @TargetAttributeType(name = "Generic Signature", type = String.class), // + @TargetAttributeType(name = "Signature", type = String.class), // + @TargetAttributeType(name = "Type", type = String.class, required = true), // + @TargetAttributeType(type = Void.class) // +}) public class JdiModelTargetLocalVariable extends JdiModelTargetObjectImpl { String IS_ARGUMENT_ATTRIBUTE_NAME = "IsArg"; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariableContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariableContainer.java index 6932a80b33..18b97f14c2 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariableContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocalVariableContainer.java @@ -23,7 +23,13 @@ import com.sun.jdi.LocalVariable; import ghidra.async.AsyncFence; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.*; +@TargetObjectSchemaInfo(name = "LocalVariableContainer", elements = { // + @TargetElementType(type = JdiModelTargetLocalVariable.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetLocalVariableContainer extends JdiModelTargetObjectImpl { private List vars; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocation.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocation.java index da40f329d6..9383f9900a 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocation.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocation.java @@ -26,9 +26,19 @@ import com.sun.jdi.request.EventRequestManager; import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.*; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressRange; +@TargetObjectSchemaInfo(name = "Location", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(name = "Method", type = String.class, required = true, fixed = true), // + @TargetAttributeType(name = "Line", type = Integer.class, required = true, fixed = true), // + @TargetAttributeType(name = "Index", type = Long.class, required = true, fixed = true), // + @TargetAttributeType(name = "Address", type = String.class, required = true, fixed = true), // + @TargetAttributeType(type = Object.class) // +}) public class JdiModelTargetLocation extends JdiModelTargetObjectImpl { public static String getUniqueId(Location obj) { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocationContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocationContainer.java index 01ad6b5d9b..2adbe737e7 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocationContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetLocationContainer.java @@ -23,7 +23,13 @@ import com.sun.jdi.Location; import ghidra.async.AsyncFence; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.*; +@TargetObjectSchemaInfo(name = "LocationContainer", elements = { // + @TargetElementType(type = JdiModelTargetLocation.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetLocationContainer extends JdiModelTargetObjectImpl { private List locations; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethod.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethod.java index 765f9ae183..a4a373ab89 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethod.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethod.java @@ -21,7 +21,15 @@ import java.util.concurrent.CompletableFuture; import com.sun.jdi.*; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.TargetAttributeType; +import ghidra.dbg.target.schema.TargetObjectSchemaInfo; +@TargetObjectSchemaInfo(name = "Method", elements = { // + //@TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), // + @TargetAttributeType(type = Object.class) // +}) public class JdiModelTargetMethod extends JdiModelTargetObjectImpl { protected final Method method; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethodContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethodContainer.java index 8ff177a765..41bbcb07b9 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethodContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetMethodContainer.java @@ -22,7 +22,13 @@ import java.util.stream.Collectors; import com.sun.jdi.Method; import ghidra.async.AsyncFence; +import ghidra.dbg.target.schema.*; +@TargetObjectSchemaInfo(name = "TargetMethodContainer", elements = { // + @TargetElementType(type = JdiModelTargetMethod.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetMethodContainer extends JdiModelTargetObjectImpl { protected final JdiModelTargetReferenceType reftype; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModule.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModule.java index f3fcc5fa19..257d2f0f33 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModule.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModule.java @@ -21,6 +21,13 @@ import java.util.concurrent.CompletableFuture; import com.sun.jdi.ModuleReference; +import ghidra.dbg.target.schema.*; + +@TargetObjectSchemaInfo(name = "Module", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}) public class JdiModelTargetModule extends JdiModelTargetObjectReference { public static String getUniqueId(ModuleReference module) { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java index 4deccb3bf2..077f0d510c 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java @@ -26,9 +26,15 @@ import ghidra.async.AsyncUtils; import ghidra.dbg.error.DebuggerUserException; import ghidra.dbg.target.TargetModule; import ghidra.dbg.target.TargetModuleContainer; +import ghidra.dbg.target.schema.*; import ghidra.lifecycle.Internal; import ghidra.util.Msg; +@TargetObjectSchemaInfo(name = "TargetModuleContainer", elements = { // + @TargetElementType(type = JdiModelTargetModule.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetModuleContainer extends JdiModelTargetObjectImpl implements TargetModuleContainer { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectImpl.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectImpl.java index 964d367d3c..bd0dbf8232 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectImpl.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectImpl.java @@ -46,7 +46,7 @@ public class JdiModelTargetObjectImpl extends private boolean modified; public JdiModelTargetObjectImpl(JdiModelTargetObject parent, String id) { - super(parent.getModel(), parent, id, "Object", null); + super(parent.getModel(), parent, id, "Object"); this.impl = parent.getModelImpl(); this.mirror = (Mirror) parent.getObject(); this.object = null; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReference.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReference.java index c0bea1f9fd..f24792ab6e 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReference.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReference.java @@ -22,7 +22,15 @@ import java.util.concurrent.CompletableFuture; import com.sun.jdi.*; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.TargetAttributeType; +import ghidra.dbg.target.schema.TargetObjectSchemaInfo; +@TargetObjectSchemaInfo(name = "ObjectReference", elements = { // + //@TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(name = "UID", type = Long.class, required = true, fixed = true), // + @TargetAttributeType(type = Object.class) // +}) public class JdiModelTargetObjectReference extends JdiModelTargetValue { private static final long MAX_REFERRERS = 100; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReferenceContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReferenceContainer.java index b100cf1bdf..ffc793e60d 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReferenceContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetObjectReferenceContainer.java @@ -23,7 +23,13 @@ import com.sun.jdi.ObjectReference; import ghidra.async.AsyncFence; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.*; +@TargetObjectSchemaInfo(name = "TargetObjectReferenceContainer", elements = { // + @TargetElementType(type = JdiModelTargetObjectReference.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetObjectReferenceContainer extends JdiModelTargetObjectImpl { protected final List refs; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetProcess.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetProcess.java index 1068f57319..6e51a47430 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetProcess.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetProcess.java @@ -26,9 +26,16 @@ import ghidra.dbg.jdi.model.iface1.JdiModelTargetConsole; import ghidra.dbg.target.TargetConsole; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; import ghidra.dbg.target.TargetInterpreter.TargetInterpreterListener; +import ghidra.dbg.target.schema.*; import ghidra.lifecycle.Internal; import ghidra.util.Msg; +@TargetObjectSchemaInfo(name = "Process", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(name = "state", type = TargetExecutionState.class, hidden = true), // + @TargetAttributeType(type = Void.class) // +}) public class JdiModelTargetProcess extends JdiModelTargetObjectImpl implements // JdiModelTargetConsole, // JdiConsoleOutputListener, // @@ -38,7 +45,7 @@ public class JdiModelTargetProcess extends JdiModelTargetObjectImpl implements / return Long.toHexString(obj.pid()); } - String STATE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "state"; + static String STATE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "state"; protected final Process process; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java index d08055b7a4..f3def168c1 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java @@ -23,9 +23,17 @@ import com.sun.jdi.*; import ghidra.async.AsyncFence; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.TargetModule; +import ghidra.dbg.target.schema.TargetAttributeType; +import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressRangeImpl; +@TargetObjectSchemaInfo(name = "ReferenceType", elements = { // + //@TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), // + @TargetAttributeType(type = Object.class) // +}) public class JdiModelTargetReferenceType extends JdiModelTargetType implements // TargetModule { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java index 969860a944..0889aca652 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java @@ -23,9 +23,19 @@ import com.sun.jdi.Location; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.TargetRegister; +import ghidra.dbg.target.schema.TargetAttributeType; +import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.dbg.util.ConversionUtils; import ghidra.program.model.address.Address; +@TargetObjectSchemaInfo(name = "RegisterDescriptor", elements = { // + //@TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType( // + name = TargetRegister.CONTAINER_ATTRIBUTE_NAME, // + type = JdiModelTargetRegisterContainer.class), // + @TargetAttributeType(type = Void.class) // +}) public class JdiModelTargetRegister extends JdiModelTargetObjectImpl implements // TargetRegister { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java index daa1358d8f..2e8e72ebc4 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java @@ -23,8 +23,14 @@ import com.sun.jdi.Location; import ghidra.async.AsyncUtils; import ghidra.dbg.target.TargetRegisterBank; import ghidra.dbg.target.TargetRegisterContainer; +import ghidra.dbg.target.schema.*; import ghidra.util.Msg; +@TargetObjectSchemaInfo(name = "TargetRegisterContainer", elements = { // + @TargetElementType(type = JdiModelTargetRegister.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetRegisterContainer extends JdiModelTargetObjectImpl implements TargetRegisterBank, TargetRegisterContainer { @@ -45,19 +51,21 @@ public class JdiModelTargetRegisterContainer extends JdiModelTargetObjectImpl registersByName.put(pc.getName(), pc); registersByName.put(sp.getName(), sp); registersByName.put(retAddr.getName(), retAddr); - changeAttributes(List.of(), List.of( // + changeElements(List.of(), List.of( // pc, // sp, // retAddr // - ), Map.of( // + ), "Initialized"); + changeAttributes(List.of(), List.of(), Map.of( // DISPLAY_ATTRIBUTE_NAME, getName(), // DESCRIPTIONS_ATTRIBUTE_NAME, this // ), "Initialized"); } + /* @Override public CompletableFuture requestAttributes(boolean refresh) { - + changeAttributes(List.of(), List.of( // pc, // sp, // @@ -66,9 +74,10 @@ public class JdiModelTargetRegisterContainer extends JdiModelTargetObjectImpl DISPLAY_ATTRIBUTE_NAME, getName(), // DESCRIPTIONS_ATTRIBUTE_NAME, this // ), "Initialized"); - + return CompletableFuture.completedFuture(null); } + */ protected synchronized JdiModelTargetRegister getTargetRegister(String rname) { return registersByName.computeIfAbsent(rname, n -> new JdiModelTargetRegister(this, rname)); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRoot.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRoot.java index dc0b986ebc..e250e892ac 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRoot.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRoot.java @@ -34,6 +34,7 @@ import ghidra.dbg.jdi.model.iface1.*; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetMethod.TargetParameterMap; +import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.util.Msg; @@ -47,6 +48,14 @@ import ghidra.util.Msg; * {@link DebugModelConventions#findSuitable(Class, TargetObject)} requires a unique answer. That * would mean neither attach nor launch will be enabled anywhere except on a connector.... */ +@TargetObjectSchemaInfo(name = "Debugger", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class, required = true, fixed = true), // + @TargetAttributeType(name = "Connectors", type = JdiModelTargetConnectorContainer.class, required = true, fixed = true), // + @TargetAttributeType(name = "VirtualMachines", type = JdiModelTargetVMContainer.class, required = true, fixed = true), // + @TargetAttributeType(type = Void.class) // +}) public class JdiModelTargetRoot extends DefaultTargetModelRoot implements // JdiModelTargetAccessConditioned, // //JdiModelTargetAttacher, // @@ -72,8 +81,8 @@ public class JdiModelTargetRoot extends DefaultTargetModelRoot implements // protected String debugger = "Jdi"; // Used by JdiModelTargetEnvironment - public JdiModelTargetRoot(JdiModelImpl impl) { - super(impl, "VirtualMachineManager"); + public JdiModelTargetRoot(JdiModelImpl impl, TargetObjectSchema schema) { + super(impl, "VirtualMachineManager", schema); this.impl = impl; this.vmm = this.impl.getManager().getVirtualMachineManager(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java index 0d2daa731f..3258ba9301 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java @@ -23,8 +23,14 @@ import com.sun.jdi.Method; import ghidra.dbg.target.TargetMemoryRegion; import ghidra.dbg.target.TargetSection; +import ghidra.dbg.target.schema.*; import ghidra.program.model.address.AddressRange; +@TargetObjectSchemaInfo(name = "Section", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}) public class JdiModelTargetSection extends JdiModelTargetObjectImpl implements // //TargetMemory, TargetMemoryRegion, TargetSection { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java index 911a6e9578..d019a83b40 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java @@ -22,9 +22,15 @@ import com.sun.jdi.Method; import ghidra.async.AsyncFence; import ghidra.dbg.target.TargetMemory; +import ghidra.dbg.target.schema.*; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressSpace; +@TargetObjectSchemaInfo(name = "TargetSectionContainer", elements = { // + @TargetElementType(type = JdiModelTargetSection.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetSectionContainer extends JdiModelTargetObjectImpl implements TargetMemory { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java index a4c9ac0aae..5f1198c8a9 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java @@ -22,9 +22,15 @@ import com.sun.jdi.*; import ghidra.async.AsyncUtils; import ghidra.dbg.target.TargetStack; +import ghidra.dbg.target.schema.*; import ghidra.util.Msg; import ghidra.util.datastruct.WeakValueHashMap; +@TargetObjectSchemaInfo(name = "Stack", elements = { // + @TargetElementType(type = JdiModelTargetStackFrame.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetStack extends JdiModelTargetObjectImpl implements TargetStack { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java index bee1ecd3fb..e0ecc069ec 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java @@ -30,9 +30,16 @@ import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter; import ghidra.dbg.jdi.model.iface1.JdiModelSelectableObject; import ghidra.dbg.jdi.model.iface1.JdiModelTargetFocusScope; import ghidra.dbg.target.TargetStackFrame; +import ghidra.dbg.target.schema.TargetAttributeType; +import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.program.model.address.Address; import ghidra.util.Msg; +@TargetObjectSchemaInfo(name = "StackFrame", elements = { // + //@TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(type = Object.class) // +}) public class JdiModelTargetStackFrame extends JdiModelTargetObjectImpl implements TargetStackFrame, // //TargetRegisterBank, // diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java index dc7e27d155..33f224b461 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java @@ -30,9 +30,20 @@ import ghidra.dbg.jdi.manager.*; import ghidra.dbg.jdi.model.iface1.*; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.TargetThread; +import ghidra.dbg.target.schema.TargetAttributeType; +import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.lifecycle.Internal; import ghidra.util.Msg; +@TargetObjectSchemaInfo(name = "Thread", elements = { // + //@TargetElementType(type = TargetObject.class) // +}, attributes = { // + @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), // + @TargetAttributeType(name = "Registers", type = JdiModelTargetRegisterContainer.class, required = true, fixed = true), // + @TargetAttributeType(name = "Stack", type = JdiModelTargetStack.class, required = true, fixed = true), // + @TargetAttributeType(name = "Status", type = Integer.class), // + @TargetAttributeType(type = Object.class) // +}, canonicalContainer = true) public class JdiModelTargetThread extends JdiModelTargetObjectReference implements // TargetThread, // JdiModelTargetAccessConditioned, // diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java index a5fc83ac8d..a445fcdb39 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java @@ -27,8 +27,14 @@ import ghidra.dbg.jdi.manager.*; import ghidra.dbg.jdi.model.iface1.JdiModelTargetEventScope; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; +import ghidra.dbg.target.schema.*; import ghidra.util.datastruct.WeakValueHashMap; +@TargetObjectSchemaInfo(name = "ThreadContainer", elements = { // + @TargetElementType(type = JdiModelTargetThread.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetThreadContainer extends JdiModelTargetObjectImpl implements // JdiModelTargetEventScope, // JdiEventsListenerAdapter { @@ -42,7 +48,9 @@ public class JdiModelTargetThreadContainer extends JdiModelTargetObjectImpl impl super(object, name); this.threads = threads; - impl.getManager().addEventsListener(targetVM.vm, this); + if (targetVM != null) { + impl.getManager().addEventsListener(targetVM.vm, this); + } } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadGroupContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadGroupContainer.java index 9001b4d2ef..86c54c223e 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadGroupContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadGroupContainer.java @@ -24,9 +24,15 @@ import com.sun.jdi.ThreadGroupReference; import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.util.datastruct.WeakValueHashMap; +@TargetObjectSchemaInfo(name = "ThreadGroupContainer", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(type = JdiModelTargetThreadGroupContainer.class) // +}, canonicalContainer = true) public class JdiModelTargetThreadGroupContainer extends JdiModelTargetObjectImpl implements JdiEventsListenerAdapter { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetType.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetType.java index fc8e97ea22..d7846df90d 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetType.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetType.java @@ -21,7 +21,15 @@ import java.util.Map; import com.sun.jdi.Type; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.TargetAttributeType; +import ghidra.dbg.target.schema.TargetObjectSchemaInfo; +@TargetObjectSchemaInfo(name = "Type", elements = { // + //@TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(name = "Signature", type = String.class), // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetType extends JdiModelTargetObjectImpl { protected final Type type; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetTypeContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetTypeContainer.java index 7ec0fe6cc4..6917df0ce9 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetTypeContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetTypeContainer.java @@ -23,7 +23,13 @@ import com.sun.jdi.Type; import ghidra.async.AsyncFence; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.*; +@TargetObjectSchemaInfo(name = "TargetTypeContainer", elements = { // + @TargetElementType(type = JdiModelTargetType.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetTypeContainer extends JdiModelTargetObjectImpl { private List types; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java index 248b9504b1..90db34725b 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java @@ -35,6 +35,8 @@ import ghidra.dbg.jdi.model.iface1.*; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetMethod.TargetParameterMap; +import ghidra.dbg.target.schema.TargetAttributeType; +import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.lifecycle.Internal; /** @@ -43,6 +45,13 @@ import ghidra.lifecycle.Internal; * TODO: Implementing {@link TargetLauncher} here doesn't seem right. While it's convenient from a * UI perspective, it doesn't make sense semantically. */ +@TargetObjectSchemaInfo(name = "VM", elements = { // +// @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), // + @TargetAttributeType(name = "Threads", type = JdiModelTargetThreadContainer.class, required = true, fixed = true), // + @TargetAttributeType(type = Object.class) // +}, canonicalContainer = true) public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements // TargetProcess, // TargetAggregate, // @@ -57,7 +66,7 @@ public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements // JdiEventsListenerAdapter, // JdiModelSelectableObject { - public static final String PID_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "pid"; + public static final String ID_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "id"; public static final String EXIT_CODE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "exit_code"; protected final VirtualMachine vm; @@ -256,7 +265,7 @@ public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements // if (id != null) { changeAttributes(List.of(), List.of(), Map.of( // STATE_ATTRIBUTE_NAME, TargetExecutionState.ALIVE, // - PID_ATTRIBUTE_NAME, id, // + ID_ATTRIBUTE_NAME, id, // DISPLAY_ATTRIBUTE_NAME, updateDisplay() // ), "Started"); } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVMContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVMContainer.java index f6e1492889..17f1692528 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVMContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVMContainer.java @@ -28,9 +28,15 @@ import ghidra.dbg.jdi.manager.JdiCause; import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter; import ghidra.dbg.target.TargetEventScope.TargetEventScopeListener; import ghidra.dbg.target.TargetEventScope.TargetEventType; +import ghidra.dbg.target.schema.*; import ghidra.util.Msg; import ghidra.util.datastruct.WeakValueHashMap; +@TargetObjectSchemaInfo(name = "VMContainer", elements = { // + @TargetElementType(type = JdiModelTargetVM.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetVMContainer extends JdiModelTargetObjectImpl implements JdiEventsListenerAdapter { diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValue.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValue.java index 4b6b9742ed..e0ed8c632c 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValue.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValue.java @@ -15,10 +15,17 @@ */ package ghidra.dbg.jdi.model; -import com.sun.jdi.*; +import com.sun.jdi.Type; +import com.sun.jdi.Value; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.*; +@TargetObjectSchemaInfo(name = "Value", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetValue extends JdiModelTargetObjectImpl { protected final Value value; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueContainer.java index af66e19703..b112653256 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueContainer.java @@ -23,7 +23,13 @@ import com.sun.jdi.Value; import ghidra.async.AsyncFence; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.*; +@TargetObjectSchemaInfo(name = "TargetValueContainer", elements = { // + @TargetElementType(type = JdiModelTargetValue.class) // +}, attributes = { // + @TargetAttributeType(type = Void.class) // +}, canonicalContainer = true) public class JdiModelTargetValueContainer extends JdiModelTargetObjectImpl { private List values; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueMap.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueMap.java index 11e00d63fd..0bfffe2673 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueMap.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetValueMap.java @@ -23,7 +23,13 @@ import com.sun.jdi.Value; import ghidra.async.AsyncFence; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; +import ghidra.dbg.target.schema.*; +@TargetObjectSchemaInfo(name = "TargetValueMap", elements = { // + @TargetElementType(type = Void.class) // +}, attributes = { // + @TargetAttributeType(type = JdiModelTargetValue.class) // +}, canonicalContainer = true) public class JdiModelTargetValueMap extends JdiModelTargetObjectImpl { private Map values;