diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DebuggerMappingOpinion.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DebuggerMappingOpinion.java index 6459107cd7..fef2f79755 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DebuggerMappingOpinion.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DebuggerMappingOpinion.java @@ -48,7 +48,7 @@ public interface DebuggerMappingOpinion extends ExtensionPoint { } catch (Throwable t) { Msg.error(DebuggerMappingOpinion.class, - "Problem querying opinion " + opinion + " for recording/mapping offers"); + "Problem querying opinion " + opinion + " for recording/mapping offers: ", t); } } result.sort(HIGHEST_CONFIDENCE_FIRST); @@ -69,6 +69,10 @@ public interface DebuggerMappingOpinion extends ExtensionPoint { DebuggerObjectModel model = process.getModel(); List pathToEnv = model.getRootSchema().searchForSuitable(TargetEnvironment.class, process.getPath()); + if (pathToEnv == null) { + Msg.error(this, "Could not find path to environment"); + return Set.of(); + } TargetEnvironment env = (TargetEnvironment) model.getModelObject(pathToEnv); return offersForEnv(env, process); } diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/platform/gdb/DefaultGdbDebuggerMappingOpinionTest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/platform/gdb/DefaultGdbDebuggerMappingOpinionTest.java new file mode 100644 index 0000000000..7fea39f565 --- /dev/null +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/platform/gdb/DefaultGdbDebuggerMappingOpinionTest.java @@ -0,0 +1,43 @@ +package ghidra.app.plugin.core.debug.platform.gdb; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.*; +import java.util.stream.Collectors; + +import org.junit.Test; + +import ghidra.app.plugin.core.debug.mapping.DebuggerMappingOffer; +import ghidra.app.plugin.core.debug.mapping.DebuggerMappingOpinion; +import ghidra.app.plugin.core.debug.platform.gdb.DefaultGdbDebuggerMappingOpinion.GdbDefaultOffer; +import ghidra.dbg.model.TestDebuggerObjectModel; +import ghidra.dbg.model.TestTargetProcess; +import ghidra.program.model.lang.LanguageID; +import ghidra.test.AbstractGhidraHeadlessIntegrationTest; + +public class DefaultGdbDebuggerMappingOpinionTest extends AbstractGhidraHeadlessIntegrationTest { + @Test + public void testQueryOpinionsIncludesLdefsBased() { + TestDebuggerObjectModel model = new TestDebuggerObjectModel(); + + // TODO: A good number of names are definitely missing from ldefs :( + model.session.environment.changeAttributes(List.of(), Map.ofEntries( + Map.entry("_debugger", "gdb"), + Map.entry("_arch", "armv5t"), + Map.entry("_endian", "little")), + "Testing"); + + TestTargetProcess process = model.addProcess(1234); + + List offers = DebuggerMappingOpinion.queryOpinions(process); + assertFalse(offers.isEmpty()); + Set ldefsOnes = offers.stream() + .filter(o -> o.getClass().equals(GdbDefaultOffer.class)) + .collect(Collectors.toSet()); + assertFalse(ldefsOnes.isEmpty()); + Set ids = + ldefsOnes.stream().map(o -> o.getTraceLanguageID()).collect(Collectors.toSet()); + assertTrue(ids.contains(new LanguageID("ARM:LE:32:v5t"))); + } +} diff --git a/Ghidra/Debug/Framework-Debugging/src/test/resources/ghidra/dbg/model/test_schema.xml b/Ghidra/Debug/Framework-Debugging/src/test/resources/ghidra/dbg/model/test_schema.xml index 61db60cd05..33411e24be 100644 --- a/Ghidra/Debug/Framework-Debugging/src/test/resources/ghidra/dbg/model/test_schema.xml +++ b/Ghidra/Debug/Framework-Debugging/src/test/resources/ghidra/dbg/model/test_schema.xml @@ -24,6 +24,7 @@ +