mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 09:49:23 +02:00
GP-1822: better range of objects/attributes
This commit is contained in:
parent
e3892f914f
commit
c25f919249
3 changed files with 48 additions and 33 deletions
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,32 +1864,53 @@ 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) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (value == null) {
|
||||||
|
value =
|
||||||
|
object.getCachedAttribute(TargetBreakpointLocation.ADDRESS_ATTRIBUTE_NAME);
|
||||||
|
}
|
||||||
|
if (value == null) {
|
||||||
|
value = object.getCachedAttribute(TargetObject.PREFIX_INVISIBLE + "range");
|
||||||
|
}
|
||||||
|
if (value == null) {
|
||||||
|
value = object.getCachedAttribute(TargetObject.VALUE_ATTRIBUTE_NAME);
|
||||||
|
}
|
||||||
|
if (value == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Address addr = null;
|
Address addr = null;
|
||||||
if (value instanceof Address) {
|
if (value instanceof Address) {
|
||||||
addr = (Address) value;
|
addr = (Address) value;
|
||||||
}
|
}
|
||||||
if (value instanceof AddressRangeImpl) {
|
else if (value instanceof AddressRangeImpl) {
|
||||||
AddressRangeImpl range = (AddressRangeImpl) value;
|
AddressRangeImpl range = (AddressRangeImpl) value;
|
||||||
addr = range.getMinAddress();
|
addr = range.getMinAddress();
|
||||||
}
|
}
|
||||||
if (value instanceof Long) {
|
else if (value instanceof Long) {
|
||||||
Long lval = (Long) value;
|
Long lval = (Long) value;
|
||||||
addr = selectedObject.getModel().getAddress("ram", lval);
|
addr = object.getModel().getAddress("ram", lval);
|
||||||
}
|
}
|
||||||
if (value instanceof String) {
|
else if (value instanceof String) {
|
||||||
String sval = (String) value;
|
String sval = (String) value;
|
||||||
addr = stringToAddress(selectedObject, addr, sval);
|
addr = stringToAddress(object, addr, sval);
|
||||||
|
}
|
||||||
|
if (addr != null) {
|
||||||
|
TraceRecorder recorder = modelService.getRecorderForSuccessor(object);
|
||||||
|
if (recorder == null) {
|
||||||
|
recorder = modelService.getRecorder(currentTrace);
|
||||||
|
if (recorder == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (modelService != null && addr != null) {
|
|
||||||
TraceRecorder recorder = modelService.getRecorderForSuccessor(selectedObject);
|
|
||||||
DebuggerMemoryMapper memoryMapper = recorder.getMemoryMapper();
|
DebuggerMemoryMapper memoryMapper = recorder.getMemoryMapper();
|
||||||
Address traceAddr = memoryMapper.targetToTrace(addr);
|
Address traceAddr = memoryMapper.targetToTrace(addr);
|
||||||
listingService.goTo(traceAddr, true);
|
listingService.goTo(traceAddr, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private Address stringToAddress(TargetObject selectedObject, Address addr, String sval) {
|
private Address stringToAddress(TargetObject selectedObject, Address addr, String sval) {
|
||||||
Integer base = 16;
|
Integer base = 16;
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue