diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleImpl.java index 1e5781375f..48366f11b5 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleImpl.java @@ -24,9 +24,16 @@ import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.program.model.address.*; -@TargetObjectSchemaInfo(name = "Module", elements = { - @TargetElementType(type = Void.class) }, attributes = { - @TargetAttributeType(name = "Symbols", type = DbgModelTargetSymbolContainerImpl.class, required = true, fixed = true), +@TargetObjectSchemaInfo( + name = "Module", + elements = { + @TargetElementType(type = Void.class) }, + attributes = { + @TargetAttributeType( + name = "Symbols", + type = DbgModelTargetSymbolContainerImpl.class, + required = true, + fixed = true), @TargetAttributeType(name = "BaseAddress", type = Address.class), @TargetAttributeType(name = "ImageName", type = String.class), @TargetAttributeType(name = "TimeStamp", type = Integer.class), diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSymbolImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSymbolImpl.java index 6d00283449..2d44f214f2 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSymbolImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSymbolImpl.java @@ -20,17 +20,22 @@ import java.util.Map; import agent.dbgeng.manager.impl.DbgMinimalSymbol; import agent.dbgeng.model.iface2.DbgModelTargetSymbol; -import ghidra.dbg.target.TargetObject; -import ghidra.dbg.target.TargetSymbol; +import ghidra.dbg.target.*; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.program.model.address.Address; -@TargetObjectSchemaInfo(name = "Symbol", elements = { - @TargetElementType(type = Void.class) }, attributes = { - @TargetAttributeType(name = TargetSymbol.NAMESPACE_ATTRIBUTE_NAME, type = DbgModelTargetSymbolContainerImpl.class), +@TargetObjectSchemaInfo( + name = "Symbol", + elements = { + @TargetElementType(type = Void.class) }, + attributes = { + @TargetAttributeType( + name = TargetSymbol.NAMESPACE_ATTRIBUTE_NAME, + type = DbgModelTargetSymbolContainerImpl.class), @TargetAttributeType(name = TargetObject.VALUE_ATTRIBUTE_NAME, type = Address.class), @TargetAttributeType(name = TargetSymbol.SIZE_ATTRIBUTE_NAME, type = long.class), + @TargetAttributeType(name = TargetBreakpointSpec.AS_BPT_ATTRIBUTE_NAME, type = String.class), @TargetAttributeType(name = "Name", type = String.class), @TargetAttributeType(name = "Size", type = long.class), @TargetAttributeType(name = "TypeId", type = int.class), @@ -58,11 +63,16 @@ public class DbgModelTargetSymbolImpl extends DbgModelTargetObjectImpl this.value = symbols.getModel().getAddressSpace("ram").getAddress(symbol.getAddress()); this.size = symbol.getSize(); + TargetObject module = symbols.getParent(); + String moduleName = + (String) module.getCachedAttribute(TargetObject.SHORT_DISPLAY_ATTRIBUTE_NAME); changeAttributes(List.of(), List.of(), Map.of( // // TODO: DATA_TYPE NAMESPACE_ATTRIBUTE_NAME, symbols, // VALUE_ATTRIBUTE_NAME, value, // SIZE_ATTRIBUTE_NAME, size, // + TargetBreakpointSpec.AS_BPT_ATTRIBUTE_NAME, // + moduleName + "!" + symbol.getName(), // "Name", symbol.getName(), // "Size", size, // "TypeId", symbol.getTypeId(), // diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbol.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbol.java index 99be18e1d6..01d43bbecb 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbol.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbol.java @@ -20,8 +20,7 @@ import java.util.Map; import agent.gdb.manager.impl.GdbMinimalSymbol; import ghidra.dbg.agent.DefaultTargetObject; -import ghidra.dbg.target.TargetObject; -import ghidra.dbg.target.TargetSymbol; +import ghidra.dbg.target.*; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.program.model.address.Address; @@ -31,6 +30,7 @@ import ghidra.program.model.address.Address; elements = { @TargetElementType(type = Void.class) }, attributes = { + @TargetAttributeType(name = TargetBreakpointSpec.AS_BPT_ATTRIBUTE_NAME, type = String.class), @TargetAttributeType(type = Void.class) }) public class GdbModelTargetSymbol extends DefaultTargetObject implements TargetSymbol { @@ -58,7 +58,8 @@ public class GdbModelTargetSymbol extends // TODO: DATA_TYPE VALUE_ATTRIBUTE_NAME, value, SIZE_ATTRIBUTE_NAME, size, - DISPLAY_ATTRIBUTE_NAME, symbol.getName()), + DISPLAY_ATTRIBUTE_NAME, symbol.getName(), + TargetBreakpointSpec.AS_BPT_ATTRIBUTE_NAME, symbol.getName()), "Initialized"); } diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSymbolImpl.java b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSymbolImpl.java index 5ba29d29f2..af62e7534b 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSymbolImpl.java +++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/java/agent/lldb/model/impl/LldbModelTargetSymbolImpl.java @@ -21,11 +21,8 @@ import java.util.Map; import SWIG.*; import agent.lldb.model.iface2.LldbModelTargetSession; import agent.lldb.model.iface2.LldbModelTargetSymbol; -import ghidra.dbg.target.TargetObject; -import ghidra.dbg.target.TargetSymbol; -import ghidra.dbg.target.schema.TargetAttributeType; -import ghidra.dbg.target.schema.TargetElementType; -import ghidra.dbg.target.schema.TargetObjectSchemaInfo; +import ghidra.dbg.target.*; +import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.program.model.address.Address; @@ -39,6 +36,7 @@ import ghidra.program.model.address.Address; type = LldbModelTargetSymbolContainerImpl.class), @TargetAttributeType(name = TargetObject.VALUE_ATTRIBUTE_NAME, type = Address.class), @TargetAttributeType(name = TargetSymbol.SIZE_ATTRIBUTE_NAME, type = long.class), + @TargetAttributeType(name = TargetBreakpointSpec.AS_BPT_ATTRIBUTE_NAME, type = String.class), @TargetAttributeType(name = "Name", type = String.class), @TargetAttributeType(name = "Size", type = long.class), @TargetAttributeType(name = "TypeId", type = int.class), @@ -76,7 +74,8 @@ public class LldbModelTargetSymbolImpl extends LldbModelTargetObjectImpl DISPLAY_ATTRIBUTE_NAME, getDescription(0), // NAMESPACE_ATTRIBUTE_NAME, symbols, // VALUE_ATTRIBUTE_NAME, value, // - SIZE_ATTRIBUTE_NAME, size // + SIZE_ATTRIBUTE_NAME, size, // + TargetBreakpointSpec.AS_BPT_ATTRIBUTE_NAME, getDescription(0) // /* "Name", symbol.getName(), // "Size", size, // 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 af63dd19c6..b4bdd6a3ea 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 @@ -1655,6 +1655,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter } public void performSetBreakpoint(ActionContext context) { + setText(context); performAction(context, false, TargetBreakpointSpecContainer.class, container -> { breakpointDialog.setContainer(container); tool.showDialog(breakpointDialog); @@ -1662,6 +1663,21 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter }, "Couldn't set breakpoint"); } + private void setText(ActionContext context) { + breakpointDialog.setText(""); + TargetObject obj = getObjectFromContext(context); + Object key = obj.getCachedAttribute(TargetBreakpointSpec.AS_BPT_ATTRIBUTE_NAME); + if (key != null) { + breakpointDialog.setText(key.toString()); + } + else { + if (obj instanceof DummyTargetObject) { + DummyTargetObject dto = (DummyTargetObject) obj; + breakpointDialog.setText(dto.getValue().toString()); + } + } + } + public void performToggle(ActionContext context) { performAction(context, false, TargetTogglable.class, t -> { return t.toggle(!t.isEnabled()); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerBreakpointDialog.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerBreakpointDialog.java index 43fcfff72e..4fe8d5ad36 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerBreakpointDialog.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerBreakpointDialog.java @@ -26,8 +26,8 @@ import javax.swing.*; import docking.DialogComponentProvider; import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractSetBreakpointAction; import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider; -import ghidra.dbg.target.TargetBreakpointSpecContainer; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; +import ghidra.dbg.target.TargetBreakpointSpecContainer; import ghidra.util.MessageType; import ghidra.util.Msg; import ghidra.util.layout.PairLayout; @@ -91,4 +91,8 @@ public class DebuggerBreakpointDialog extends DialogComponentProvider { this.container = container; } + public void setText(String text) { + expressionField.setText(text); + } + } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java index 8e018d4482..334786eb76 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java @@ -181,8 +181,8 @@ public class DummyTargetObject implements TargetObject { @Override public CompletableFuture> fetchAttributes() { if (!key.equals(TargetObject.DISPLAY_ATTRIBUTE_NAME)) { - if (value != null) { - String display = getName() + " : " + value; + if (getValue() != null) { + String display = getName() + " : " + getValue(); addAttribute(TargetObject.DISPLAY_ATTRIBUTE_NAME, display); } if (kind != null && !kind.equals("")) { @@ -191,8 +191,8 @@ public class DummyTargetObject implements TargetObject { else { addAttribute(TargetObject.KIND_ATTRIBUTE_NAME, "OBJECT_INTRINSIC"); } - if (value != null) { - addAttribute(TargetObject.VALUE_ATTRIBUTE_NAME, value); + if (getValue() != null) { + addAttribute(TargetObject.VALUE_ATTRIBUTE_NAME, getValue()); } if (type != null) { addAttribute(TargetObject.TYPE_ATTRIBUTE_NAME, type); @@ -234,4 +234,8 @@ public class DummyTargetObject implements TargetObject { public String toString() { return getName(); } + + public Object getValue() { + return value; + } } diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointSpec.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointSpec.java index 5ec7bc1139..f4e4fdbe46 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointSpec.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointSpec.java @@ -69,6 +69,7 @@ public interface TargetBreakpointSpec extends TargetObject, /*@Transitional*/ Ta String CONTAINER_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "container"; String EXPRESSION_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "expression"; String KINDS_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "kinds"; + String AS_BPT_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "bpt"; /** * Get the container of this breakpoint.