mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 10:49:34 +02:00
GP-574: Schema implementation for JDI
This commit is contained in:
parent
b5070847d1
commit
dd041fbe8f
42 changed files with 345 additions and 50 deletions
|
@ -61,7 +61,7 @@ public class DbgModelTargetAvailableImpl extends DbgModelTargetObjectImpl
|
||||||
this.pid = pid;
|
this.pid = pid;
|
||||||
|
|
||||||
this.changeAttributes(List.of(), List.of(), Map.of(//
|
this.changeAttributes(List.of(), List.of(), Map.of(//
|
||||||
PID_ATTRIBUTE_NAME, pid, //
|
PID_ATTRIBUTE_NAME, (long) pid, //
|
||||||
DISPLAY_ATTRIBUTE_NAME, keyAttachable(pid), //
|
DISPLAY_ATTRIBUTE_NAME, keyAttachable(pid), //
|
||||||
UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED //
|
UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED //
|
||||||
), "Initialized");
|
), "Initialized");
|
||||||
|
|
|
@ -25,6 +25,8 @@ import ghidra.async.AsyncUtils;
|
||||||
import ghidra.dbg.agent.AbstractDebuggerObjectModel;
|
import ghidra.dbg.agent.AbstractDebuggerObjectModel;
|
||||||
import ghidra.dbg.jdi.manager.JdiManager;
|
import ghidra.dbg.jdi.manager.JdiManager;
|
||||||
import ghidra.dbg.target.TargetObject;
|
import ghidra.dbg.target.TargetObject;
|
||||||
|
import ghidra.dbg.target.schema.AnnotatedSchemaContext;
|
||||||
|
import ghidra.dbg.target.schema.TargetObjectSchema;
|
||||||
import ghidra.program.model.address.*;
|
import ghidra.program.model.address.*;
|
||||||
|
|
||||||
public class JdiModelImpl extends AbstractDebuggerObjectModel {
|
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 BLOCK_SIZE = 0x1000L;
|
||||||
public static final long DEFAULT_SECTION = 0x0000L;
|
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 JdiManager jdi;
|
||||||
protected final AddressSpace ram = new GenericAddressSpace("ram", 64, AddressSpace.TYPE_RAM, 0);
|
protected final AddressSpace ram = new GenericAddressSpace("ram", 64, AddressSpace.TYPE_RAM, 0);
|
||||||
protected Long ramIndex = Long.valueOf(0x1000L);
|
protected Long ramIndex = Long.valueOf(0x1000L);
|
||||||
|
@ -51,7 +57,9 @@ public class JdiModelImpl extends AbstractDebuggerObjectModel {
|
||||||
|
|
||||||
public JdiModelImpl() {
|
public JdiModelImpl() {
|
||||||
this.jdi = JdiManager.newInstance();
|
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);
|
this.completedRoot = CompletableFuture.completedFuture(root);
|
||||||
|
|
||||||
Address start = ram.getAddress(0L);
|
Address start = ram.getAddress(0L);
|
||||||
|
@ -106,44 +114,46 @@ public class JdiModelImpl extends AbstractDebuggerObjectModel {
|
||||||
JdiModelTargetVM targetVM = getTargetVM(declaringType);
|
JdiModelTargetVM targetVM = getTargetVM(declaringType);
|
||||||
JdiModelTargetReferenceType classRef =
|
JdiModelTargetReferenceType classRef =
|
||||||
(JdiModelTargetReferenceType) targetVM.getTargetObject(declaringType);
|
(JdiModelTargetReferenceType) targetVM.getTargetObject(declaringType);
|
||||||
JdiModelTargetSectionContainer sectionContainer = classRef.sections;
|
if (classRef != null) {
|
||||||
for (Method m : declaringType.methods()) {
|
JdiModelTargetSectionContainer sectionContainer = classRef.sections;
|
||||||
if (m.location() != null && targetVM.vm.canGetBytecodes()) {
|
for (Method m : declaringType.methods()) {
|
||||||
byte[] bytecodes = m.bytecodes();
|
if (m.location() != null && targetVM.vm.canGetBytecodes()) {
|
||||||
int length = bytecodes.length;
|
byte[] bytecodes = m.bytecodes();
|
||||||
if (length > 0) {
|
int length = bytecodes.length;
|
||||||
synchronized (ramIndex) {
|
if (length > 0) {
|
||||||
Address start = ram.getAddress(ramIndex);
|
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 =
|
AddressRangeImpl range =
|
||||||
new AddressRangeImpl(start, start.add(BLOCK_SIZE - 1));
|
new AddressRangeImpl(start, start.add(BLOCK_SIZE - 1));
|
||||||
String key = methodToKey(m);
|
String key = methodToKey(m);
|
||||||
if (addressRangeByMethod.containsKey(key)) {
|
if (addressRangeByMethod.containsKey(key)) {
|
||||||
System.err.println("non-null location: " + m.location() +
|
throw new RuntimeException("non-null location: " +
|
||||||
" with " + length + " bytes");
|
m.location() + " with " + length + " bytes");
|
||||||
//throw new RuntimeException("non-null location: " +
|
|
||||||
// m.location() + " with " + length + " bytes");
|
|
||||||
}
|
}
|
||||||
addressRangeByMethod.put(key, range);
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,9 +20,13 @@ import java.util.Map;
|
||||||
|
|
||||||
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
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
|
public class JdiModelTargetAttributesContainer extends JdiModelTargetObjectImpl
|
||||||
implements JdiEventsListenerAdapter {
|
implements JdiEventsListenerAdapter {
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,15 @@ import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||||
import ghidra.dbg.target.TargetBreakpointContainer;
|
import ghidra.dbg.target.TargetBreakpointContainer;
|
||||||
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
|
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.program.model.address.AddressRange;
|
import ghidra.program.model.address.AddressRange;
|
||||||
import ghidra.util.datastruct.WeakValueHashMap;
|
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
|
public class JdiModelTargetBreakpointContainer extends JdiModelTargetObjectImpl implements
|
||||||
TargetBreakpointContainer<JdiModelTargetBreakpointContainer>, JdiEventsListenerAdapter {
|
TargetBreakpointContainer<JdiModelTargetBreakpointContainer>, JdiEventsListenerAdapter {
|
||||||
|
|
||||||
|
|
|
@ -21,10 +21,22 @@ import java.util.concurrent.CompletableFuture;
|
||||||
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
|
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
|
||||||
import ghidra.dbg.jdi.model.iface1.JdiModelTargetDeletable;
|
import ghidra.dbg.jdi.model.iface1.JdiModelTargetDeletable;
|
||||||
import ghidra.dbg.target.TargetBreakpointContainer.TargetBreakpointKindSet;
|
import ghidra.dbg.target.TargetBreakpointContainer.TargetBreakpointKindSet;
|
||||||
|
import ghidra.dbg.target.TargetBreakpointLocation;
|
||||||
import ghidra.dbg.target.TargetBreakpointSpec;
|
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.dbg.util.CollectionUtils.Delta;
|
||||||
import ghidra.util.datastruct.ListenerSet;
|
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 //
|
public class JdiModelTargetBreakpointSpec extends JdiModelTargetObjectImpl implements //
|
||||||
TargetBreakpointSpec<JdiModelTargetBreakpointSpec>, //
|
TargetBreakpointSpec<JdiModelTargetBreakpointSpec>, //
|
||||||
JdiModelTargetDeletable<JdiModelTargetBreakpointSpec> {
|
JdiModelTargetDeletable<JdiModelTargetBreakpointSpec> {
|
||||||
|
|
|
@ -23,8 +23,14 @@ import com.sun.jdi.ReferenceType;
|
||||||
|
|
||||||
import ghidra.async.AsyncFence;
|
import ghidra.async.AsyncFence;
|
||||||
import ghidra.async.AsyncUtils;
|
import ghidra.async.AsyncUtils;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
|
|
||||||
|
@TargetObjectSchemaInfo(name = "ClassContainer", elements = { //
|
||||||
|
@TargetElementType(type = JdiModelTargetReferenceType.class) //
|
||||||
|
}, attributes = { //
|
||||||
|
@TargetAttributeType(type = Void.class) //
|
||||||
|
}, canonicalContainer = true)
|
||||||
public class JdiModelTargetClassContainer extends JdiModelTargetObjectImpl {
|
public class JdiModelTargetClassContainer extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
protected final JdiModelTargetVM vm;
|
protected final JdiModelTargetVM vm;
|
||||||
|
|
|
@ -27,7 +27,16 @@ import ghidra.dbg.jdi.model.iface1.JdiModelTargetLauncher;
|
||||||
import ghidra.dbg.target.TargetMethod;
|
import ghidra.dbg.target.TargetMethod;
|
||||||
import ghidra.dbg.target.TargetMethod.ParameterDescription;
|
import ghidra.dbg.target.TargetMethod.ParameterDescription;
|
||||||
import ghidra.dbg.target.TargetMethod.TargetParameterMap;
|
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
|
public class JdiModelTargetConnector extends JdiModelTargetObjectImpl
|
||||||
implements JdiModelSelectableObject,
|
implements JdiModelSelectableObject,
|
||||||
// TODO: Make a JidModelTargetLaunchingConnector and JdiModelTargetAttachingConnector
|
// TODO: Make a JidModelTargetLaunchingConnector and JdiModelTargetAttachingConnector
|
||||||
|
@ -35,7 +44,7 @@ public class JdiModelTargetConnector extends JdiModelTargetObjectImpl
|
||||||
|
|
||||||
protected final JdiModelTargetConnectorContainer connectors;
|
protected final JdiModelTargetConnectorContainer connectors;
|
||||||
protected final Connector cx;
|
protected final Connector cx;
|
||||||
protected final Map<String, ParameterDescription<?>> paramDescs;
|
protected final TargetParameterMap paramDescs;
|
||||||
|
|
||||||
public JdiModelTargetConnector(JdiModelTargetConnectorContainer connectors, Connector cx) {
|
public JdiModelTargetConnector(JdiModelTargetConnectorContainer connectors, Connector cx) {
|
||||||
super(connectors, cx.name(), cx);
|
super(connectors, cx.name(), cx);
|
||||||
|
@ -47,7 +56,8 @@ public class JdiModelTargetConnector extends JdiModelTargetObjectImpl
|
||||||
"Description", cx.description(), //
|
"Description", cx.description(), //
|
||||||
"Default Arguments", cx.defaultArguments(), //
|
"Default Arguments", cx.defaultArguments(), //
|
||||||
"Transport", cx.transport(), //
|
"Transport", cx.transport(), //
|
||||||
TargetMethod.PARAMETERS_ATTRIBUTE_NAME, paramDescs = computeParameters(), //
|
TargetMethod.PARAMETERS_ATTRIBUTE_NAME,
|
||||||
|
paramDescs = TargetParameterMap.copyOf(computeParameters()), //
|
||||||
UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED //
|
UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED //
|
||||||
), "Initialized");
|
), "Initialized");
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,14 @@ import com.sun.jdi.connect.Connector;
|
||||||
|
|
||||||
import ghidra.async.AsyncFence;
|
import ghidra.async.AsyncFence;
|
||||||
import ghidra.async.AsyncUtils;
|
import ghidra.async.AsyncUtils;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
|
|
||||||
|
@TargetObjectSchemaInfo(name = "ConnectorContainer", elements = { //
|
||||||
|
@TargetElementType(type = JdiModelTargetConnector.class) //
|
||||||
|
}, attributes = { //
|
||||||
|
@TargetAttributeType(type = Void.class) //
|
||||||
|
}, canonicalContainer = true)
|
||||||
public class JdiModelTargetConnectorContainer extends JdiModelTargetObjectImpl {
|
public class JdiModelTargetConnectorContainer extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
protected final JdiModelTargetRoot root;
|
protected final JdiModelTargetRoot root;
|
||||||
|
|
|
@ -21,8 +21,14 @@ import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
import ghidra.dbg.target.TargetMemoryRegion;
|
import ghidra.dbg.target.TargetMemoryRegion;
|
||||||
import ghidra.dbg.target.TargetSection;
|
import ghidra.dbg.target.TargetSection;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.program.model.address.AddressRange;
|
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 //
|
public class JdiModelTargetConstantPool extends JdiModelTargetObjectImpl implements //
|
||||||
//TargetMemory<JdiModelTargetSection>,
|
//TargetMemory<JdiModelTargetSection>,
|
||||||
TargetMemoryRegion<JdiModelTargetConstantPool>, TargetSection<JdiModelTargetConstantPool> {
|
TargetMemoryRegion<JdiModelTargetConstantPool>, TargetSection<JdiModelTargetConstantPool> {
|
||||||
|
@ -40,7 +46,8 @@ public class JdiModelTargetConstantPool extends JdiModelTargetObjectImpl impleme
|
||||||
DISPLAY_ATTRIBUTE_NAME, getDisplay(), //
|
DISPLAY_ATTRIBUTE_NAME, getDisplay(), //
|
||||||
MODULE_ATTRIBUTE_NAME, parent.getClassType(), //
|
MODULE_ATTRIBUTE_NAME, parent.getClassType(), //
|
||||||
READABLE_ATTRIBUTE_NAME, true, //
|
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 //
|
UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED //
|
||||||
), "Initialized");
|
), "Initialized");
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,10 +23,15 @@ import com.sun.jdi.ThreadGroupReference;
|
||||||
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||||
import ghidra.dbg.target.TargetObject;
|
import ghidra.dbg.target.TargetObject;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.dbg.util.PathUtils;
|
import ghidra.dbg.util.PathUtils;
|
||||||
import ghidra.util.datastruct.WeakValueHashMap;
|
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
|
public class JdiModelTargetElementsContainer extends JdiModelTargetObjectImpl
|
||||||
implements JdiEventsListenerAdapter {
|
implements JdiEventsListenerAdapter {
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,15 @@ import com.sun.jdi.request.*;
|
||||||
|
|
||||||
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
|
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
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 {
|
public class JdiModelTargetField extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
protected final Field field;
|
protected final Field field;
|
||||||
|
|
|
@ -22,7 +22,13 @@ import java.util.stream.Collectors;
|
||||||
import com.sun.jdi.Field;
|
import com.sun.jdi.Field;
|
||||||
|
|
||||||
import ghidra.async.AsyncFence;
|
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 {
|
public class JdiModelTargetFieldContainer extends JdiModelTargetObjectImpl {
|
||||||
// NOTE: -file-list-shared-libraries omits the main module and system-supplied DSO.
|
// NOTE: -file-list-shared-libraries omits the main module and system-supplied DSO.
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,17 @@ import java.util.concurrent.CompletableFuture;
|
||||||
import com.sun.jdi.ClassNotLoadedException;
|
import com.sun.jdi.ClassNotLoadedException;
|
||||||
import com.sun.jdi.LocalVariable;
|
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 {
|
public class JdiModelTargetLocalVariable extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
String IS_ARGUMENT_ATTRIBUTE_NAME = "IsArg";
|
String IS_ARGUMENT_ATTRIBUTE_NAME = "IsArg";
|
||||||
|
|
|
@ -23,7 +23,13 @@ import com.sun.jdi.LocalVariable;
|
||||||
|
|
||||||
import ghidra.async.AsyncFence;
|
import ghidra.async.AsyncFence;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
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 {
|
public class JdiModelTargetLocalVariableContainer extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
private List<LocalVariable> vars;
|
private List<LocalVariable> vars;
|
||||||
|
|
|
@ -26,9 +26,19 @@ import com.sun.jdi.request.EventRequestManager;
|
||||||
|
|
||||||
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
|
import ghidra.dbg.jdi.manager.breakpoint.JdiBreakpointInfo;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
import ghidra.program.model.address.AddressRange;
|
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 class JdiModelTargetLocation extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
public static String getUniqueId(Location obj) {
|
public static String getUniqueId(Location obj) {
|
||||||
|
|
|
@ -23,7 +23,13 @@ import com.sun.jdi.Location;
|
||||||
|
|
||||||
import ghidra.async.AsyncFence;
|
import ghidra.async.AsyncFence;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
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 {
|
public class JdiModelTargetLocationContainer extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
private List<Location> locations;
|
private List<Location> locations;
|
||||||
|
|
|
@ -21,7 +21,15 @@ import java.util.concurrent.CompletableFuture;
|
||||||
import com.sun.jdi.*;
|
import com.sun.jdi.*;
|
||||||
|
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
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 {
|
public class JdiModelTargetMethod extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
protected final Method method;
|
protected final Method method;
|
||||||
|
|
|
@ -22,7 +22,13 @@ import java.util.stream.Collectors;
|
||||||
import com.sun.jdi.Method;
|
import com.sun.jdi.Method;
|
||||||
|
|
||||||
import ghidra.async.AsyncFence;
|
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 {
|
public class JdiModelTargetMethodContainer extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
protected final JdiModelTargetReferenceType reftype;
|
protected final JdiModelTargetReferenceType reftype;
|
||||||
|
|
|
@ -21,6 +21,13 @@ import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
import com.sun.jdi.ModuleReference;
|
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 class JdiModelTargetModule extends JdiModelTargetObjectReference {
|
||||||
|
|
||||||
public static String getUniqueId(ModuleReference module) {
|
public static String getUniqueId(ModuleReference module) {
|
||||||
|
|
|
@ -26,9 +26,15 @@ import ghidra.async.AsyncUtils;
|
||||||
import ghidra.dbg.error.DebuggerUserException;
|
import ghidra.dbg.error.DebuggerUserException;
|
||||||
import ghidra.dbg.target.TargetModule;
|
import ghidra.dbg.target.TargetModule;
|
||||||
import ghidra.dbg.target.TargetModuleContainer;
|
import ghidra.dbg.target.TargetModuleContainer;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.lifecycle.Internal;
|
import ghidra.lifecycle.Internal;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
|
|
||||||
|
@TargetObjectSchemaInfo(name = "TargetModuleContainer", elements = { //
|
||||||
|
@TargetElementType(type = JdiModelTargetModule.class) //
|
||||||
|
}, attributes = { //
|
||||||
|
@TargetAttributeType(type = Void.class) //
|
||||||
|
}, canonicalContainer = true)
|
||||||
public class JdiModelTargetModuleContainer extends JdiModelTargetObjectImpl
|
public class JdiModelTargetModuleContainer extends JdiModelTargetObjectImpl
|
||||||
implements TargetModuleContainer<JdiModelTargetModuleContainer> {
|
implements TargetModuleContainer<JdiModelTargetModuleContainer> {
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ public class JdiModelTargetObjectImpl extends
|
||||||
private boolean modified;
|
private boolean modified;
|
||||||
|
|
||||||
public JdiModelTargetObjectImpl(JdiModelTargetObject parent, String id) {
|
public JdiModelTargetObjectImpl(JdiModelTargetObject parent, String id) {
|
||||||
super(parent.getModel(), parent, id, "Object", null);
|
super(parent.getModel(), parent, id, "Object");
|
||||||
this.impl = parent.getModelImpl();
|
this.impl = parent.getModelImpl();
|
||||||
this.mirror = (Mirror) parent.getObject();
|
this.mirror = (Mirror) parent.getObject();
|
||||||
this.object = null;
|
this.object = null;
|
||||||
|
|
|
@ -22,7 +22,15 @@ import java.util.concurrent.CompletableFuture;
|
||||||
import com.sun.jdi.*;
|
import com.sun.jdi.*;
|
||||||
|
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
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 {
|
public class JdiModelTargetObjectReference extends JdiModelTargetValue {
|
||||||
|
|
||||||
private static final long MAX_REFERRERS = 100;
|
private static final long MAX_REFERRERS = 100;
|
||||||
|
|
|
@ -23,7 +23,13 @@ import com.sun.jdi.ObjectReference;
|
||||||
|
|
||||||
import ghidra.async.AsyncFence;
|
import ghidra.async.AsyncFence;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
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 {
|
public class JdiModelTargetObjectReferenceContainer extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
protected final List<ObjectReference> refs;
|
protected final List<ObjectReference> refs;
|
||||||
|
|
|
@ -26,9 +26,16 @@ import ghidra.dbg.jdi.model.iface1.JdiModelTargetConsole;
|
||||||
import ghidra.dbg.target.TargetConsole;
|
import ghidra.dbg.target.TargetConsole;
|
||||||
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
|
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
|
||||||
import ghidra.dbg.target.TargetInterpreter.TargetInterpreterListener;
|
import ghidra.dbg.target.TargetInterpreter.TargetInterpreterListener;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.lifecycle.Internal;
|
import ghidra.lifecycle.Internal;
|
||||||
import ghidra.util.Msg;
|
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 //
|
public class JdiModelTargetProcess extends JdiModelTargetObjectImpl implements //
|
||||||
JdiModelTargetConsole<JdiModelTargetProcess>, //
|
JdiModelTargetConsole<JdiModelTargetProcess>, //
|
||||||
JdiConsoleOutputListener, //
|
JdiConsoleOutputListener, //
|
||||||
|
@ -38,7 +45,7 @@ public class JdiModelTargetProcess extends JdiModelTargetObjectImpl implements /
|
||||||
return Long.toHexString(obj.pid());
|
return Long.toHexString(obj.pid());
|
||||||
}
|
}
|
||||||
|
|
||||||
String STATE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "state";
|
static String STATE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "state";
|
||||||
|
|
||||||
protected final Process process;
|
protected final Process process;
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,17 @@ import com.sun.jdi.*;
|
||||||
import ghidra.async.AsyncFence;
|
import ghidra.async.AsyncFence;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||||
import ghidra.dbg.target.TargetModule;
|
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.Address;
|
||||||
import ghidra.program.model.address.AddressRangeImpl;
|
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 //
|
public class JdiModelTargetReferenceType extends JdiModelTargetType implements //
|
||||||
TargetModule<JdiModelTargetReferenceType> {
|
TargetModule<JdiModelTargetReferenceType> {
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,19 @@ import com.sun.jdi.Location;
|
||||||
|
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||||
import ghidra.dbg.target.TargetRegister;
|
import ghidra.dbg.target.TargetRegister;
|
||||||
|
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||||
|
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
|
||||||
import ghidra.dbg.util.ConversionUtils;
|
import ghidra.dbg.util.ConversionUtils;
|
||||||
import ghidra.program.model.address.Address;
|
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 //
|
public class JdiModelTargetRegister extends JdiModelTargetObjectImpl implements //
|
||||||
TargetRegister<JdiModelTargetRegister> {
|
TargetRegister<JdiModelTargetRegister> {
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,14 @@ import com.sun.jdi.Location;
|
||||||
import ghidra.async.AsyncUtils;
|
import ghidra.async.AsyncUtils;
|
||||||
import ghidra.dbg.target.TargetRegisterBank;
|
import ghidra.dbg.target.TargetRegisterBank;
|
||||||
import ghidra.dbg.target.TargetRegisterContainer;
|
import ghidra.dbg.target.TargetRegisterContainer;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
|
|
||||||
|
@TargetObjectSchemaInfo(name = "TargetRegisterContainer", elements = { //
|
||||||
|
@TargetElementType(type = JdiModelTargetRegister.class) //
|
||||||
|
}, attributes = { //
|
||||||
|
@TargetAttributeType(type = Void.class) //
|
||||||
|
}, canonicalContainer = true)
|
||||||
public class JdiModelTargetRegisterContainer extends JdiModelTargetObjectImpl
|
public class JdiModelTargetRegisterContainer extends JdiModelTargetObjectImpl
|
||||||
implements TargetRegisterBank<JdiModelTargetRegisterContainer>,
|
implements TargetRegisterBank<JdiModelTargetRegisterContainer>,
|
||||||
TargetRegisterContainer<JdiModelTargetRegisterContainer> {
|
TargetRegisterContainer<JdiModelTargetRegisterContainer> {
|
||||||
|
@ -45,16 +51,18 @@ public class JdiModelTargetRegisterContainer extends JdiModelTargetObjectImpl
|
||||||
registersByName.put(pc.getName(), pc);
|
registersByName.put(pc.getName(), pc);
|
||||||
registersByName.put(sp.getName(), sp);
|
registersByName.put(sp.getName(), sp);
|
||||||
registersByName.put(retAddr.getName(), retAddr);
|
registersByName.put(retAddr.getName(), retAddr);
|
||||||
changeAttributes(List.of(), List.of( //
|
changeElements(List.of(), List.of( //
|
||||||
pc, //
|
pc, //
|
||||||
sp, //
|
sp, //
|
||||||
retAddr //
|
retAddr //
|
||||||
), Map.of( //
|
), "Initialized");
|
||||||
|
changeAttributes(List.of(), List.of(), Map.of( //
|
||||||
DISPLAY_ATTRIBUTE_NAME, getName(), //
|
DISPLAY_ATTRIBUTE_NAME, getName(), //
|
||||||
DESCRIPTIONS_ATTRIBUTE_NAME, this //
|
DESCRIPTIONS_ATTRIBUTE_NAME, this //
|
||||||
), "Initialized");
|
), "Initialized");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||||
|
|
||||||
|
@ -69,6 +77,7 @@ public class JdiModelTargetRegisterContainer extends JdiModelTargetObjectImpl
|
||||||
|
|
||||||
return CompletableFuture.completedFuture(null);
|
return CompletableFuture.completedFuture(null);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
protected synchronized JdiModelTargetRegister getTargetRegister(String rname) {
|
protected synchronized JdiModelTargetRegister getTargetRegister(String rname) {
|
||||||
return registersByName.computeIfAbsent(rname, n -> new JdiModelTargetRegister(this, rname));
|
return registersByName.computeIfAbsent(rname, n -> new JdiModelTargetRegister(this, rname));
|
||||||
|
|
|
@ -34,6 +34,7 @@ import ghidra.dbg.jdi.model.iface1.*;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||||
import ghidra.dbg.target.*;
|
import ghidra.dbg.target.*;
|
||||||
import ghidra.dbg.target.TargetMethod.TargetParameterMap;
|
import ghidra.dbg.target.TargetMethod.TargetParameterMap;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.dbg.util.PathUtils;
|
import ghidra.dbg.util.PathUtils;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
|
|
||||||
|
@ -47,6 +48,14 @@ import ghidra.util.Msg;
|
||||||
* {@link DebugModelConventions#findSuitable(Class, TargetObject)} requires a unique answer. That
|
* {@link DebugModelConventions#findSuitable(Class, TargetObject)} requires a unique answer. That
|
||||||
* would mean neither attach nor launch will be enabled anywhere except on a connector....
|
* 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 //
|
public class JdiModelTargetRoot extends DefaultTargetModelRoot implements //
|
||||||
JdiModelTargetAccessConditioned<JdiModelTargetRoot>, //
|
JdiModelTargetAccessConditioned<JdiModelTargetRoot>, //
|
||||||
//JdiModelTargetAttacher<JdiModelTargetRoot>, //
|
//JdiModelTargetAttacher<JdiModelTargetRoot>, //
|
||||||
|
@ -72,8 +81,8 @@ public class JdiModelTargetRoot extends DefaultTargetModelRoot implements //
|
||||||
|
|
||||||
protected String debugger = "Jdi"; // Used by JdiModelTargetEnvironment
|
protected String debugger = "Jdi"; // Used by JdiModelTargetEnvironment
|
||||||
|
|
||||||
public JdiModelTargetRoot(JdiModelImpl impl) {
|
public JdiModelTargetRoot(JdiModelImpl impl, TargetObjectSchema schema) {
|
||||||
super(impl, "VirtualMachineManager");
|
super(impl, "VirtualMachineManager", schema);
|
||||||
this.impl = impl;
|
this.impl = impl;
|
||||||
this.vmm = this.impl.getManager().getVirtualMachineManager();
|
this.vmm = this.impl.getManager().getVirtualMachineManager();
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,14 @@ import com.sun.jdi.Method;
|
||||||
|
|
||||||
import ghidra.dbg.target.TargetMemoryRegion;
|
import ghidra.dbg.target.TargetMemoryRegion;
|
||||||
import ghidra.dbg.target.TargetSection;
|
import ghidra.dbg.target.TargetSection;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.program.model.address.AddressRange;
|
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 //
|
public class JdiModelTargetSection extends JdiModelTargetObjectImpl implements //
|
||||||
//TargetMemory<JdiModelTargetSection>,
|
//TargetMemory<JdiModelTargetSection>,
|
||||||
TargetMemoryRegion<JdiModelTargetSection>, TargetSection<JdiModelTargetSection> {
|
TargetMemoryRegion<JdiModelTargetSection>, TargetSection<JdiModelTargetSection> {
|
||||||
|
|
|
@ -22,9 +22,15 @@ import com.sun.jdi.Method;
|
||||||
|
|
||||||
import ghidra.async.AsyncFence;
|
import ghidra.async.AsyncFence;
|
||||||
import ghidra.dbg.target.TargetMemory;
|
import ghidra.dbg.target.TargetMemory;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
import ghidra.program.model.address.AddressSpace;
|
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
|
public class JdiModelTargetSectionContainer extends JdiModelTargetObjectImpl
|
||||||
implements TargetMemory<JdiModelTargetSectionContainer> {
|
implements TargetMemory<JdiModelTargetSectionContainer> {
|
||||||
|
|
||||||
|
|
|
@ -22,9 +22,15 @@ import com.sun.jdi.*;
|
||||||
|
|
||||||
import ghidra.async.AsyncUtils;
|
import ghidra.async.AsyncUtils;
|
||||||
import ghidra.dbg.target.TargetStack;
|
import ghidra.dbg.target.TargetStack;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
import ghidra.util.datastruct.WeakValueHashMap;
|
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
|
public class JdiModelTargetStack extends JdiModelTargetObjectImpl
|
||||||
implements TargetStack<JdiModelTargetStack> {
|
implements TargetStack<JdiModelTargetStack> {
|
||||||
|
|
||||||
|
|
|
@ -30,9 +30,16 @@ import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
||||||
import ghidra.dbg.jdi.model.iface1.JdiModelSelectableObject;
|
import ghidra.dbg.jdi.model.iface1.JdiModelSelectableObject;
|
||||||
import ghidra.dbg.jdi.model.iface1.JdiModelTargetFocusScope;
|
import ghidra.dbg.jdi.model.iface1.JdiModelTargetFocusScope;
|
||||||
import ghidra.dbg.target.TargetStackFrame;
|
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.program.model.address.Address;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
|
|
||||||
|
@TargetObjectSchemaInfo(name = "StackFrame", elements = { //
|
||||||
|
//@TargetElementType(type = Void.class) //
|
||||||
|
}, attributes = { //
|
||||||
|
@TargetAttributeType(type = Object.class) //
|
||||||
|
})
|
||||||
public class JdiModelTargetStackFrame extends JdiModelTargetObjectImpl
|
public class JdiModelTargetStackFrame extends JdiModelTargetObjectImpl
|
||||||
implements TargetStackFrame<JdiModelTargetStackFrame>, //
|
implements TargetStackFrame<JdiModelTargetStackFrame>, //
|
||||||
//TargetRegisterBank<JdiModelTargetStackFrame>, //
|
//TargetRegisterBank<JdiModelTargetStackFrame>, //
|
||||||
|
|
|
@ -30,9 +30,20 @@ import ghidra.dbg.jdi.manager.*;
|
||||||
import ghidra.dbg.jdi.model.iface1.*;
|
import ghidra.dbg.jdi.model.iface1.*;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||||
import ghidra.dbg.target.TargetThread;
|
import ghidra.dbg.target.TargetThread;
|
||||||
|
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||||
|
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
|
||||||
import ghidra.lifecycle.Internal;
|
import ghidra.lifecycle.Internal;
|
||||||
import ghidra.util.Msg;
|
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 //
|
public class JdiModelTargetThread extends JdiModelTargetObjectReference implements //
|
||||||
TargetThread<JdiModelTargetThread>, //
|
TargetThread<JdiModelTargetThread>, //
|
||||||
JdiModelTargetAccessConditioned<JdiModelTargetThread>, //
|
JdiModelTargetAccessConditioned<JdiModelTargetThread>, //
|
||||||
|
|
|
@ -27,8 +27,14 @@ import ghidra.dbg.jdi.manager.*;
|
||||||
import ghidra.dbg.jdi.model.iface1.JdiModelTargetEventScope;
|
import ghidra.dbg.jdi.model.iface1.JdiModelTargetEventScope;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||||
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
|
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.util.datastruct.WeakValueHashMap;
|
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 //
|
public class JdiModelTargetThreadContainer extends JdiModelTargetObjectImpl implements //
|
||||||
JdiModelTargetEventScope<JdiModelTargetThreadContainer>, //
|
JdiModelTargetEventScope<JdiModelTargetThreadContainer>, //
|
||||||
JdiEventsListenerAdapter {
|
JdiEventsListenerAdapter {
|
||||||
|
@ -42,7 +48,9 @@ public class JdiModelTargetThreadContainer extends JdiModelTargetObjectImpl impl
|
||||||
super(object, name);
|
super(object, name);
|
||||||
this.threads = threads;
|
this.threads = threads;
|
||||||
|
|
||||||
impl.getManager().addEventsListener(targetVM.vm, this);
|
if (targetVM != null) {
|
||||||
|
impl.getManager().addEventsListener(targetVM.vm, this);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,9 +24,15 @@ import com.sun.jdi.ThreadGroupReference;
|
||||||
|
|
||||||
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.dbg.util.PathUtils;
|
import ghidra.dbg.util.PathUtils;
|
||||||
import ghidra.util.datastruct.WeakValueHashMap;
|
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
|
public class JdiModelTargetThreadGroupContainer extends JdiModelTargetObjectImpl
|
||||||
implements JdiEventsListenerAdapter {
|
implements JdiEventsListenerAdapter {
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,15 @@ import java.util.Map;
|
||||||
import com.sun.jdi.Type;
|
import com.sun.jdi.Type;
|
||||||
|
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
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 {
|
public class JdiModelTargetType extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
protected final Type type;
|
protected final Type type;
|
||||||
|
|
|
@ -23,7 +23,13 @@ import com.sun.jdi.Type;
|
||||||
|
|
||||||
import ghidra.async.AsyncFence;
|
import ghidra.async.AsyncFence;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
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 {
|
public class JdiModelTargetTypeContainer extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
private List<Type> types;
|
private List<Type> types;
|
||||||
|
|
|
@ -35,6 +35,8 @@ import ghidra.dbg.jdi.model.iface1.*;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
||||||
import ghidra.dbg.target.*;
|
import ghidra.dbg.target.*;
|
||||||
import ghidra.dbg.target.TargetMethod.TargetParameterMap;
|
import ghidra.dbg.target.TargetMethod.TargetParameterMap;
|
||||||
|
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||||
|
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
|
||||||
import ghidra.lifecycle.Internal;
|
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
|
* TODO: Implementing {@link TargetLauncher} here doesn't seem right. While it's convenient from a
|
||||||
* UI perspective, it doesn't make sense semantically.
|
* 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 //
|
public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements //
|
||||||
TargetProcess<JdiModelTargetVM>, //
|
TargetProcess<JdiModelTargetVM>, //
|
||||||
TargetAggregate, //
|
TargetAggregate, //
|
||||||
|
@ -57,7 +66,7 @@ public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements //
|
||||||
JdiEventsListenerAdapter, //
|
JdiEventsListenerAdapter, //
|
||||||
JdiModelSelectableObject {
|
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";
|
public static final String EXIT_CODE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "exit_code";
|
||||||
|
|
||||||
protected final VirtualMachine vm;
|
protected final VirtualMachine vm;
|
||||||
|
@ -256,7 +265,7 @@ public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements //
|
||||||
if (id != null) {
|
if (id != null) {
|
||||||
changeAttributes(List.of(), List.of(), Map.of( //
|
changeAttributes(List.of(), List.of(), Map.of( //
|
||||||
STATE_ATTRIBUTE_NAME, TargetExecutionState.ALIVE, //
|
STATE_ATTRIBUTE_NAME, TargetExecutionState.ALIVE, //
|
||||||
PID_ATTRIBUTE_NAME, id, //
|
ID_ATTRIBUTE_NAME, id, //
|
||||||
DISPLAY_ATTRIBUTE_NAME, updateDisplay() //
|
DISPLAY_ATTRIBUTE_NAME, updateDisplay() //
|
||||||
), "Started");
|
), "Started");
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,9 +28,15 @@ import ghidra.dbg.jdi.manager.JdiCause;
|
||||||
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
import ghidra.dbg.jdi.manager.JdiEventsListenerAdapter;
|
||||||
import ghidra.dbg.target.TargetEventScope.TargetEventScopeListener;
|
import ghidra.dbg.target.TargetEventScope.TargetEventScopeListener;
|
||||||
import ghidra.dbg.target.TargetEventScope.TargetEventType;
|
import ghidra.dbg.target.TargetEventScope.TargetEventType;
|
||||||
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
import ghidra.util.datastruct.WeakValueHashMap;
|
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
|
public class JdiModelTargetVMContainer extends JdiModelTargetObjectImpl
|
||||||
implements JdiEventsListenerAdapter {
|
implements JdiEventsListenerAdapter {
|
||||||
|
|
||||||
|
|
|
@ -15,10 +15,17 @@
|
||||||
*/
|
*/
|
||||||
package ghidra.dbg.jdi.model;
|
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.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 {
|
public class JdiModelTargetValue extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
protected final Value value;
|
protected final Value value;
|
||||||
|
|
|
@ -23,7 +23,13 @@ import com.sun.jdi.Value;
|
||||||
|
|
||||||
import ghidra.async.AsyncFence;
|
import ghidra.async.AsyncFence;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
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 {
|
public class JdiModelTargetValueContainer extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
private List<Value> values;
|
private List<Value> values;
|
||||||
|
|
|
@ -23,7 +23,13 @@ import com.sun.jdi.Value;
|
||||||
|
|
||||||
import ghidra.async.AsyncFence;
|
import ghidra.async.AsyncFence;
|
||||||
import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject;
|
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 {
|
public class JdiModelTargetValueMap extends JdiModelTargetObjectImpl {
|
||||||
|
|
||||||
private Map<LocalVariable, Value> values;
|
private Map<LocalVariable, Value> values;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue