diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrame.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrame.java index 46312423f1..c5e854a54d 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrame.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrame.java @@ -28,14 +28,12 @@ import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.lifecycle.Internal; import ghidra.program.model.address.Address; -import ghidra.program.model.address.AddressSpace; @TargetObjectSchemaInfo( name = "StackFrame", elements = { @TargetElementType(type = Void.class) }, attributes = { - @TargetAttributeType(name = "Address", type = Address.class), @TargetAttributeType(type = Void.class) }) public class GdbModelTargetStackFrame extends DefaultTargetObject implements TargetStackFrame, GdbModelSelectableObject { @@ -101,14 +99,13 @@ public class GdbModelTargetStackFrame extends DefaultTargetObject { if (t != null) { - Object value = t.getCachedAttribute(TargetObject.VALUE_ATTRIBUTE_NAME); - navigateToSelectedObject(t, value); + navigateToSelectedObject(t, null); } return AsyncUtils.NIL; - }, "Couldn't toggle"); + }, "Couldn't navigate"); } public void initiateConsole(ActionContext context) { @@ -1865,30 +1864,51 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter return listener.queue.in; } - public void navigateToSelectedObject(TargetObject selectedObject, Object value) { - if (listingService != null && value != null) { - Address addr = null; - if (value instanceof Address) { - addr = (Address) value; - } - if (value instanceof AddressRangeImpl) { - AddressRangeImpl range = (AddressRangeImpl) value; - addr = range.getMinAddress(); - } - if (value instanceof Long) { - Long lval = (Long) value; - addr = selectedObject.getModel().getAddress("ram", lval); - } - if (value instanceof String) { - String sval = (String) value; - addr = stringToAddress(selectedObject, addr, sval); - } - if (modelService != null && addr != null) { - TraceRecorder recorder = modelService.getRecorderForSuccessor(selectedObject); - DebuggerMemoryMapper memoryMapper = recorder.getMemoryMapper(); - Address traceAddr = memoryMapper.targetToTrace(addr); - listingService.goTo(traceAddr, true); + public void navigateToSelectedObject(TargetObject object, Object value) { + 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; + if (value instanceof Address) { + addr = (Address) value; + } + 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); } } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTree.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTree.java index c1a75be66c..ea33a88a76 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTree.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTree.java @@ -157,9 +157,7 @@ public class ObjectTree implements ObjectPane { if (e.getClickCount() == 2) { TargetObject selectedObject = getSelectedObject(); if (selectedObject != null) { - Object value = - selectedObject.getCachedAttribute(TargetObject.VALUE_ATTRIBUTE_NAME); - container.getProvider().navigateToSelectedObject(selectedObject, value); + container.getProvider().navigateToSelectedObject(selectedObject, null); } } }