diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java index f74a37d1b1..122334b94f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java @@ -170,6 +170,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp })); } + @Override public Map getCachedRegisters() { return values; } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterImpl.java index f131e301ce..5a1a16b772 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterImpl.java @@ -25,9 +25,14 @@ import ghidra.dbg.target.TargetRegister; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; -@TargetObjectSchemaInfo(name = "RegisterDescriptor", elements = { - @TargetElementType(type = Void.class) }, attributes = { - @TargetAttributeType(name = TargetRegister.CONTAINER_ATTRIBUTE_NAME, type = DbgModelTargetRegisterContainerImpl.class), +@TargetObjectSchemaInfo( + name = "RegisterDescriptor", + elements = { + @TargetElementType(type = Void.class) }, + attributes = { + @TargetAttributeType( + name = TargetRegister.CONTAINER_ATTRIBUTE_NAME, + type = DbgModelTargetRegisterContainerImpl.class), @TargetAttributeType(type = Void.class) }) public class DbgModelTargetRegisterImpl extends DbgModelTargetObjectImpl implements DbgModelTargetRegister { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackFrameImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackFrameImpl.java index 49da5d6a28..0c189c45bd 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackFrameImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackFrameImpl.java @@ -27,6 +27,7 @@ import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressSpace; @TargetObjectSchemaInfo( name = "StackFrame", @@ -41,16 +42,16 @@ import ghidra.program.model.address.Address; type = String.class), @TargetAttributeType( name = DbgModelTargetStackFrame.INST_OFFSET_ATTRIBUTE_NAME, - type = String.class), + type = Address.class), @TargetAttributeType( name = DbgModelTargetStackFrame.FRAME_OFFSET_ATTRIBUTE_NAME, - type = String.class), + type = Address.class), @TargetAttributeType( name = DbgModelTargetStackFrame.RETURN_OFFSET_ATTRIBUTE_NAME, - type = String.class), + type = Address.class), @TargetAttributeType( name = DbgModelTargetStackFrame.STACK_OFFSET_ATTRIBUTE_NAME, - type = String.class), + type = Address.class), @TargetAttributeType( name = DbgModelTargetStackFrame.VIRTUAL_ATTRIBUTE_NAME, type = Boolean.class), @@ -141,15 +142,16 @@ public class DbgModelTargetStackFrameImpl extends DbgModelTargetObjectImpl // TODO: module? "from" this.frame = frame; + AddressSpace space = getModel().getAddressSpace("ram"); changeAttributes(List.of(), List.of(), Map.of( // PC_ATTRIBUTE_NAME, pc, // DISPLAY_ATTRIBUTE_NAME, display = computeDisplay(frame), // FUNC_ATTRIBUTE_NAME, func, // FUNC_TABLE_ENTRY_ATTRIBUTE_NAME, Long.toHexString(funcTableEntry), // - INST_OFFSET_ATTRIBUTE_NAME, Long.toHexString(lval), // - FRAME_OFFSET_ATTRIBUTE_NAME, Long.toHexString(frameOffset), // - RETURN_OFFSET_ATTRIBUTE_NAME, Long.toHexString(returnOffset), // - STACK_OFFSET_ATTRIBUTE_NAME, Long.toHexString(stackOffset), // + INST_OFFSET_ATTRIBUTE_NAME, space.getAddress(lval), // + FRAME_OFFSET_ATTRIBUTE_NAME, space.getAddress(frameOffset), // + RETURN_OFFSET_ATTRIBUTE_NAME, space.getAddress(returnOffset), // + STACK_OFFSET_ATTRIBUTE_NAME, space.getAddress(stackOffset), // VIRTUAL_ATTRIBUTE_NAME, virtual // ), "Refreshed"); changeAttributes(List.of(), List.of(), Map.of( // 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 fd4ec70d47..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 @@ -104,7 +104,8 @@ public class GdbModelTargetStackFrame extends DefaultTargetObjectEnter any sleigh expression to evaluate against the current thread.
" + - "Note that constants and memory derefs must have a resolved size, e.g.:" + + "Note that constants and memory derefs must have a resolved size.
" + + "Examples:
" + ""); help.getMaximumSize().width = 400; panel.add(help, BorderLayout.NORTH); 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 9124d31f1a..af63dd19c6 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 @@ -20,22 +20,14 @@ import java.awt.Color; import java.awt.event.MouseEvent; import java.io.PrintWriter; import java.lang.invoke.MethodHandles; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JPanel; +import javax.swing.*; import javax.swing.tree.TreePath; import org.apache.commons.collections4.map.LinkedMap; @@ -43,10 +35,7 @@ import org.apache.commons.lang3.StringUtils; import docking.ActionContext; import docking.WindowPosition; -import docking.action.DockingAction; -import docking.action.DockingActionIf; -import docking.action.MenuData; -import docking.action.ToggleDockingAction; +import docking.action.*; import docking.action.builder.ActionBuilder; import docking.action.builder.ToggleActionBuilder; import docking.widgets.OptionDialog; @@ -56,115 +45,37 @@ import generic.jar.ResourceFile; import ghidra.app.plugin.core.debug.DebuggerCoordinates; import ghidra.app.plugin.core.debug.DebuggerPluginPackage; import ghidra.app.plugin.core.debug.gui.DebuggerResources; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractAttachAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractConsoleAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractDetachAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractInterruptAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractKillAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractLaunchAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractQuickLaunchAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractRecordAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractRefreshAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractResumeAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractSetBreakpointAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractStepFinishAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractStepIntoAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractStepLastAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractStepOverAction; -import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractToggleAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.DisplayAsGraphAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.DisplayAsTableAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.DisplayAsTreeAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.DisplayAsXMLAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.DisplayFilteredGraphAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.DisplayFilteredTableAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.DisplayFilteredTreeAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.DisplayFilteredXMLAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.DisplayMethodsAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.ExportAsFactsAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.ExportAsXMLAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.ImportFromFactsAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.ImportFromXMLAction; -import ghidra.app.plugin.core.debug.gui.objects.actions.OpenWinDbgTraceAction; -import ghidra.app.plugin.core.debug.gui.objects.components.DebuggerAttachDialog; -import ghidra.app.plugin.core.debug.gui.objects.components.DebuggerBreakpointDialog; -import ghidra.app.plugin.core.debug.gui.objects.components.DebuggerMethodInvocationDialog; -import ghidra.app.plugin.core.debug.gui.objects.components.DummyTargetObject; -import ghidra.app.plugin.core.debug.gui.objects.components.ObjectAttributeColumn; -import ghidra.app.plugin.core.debug.gui.objects.components.ObjectAttributeRow; -import ghidra.app.plugin.core.debug.gui.objects.components.ObjectElementColumn; -import ghidra.app.plugin.core.debug.gui.objects.components.ObjectElementRow; -import ghidra.app.plugin.core.debug.gui.objects.components.ObjectEnumeratedColumnTableModel; -import ghidra.app.plugin.core.debug.gui.objects.components.ObjectNode; -import ghidra.app.plugin.core.debug.gui.objects.components.ObjectPane; -import ghidra.app.plugin.core.debug.gui.objects.components.ObjectTable; -import ghidra.app.plugin.core.debug.gui.objects.components.ObjectTree; -import ghidra.app.script.GhidraScript; -import ghidra.app.script.GhidraScriptProvider; -import ghidra.app.script.GhidraScriptUtil; -import ghidra.app.script.GhidraState; -import ghidra.app.services.ConsoleService; -import ghidra.app.services.DebuggerListingService; -import ghidra.app.services.DebuggerModelService; -import ghidra.app.services.DebuggerStaticMappingService; -import ghidra.app.services.DebuggerTraceManagerService; -import ghidra.app.services.GraphDisplayBroker; -import ghidra.app.services.TraceRecorder; -import ghidra.async.AsyncFence; -import ghidra.async.AsyncUtils; -import ghidra.async.TypeSpec; -import ghidra.dbg.AnnotatedDebuggerAttributeListener; -import ghidra.dbg.DebugModelConventions; -import ghidra.dbg.DebuggerModelListener; -import ghidra.dbg.DebuggerObjectModel; +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.script.*; +import ghidra.app.services.*; +import ghidra.async.*; +import ghidra.dbg.*; import ghidra.dbg.error.DebuggerMemoryAccessException; -import ghidra.dbg.target.TargetAccessConditioned; -import ghidra.dbg.target.TargetAttachable; -import ghidra.dbg.target.TargetAttacher; -import ghidra.dbg.target.TargetBreakpointSpecContainer; -import ghidra.dbg.target.TargetConfigurable; +import ghidra.dbg.target.*; import ghidra.dbg.target.TargetConsole.Channel; -import ghidra.dbg.target.TargetDetachable; -import ghidra.dbg.target.TargetExecutionStateful; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; -import ghidra.dbg.target.TargetFocusScope; -import ghidra.dbg.target.TargetInterpreter; -import ghidra.dbg.target.TargetInterruptible; -import ghidra.dbg.target.TargetKillable; -import ghidra.dbg.target.TargetLauncher; import ghidra.dbg.target.TargetLauncher.TargetCmdLineLauncher; -import ghidra.dbg.target.TargetMethod; import ghidra.dbg.target.TargetMethod.ParameterDescription; -import ghidra.dbg.target.TargetObject; -import ghidra.dbg.target.TargetProcess; -import ghidra.dbg.target.TargetResumable; -import ghidra.dbg.target.TargetSteppable; import ghidra.dbg.target.TargetSteppable.TargetStepKind; -import ghidra.dbg.target.TargetTogglable; import ghidra.dbg.util.DebuggerCallbackReorderer; import ghidra.dbg.util.PathUtils; import ghidra.framework.model.Project; import ghidra.framework.options.AutoOptions; import ghidra.framework.options.SaveState; -import ghidra.framework.options.annotation.AutoOptionConsumed; -import ghidra.framework.options.annotation.AutoOptionDefined; -import ghidra.framework.options.annotation.HelpInfo; -import ghidra.framework.plugintool.AutoConfigState; -import ghidra.framework.plugintool.AutoService; -import ghidra.framework.plugintool.ComponentProviderAdapter; -import ghidra.framework.plugintool.PluginTool; +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.program.util.ProgramLocation; import ghidra.program.util.ProgramSelection; import ghidra.trace.model.Trace; import ghidra.trace.model.thread.TraceThread; -import ghidra.util.HelpLocation; -import ghidra.util.Msg; -import ghidra.util.Swing; +import ghidra.util.*; import ghidra.util.datastruct.PrivatelyQueuedListener; import ghidra.util.table.GhidraTable; import ghidra.util.task.TaskMonitor; @@ -1384,6 +1295,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); @@ -1763,6 +1689,15 @@ 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) { + navigateToSelectedObject(t, null); + } + return AsyncUtils.NIL; + }, "Couldn't navigate"); + } + public void initiateConsole(ActionContext context) { performAction(context, false, TargetInterpreter.class, interpreter -> { getPlugin().showConsole(interpreter); @@ -2078,4 +2013,68 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter return listener.queue.in; } + 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); + } + } + + 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 d47cb32cd6..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,31 +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 (modelService != null) { - TraceRecorder recorder = - modelService.getRecorderForSuccessor(container.getTargetObject()); - 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 f0043d763d..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 @@ -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,10 @@ public class ObjectTree implements ObjectPane { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { - navigateToSelectedObject(); + TargetObject selectedObject = getSelectedObject(); + if (selectedObject != null) { + container.getProvider().navigateToSelectedObject(selectedObject, null); + } } } }); @@ -407,31 +400,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 (modelService != null && addr != null) { - TraceRecorder recorder = modelService.getRecorderForSuccessor(selectedObject); - DebuggerMemoryMapper memoryMapper = recorder.getMemoryMapper(); - Address traceAddr = memoryMapper.targetToTrace(addr); - listingService.goTo(traceAddr, true); - } - } - } } diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/RecoverClassesFromRTTIScript.java b/Ghidra/Features/Decompiler/ghidra_scripts/RecoverClassesFromRTTIScript.java index fa5e7774f6..2b9f24a1b3 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/RecoverClassesFromRTTIScript.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/RecoverClassesFromRTTIScript.java @@ -69,6 +69,7 @@ import ghidra.app.util.bin.format.dwarf4.next.sectionprovider.DWARFSectionProvid import ghidra.app.util.bin.format.dwarf4.next.sectionprovider.DWARFSectionProviderFactory; import ghidra.app.util.bin.format.pdb.PdbParserConstants; import ghidra.app.util.importer.MessageLog; +import ghidra.app.util.opinion.ElfLoader; import ghidra.framework.options.Options; import ghidra.framework.plugintool.PluginTool; import ghidra.program.model.address.*; @@ -574,8 +575,7 @@ public class RecoverClassesFromRTTIScript extends GhidraScript { */ private boolean isGcc() { - boolean isELF = currentProgram.getExecutableFormat().contains("ELF"); - if (!isELF) { + if (!ElfLoader.ELF_NAME.equals(currentProgram.getExecutableFormat())) { return false; } @@ -591,11 +591,10 @@ public class RecoverClassesFromRTTIScript extends GhidraScript { return false; } - if (!commentBlock.isLoaded()) { + if (!commentBlock.isInitialized()) { return false; } - // check memory bytes in block for GCC: bytes byte[] gccBytes = { (byte) 0x47, (byte) 0x43, (byte) 0x43, (byte) 0x3a }; byte[] maskBytes = { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff }; diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java index bb85d98926..24e73ab9fb 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java @@ -21,6 +21,7 @@ import java.util.*; import ghidra.app.cmd.label.DemanglerCmd; import ghidra.app.util.NamespaceUtils; import ghidra.app.util.demangler.*; +import ghidra.app.util.opinion.ElfLoader; import ghidra.framework.plugintool.PluginTool; import ghidra.program.flatapi.FlatProgramAPI; import ghidra.program.model.address.*; @@ -133,8 +134,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { private boolean isGcc() { - boolean isELF = program.getExecutableFormat().contains("ELF"); - if (!isELF) { + if (!ElfLoader.ELF_NAME.equals(program.getExecutableFormat())) { return false; } @@ -149,7 +149,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { return false; } - if (!commentBlock.isLoaded()) { + if (!commentBlock.isInitialized()) { return false; } diff --git a/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/service/FidServiceLibraryIngest.java b/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/service/FidServiceLibraryIngest.java index 6a0888a031..b4a92b1c6f 100644 --- a/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/service/FidServiceLibraryIngest.java +++ b/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/service/FidServiceLibraryIngest.java @@ -54,12 +54,10 @@ class FidServiceLibraryIngest { private LibraryRecord library = null; // Database record of the library we are creating private CompilerSpec compilerSpec = null; - private Map> unresolvedSymbols = - new HashMap<>(); + private Map> unresolvedSymbols = new HashMap<>(); private TreeSet globalUniqueFunction = new TreeSet<>(); private FidPopulateResult result = null; - private TreeMap childHistogram = - new TreeMap<>(); // Counts of child references to function symbols + private TreeMap childHistogram = new TreeMap<>(); // Counts of child references to function symbols private static class FunctionRow { public FunctionRecord functionRecord; @@ -604,7 +602,8 @@ class FidServiceLibraryIngest { return false; } if (compilerSpec != null) { - if (!compilerSpec.equals(program.getCompilerSpec())) { + if (!compilerSpec.getCompilerSpecID() + .equals(program.getCompilerSpec().getCompilerSpecID())) { throw new IllegalArgumentException( "Program " + program.getName() + " has different compiler spec (" + program.getCompilerSpec().getCompilerSpecID() +