GP-1822: better range of objects/attributes

This commit is contained in:
d-millar 2022-03-18 14:19:51 -04:00
parent e3892f914f
commit c25f919249
3 changed files with 48 additions and 33 deletions

View file

@ -28,14 +28,12 @@ import ghidra.dbg.target.schema.*;
import ghidra.dbg.util.PathUtils; import ghidra.dbg.util.PathUtils;
import ghidra.lifecycle.Internal; import ghidra.lifecycle.Internal;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressSpace;
@TargetObjectSchemaInfo( @TargetObjectSchemaInfo(
name = "StackFrame", name = "StackFrame",
elements = { elements = {
@TargetElementType(type = Void.class) }, @TargetElementType(type = Void.class) },
attributes = { attributes = {
@TargetAttributeType(name = "Address", type = Address.class),
@TargetAttributeType(type = Void.class) }) @TargetAttributeType(type = Void.class) })
public class GdbModelTargetStackFrame extends DefaultTargetObject<TargetObject, GdbModelTargetStack> public class GdbModelTargetStackFrame extends DefaultTargetObject<TargetObject, GdbModelTargetStack>
implements TargetStackFrame, GdbModelSelectableObject { implements TargetStackFrame, GdbModelSelectableObject {
@ -101,14 +99,13 @@ public class GdbModelTargetStackFrame extends DefaultTargetObject<TargetObject,
this.func = frame.getFunction(); this.func = frame.getFunction();
// TODO: module? "from" // TODO: module? "from"
AddressSpace space = getModel().getAddressSpace("ram");
changeAttributes(List.of(), List.of( // changeAttributes(List.of(), List.of( //
registers // registers //
), Map.of( // ), Map.of( //
PC_ATTRIBUTE_NAME, pc, // PC_ATTRIBUTE_NAME, pc, //
FUNC_ATTRIBUTE_NAME, func, // FUNC_ATTRIBUTE_NAME, func, //
DISPLAY_ATTRIBUTE_NAME, display = computeDisplay(frame), // DISPLAY_ATTRIBUTE_NAME, display = computeDisplay(frame), //
"Address", space.getAddress(frame.getAddress().longValue()) // VALUE_ATTRIBUTE_NAME, pc //
), "Refreshed"); ), "Refreshed");
} }

View file

@ -1563,11 +1563,10 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter
public void performNavigate(ActionContext context) { public void performNavigate(ActionContext context) {
performAction(context, false, TargetObject.class, t -> { performAction(context, false, TargetObject.class, t -> {
if (t != null) { if (t != null) {
Object value = t.getCachedAttribute(TargetObject.VALUE_ATTRIBUTE_NAME); navigateToSelectedObject(t, null);
navigateToSelectedObject(t, value);
} }
return AsyncUtils.NIL; return AsyncUtils.NIL;
}, "Couldn't toggle"); }, "Couldn't navigate");
} }
public void initiateConsole(ActionContext context) { public void initiateConsole(ActionContext context) {
@ -1865,30 +1864,51 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter
return listener.queue.in; return listener.queue.in;
} }
public void navigateToSelectedObject(TargetObject selectedObject, Object value) { public void navigateToSelectedObject(TargetObject object, Object value) {
if (listingService != null && value != null) { if (listingService == null || listingService == null) {
Address addr = null; return;
if (value instanceof Address) { }
addr = (Address) value; if (value == null) {
} value =
if (value instanceof AddressRangeImpl) { object.getCachedAttribute(TargetBreakpointLocation.ADDRESS_ATTRIBUTE_NAME);
AddressRangeImpl range = (AddressRangeImpl) value; }
addr = range.getMinAddress(); if (value == null) {
} value = object.getCachedAttribute(TargetObject.PREFIX_INVISIBLE + "range");
if (value instanceof Long) { }
Long lval = (Long) value; if (value == null) {
addr = selectedObject.getModel().getAddress("ram", lval); value = object.getCachedAttribute(TargetObject.VALUE_ATTRIBUTE_NAME);
} }
if (value instanceof String) { if (value == null) {
String sval = (String) value; return;
addr = stringToAddress(selectedObject, addr, sval); }
}
if (modelService != null && addr != null) { Address addr = null;
TraceRecorder recorder = modelService.getRecorderForSuccessor(selectedObject); if (value instanceof Address) {
DebuggerMemoryMapper memoryMapper = recorder.getMemoryMapper(); addr = (Address) value;
Address traceAddr = memoryMapper.targetToTrace(addr); }
listingService.goTo(traceAddr, true); else if (value instanceof AddressRangeImpl) {
AddressRangeImpl range = (AddressRangeImpl) value;
addr = range.getMinAddress();
}
else if (value instanceof Long) {
Long lval = (Long) value;
addr = object.getModel().getAddress("ram", lval);
}
else if (value instanceof String) {
String sval = (String) value;
addr = stringToAddress(object, addr, sval);
}
if (addr != null) {
TraceRecorder recorder = modelService.getRecorderForSuccessor(object);
if (recorder == null) {
recorder = modelService.getRecorder(currentTrace);
if (recorder == null) {
return;
}
} }
DebuggerMemoryMapper memoryMapper = recorder.getMemoryMapper();
Address traceAddr = memoryMapper.targetToTrace(addr);
listingService.goTo(traceAddr, true);
} }
} }

View file

@ -157,9 +157,7 @@ public class ObjectTree implements ObjectPane {
if (e.getClickCount() == 2) { if (e.getClickCount() == 2) {
TargetObject selectedObject = getSelectedObject(); TargetObject selectedObject = getSelectedObject();
if (selectedObject != null) { if (selectedObject != null) {
Object value = container.getProvider().navigateToSelectedObject(selectedObject, null);
selectedObject.getCachedAttribute(TargetObject.VALUE_ATTRIBUTE_NAME);
container.getProvider().navigateToSelectedObject(selectedObject, value);
} }
} }
} }