diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java index 9cb56ca38d..8edf4ab1f0 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java @@ -45,6 +45,7 @@ import ghidra.app.plugin.core.debug.gui.DebuggerResources; import ghidra.app.plugin.core.debug.gui.DebuggerResources.*; import ghidra.app.plugin.core.debug.gui.objects.actions.*; import ghidra.app.plugin.core.debug.gui.objects.components.*; +import ghidra.app.plugin.core.debug.mapping.DebuggerMemoryMapper; import ghidra.app.services.*; import ghidra.async.*; import ghidra.dbg.*; @@ -63,8 +64,7 @@ import ghidra.framework.options.annotation.*; import ghidra.framework.plugintool.*; import ghidra.framework.plugintool.annotation.AutoConfigStateField; import ghidra.framework.plugintool.annotation.AutoServiceConsumed; -import ghidra.program.model.address.Address; -import ghidra.program.model.address.AddressRange; +import ghidra.program.model.address.*; import ghidra.program.model.listing.Program; import ghidra.trace.model.Trace; import ghidra.trace.model.thread.TraceThread; @@ -1252,6 +1252,21 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter .buildAndInstallLocal(this); groupTargetIndex++; + + new ActionBuilder("GoTo", plugin.getName()) + .keyBinding("G") + .toolBarGroup(DebuggerResources.GROUP_CONTROL, "X" + groupTargetIndex) + .popupMenuPath("&GoTo") + .popupMenuGroup(DebuggerResources.GROUP_CONTROL, "X" + groupTargetIndex) + .helpLocation(AbstractToggleAction.help(plugin)) + .enabledWhen(ctx -> isInstance(ctx, TargetObject.class)) + .popupWhen(ctx -> isInstance(ctx, TargetObject.class)) + .onAction(ctx -> performNavigate(ctx)) + .enabled(false) + .buildAndInstallLocal(this); + + groupTargetIndex++; + displayAsTreeAction = new DisplayAsTreeAction(tool, plugin.getName(), this); displayAsTableAction = new DisplayAsTableAction(tool, plugin.getName(), this); @@ -1545,6 +1560,16 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter }, "Couldn't configure one or more options"); } + public void performNavigate(ActionContext context) { + performAction(context, false, TargetObject.class, t -> { + if (t != null) { + Object value = t.getCachedAttribute(TargetObject.VALUE_ATTRIBUTE_NAME); + navigateToSelectedObject(t, value); + } + return AsyncUtils.NIL; + }, "Couldn't toggle"); + } + public void initiateConsole(ActionContext context) { performAction(context, false, TargetInterpreter.class, interpreter -> { getPlugin().showConsole(interpreter); @@ -1840,4 +1865,47 @@ 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); + } + } + } + + private Address stringToAddress(TargetObject selectedObject, Address addr, String sval) { + Integer base = 16; + if (selectedObject instanceof TargetConfigurable) { + TargetConfigurable configurable = (TargetConfigurable) selectedObject; + base = + (Integer) configurable.getCachedAttribute(TargetConfigurable.BASE_ATTRIBUTE_NAME); + } + try { + Long lval = Long.parseLong(sval, base); + addr = selectedObject.getModel().getAddress("ram", lval); + } + catch (NumberFormatException nfe) { + // IGNORE + } + return addr; + } } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTable.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTable.java index c778b0780b..0090f348c6 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTable.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTable.java @@ -27,11 +27,7 @@ import docking.widgets.table.AbstractSortedTableModel; import docking.widgets.table.EnumeratedColumnTableModel; import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider; import ghidra.app.plugin.core.debug.gui.objects.ObjectContainer; -import ghidra.app.plugin.core.debug.mapping.DebuggerMemoryMapper; -import ghidra.app.services.*; import ghidra.dbg.target.TargetObject; -import ghidra.program.model.address.Address; -import ghidra.program.model.address.AddressRangeImpl; import ghidra.util.Swing; import ghidra.util.table.GhidraTable; import resources.ResourceManager; @@ -45,8 +41,6 @@ public class ObjectTable implements ObjectPane { private AbstractSortedTableModel model; private GhidraTable table; private JScrollPane component; - private DebuggerListingService listingService; - private DebuggerModelService modelService; public ObjectTable(ObjectContainer container, Class clazz, AbstractSortedTableModel model) { @@ -55,8 +49,6 @@ public class ObjectTable implements ObjectPane { this.container = container; this.clazz = clazz; this.model = model; - this.listingService = container.getProvider().getListingService(); - this.modelService = container.getProvider().getModelService(); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override @@ -72,7 +64,11 @@ public class ObjectTable implements ObjectPane { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { - navigateToSelectedObject(); + int selectedRow = table.getSelectedRow(); + int selectedColumn = table.getSelectedColumn(); + Object value = table.getValueAt(selectedRow, selectedColumn); + container.getProvider() + .navigateToSelectedObject(container.getTargetObject(), value); } } }); @@ -279,54 +275,4 @@ public class ObjectTable implements ObjectPane { container.setTargetObject(targetObject); } - protected void navigateToSelectedObject() { - if (listingService != null) { - int selectedRow = table.getSelectedRow(); - int selectedColumn = table.getSelectedColumn(); - Object value = table.getValueAt(selectedRow, selectedColumn); - 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 = container.getTargetObject().getModel().getAddress("ram", lval); - } - if (value instanceof String) { - String sval = (String) value; - addr = stringToAddress(container.getTargetObject(), addr, sval); - } - if (modelService != null) { - TraceRecorder recorder = - modelService.getRecorderForSuccessor(container.getTargetObject()); - DebuggerMemoryMapper memoryMapper = recorder.getMemoryMapper(); - Address traceAddr = memoryMapper.targetToTrace(addr); - listingService.goTo(traceAddr, true); - } - } - } - - private Address stringToAddress(TargetObject selectedObject, Address addr, String sval) { - try { - Long lval = Long.decode(sval); - addr = selectedObject.getModel().getAddress("ram", lval); - } - catch (NumberFormatException nfe) { - // IGNORE - } - if (addr == null) { - try { - Long lval = Long.decode("0x" + sval); - addr = selectedObject.getModel().getAddress("ram", lval); - } - catch (NumberFormatException nfe) { - // IGNORE - } - } - return addr; - } } 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 2ae758b57f..c1a75be66c 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 @@ -35,15 +35,11 @@ import docking.widgets.tree.support.GTreeSelectionEvent.EventOrigin; import docking.widgets.tree.support.GTreeSelectionListener; import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider; import ghidra.app.plugin.core.debug.gui.objects.ObjectContainer; -import ghidra.app.plugin.core.debug.mapping.DebuggerMemoryMapper; -import ghidra.app.services.*; import ghidra.async.AsyncUtils; import ghidra.async.TypeSpec; import ghidra.dbg.DebugModelConventions; import ghidra.dbg.target.TargetAccessConditioned; import ghidra.dbg.target.TargetObject; -import ghidra.program.model.address.Address; -import ghidra.program.model.address.AddressRangeImpl; import ghidra.util.*; import ghidra.util.task.SwingUpdateManager; import resources.ResourceManager; @@ -63,17 +59,11 @@ public class ObjectTree implements ObjectPane { private SwingUpdateManager restoreTreeStateManager = new SwingUpdateManager(this::restoreTreeState); - private DebuggerListingService listingService; - private DebuggerModelService modelService; - public ObjectTree(ObjectContainer container) { this.root = new ObjectNode(this, null, container); addToMap(null, container, root); this.tree = new GTree(root); - this.listingService = container.getProvider().getListingService(); - this.modelService = container.getProvider().getModelService(); - tree.addGTreeSelectionListener(new GTreeSelectionListener() { @Override public void valueChanged(GTreeSelectionEvent e) { @@ -165,7 +155,12 @@ public class ObjectTree implements ObjectPane { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { - navigateToSelectedObject(); + TargetObject selectedObject = getSelectedObject(); + if (selectedObject != null) { + Object value = + selectedObject.getCachedAttribute(TargetObject.VALUE_ATTRIBUTE_NAME); + container.getProvider().navigateToSelectedObject(selectedObject, value); + } } } }); @@ -407,55 +402,4 @@ public class ObjectTree implements ObjectPane { nodeMap.remove(path(node.getContainer())); } - protected void navigateToSelectedObject() { - if (listingService != null) { - TargetObject selectedObject = getSelectedObject(); - if (selectedObject == null) { - return; - } - Object value = selectedObject.getCachedAttribute(TargetObject.VALUE_ATTRIBUTE_NAME); - 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); - } - } - } - - private Address stringToAddress(TargetObject selectedObject, Address addr, String sval) { - try { - Long lval = Long.decode(sval); - addr = selectedObject.getModel().getAddress("ram", lval); - } - catch (NumberFormatException nfe) { - // IGNORE - } - if (addr == null) { - try { - Long lval = Long.decode("0x" + sval); - addr = selectedObject.getModel().getAddress("ram", lval); - } - catch (NumberFormatException nfe) { - // IGNORE - } - } - return addr; - } }