From f33d94d421d8aeb6cd6ef5d50765b083363d589e Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Mon, 3 May 2021 09:33:42 -0400 Subject: [PATCH 1/3] GP-0: Protecting from errors in broken opinions. Fixing ARM opinion. --- .../core/debug/mapping/DebuggerMappingOpinion.java | 13 +++++++++++-- .../platform/GdbArmDebuggerMappingOpinion.java | 4 ++++ 2 files changed, 15 insertions(+), 2 deletions(-) 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 3b642aa007..6459107cd7 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 @@ -19,6 +19,7 @@ import java.util.*; import ghidra.dbg.DebuggerObjectModel; import ghidra.dbg.target.*; +import ghidra.util.Msg; import ghidra.util.classfinder.ClassSearcher; import ghidra.util.classfinder.ExtensionPoint; @@ -29,6 +30,7 @@ public interface DebuggerMappingOpinion extends ExtensionPoint { /** * Query all known opinions for recording/tracing a debug session * + *

* The returned offers are ordered highest-confidence first. * * @param target the target to be recorded, usually a process @@ -38,8 +40,15 @@ public interface DebuggerMappingOpinion extends ExtensionPoint { List result = new ArrayList<>(); for (DebuggerMappingOpinion opinion : ClassSearcher .getInstances(DebuggerMappingOpinion.class)) { - synchronized (result) { - result.addAll(opinion.getOffers(target)); + try { + Set offers = opinion.getOffers(target); + synchronized (result) { + result.addAll(offers); + } + } + catch (Throwable t) { + Msg.error(DebuggerMappingOpinion.class, + "Problem querying opinion " + opinion + " for recording/mapping offers"); } } result.sort(HIGHEST_CONFIDENCE_FIRST); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbArmDebuggerMappingOpinion.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbArmDebuggerMappingOpinion.java index 0d771e55d5..010cffb3b7 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbArmDebuggerMappingOpinion.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbArmDebuggerMappingOpinion.java @@ -45,7 +45,11 @@ public class GdbArmDebuggerMappingOpinion implements DebuggerMappingOpinion { } } + @Override public Set offersForEnv(TargetEnvironment env, TargetProcess process) { + if (env == null) { + return Set.of(); + } if (!env.getDebugger().toLowerCase().contains("gdb")) { return Set.of(); } From ceedbe6c9fcbe5f0dc4e54dc35f144f2c7175815 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Mon, 3 May 2021 11:35:02 -0400 Subject: [PATCH 2/3] GP-0: Another attempt to resolve CI hangs. --- .../AbstractModelForGdbAttacherTest.java | 32 +++++++++++++++++++ .../java/ghidra/dbg/testutil/DummyProc.java | 4 +++ 2 files changed, 36 insertions(+) diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/AbstractModelForGdbAttacherTest.java b/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/AbstractModelForGdbAttacherTest.java index 6c6423dc82..bdd7b7143f 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/AbstractModelForGdbAttacherTest.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/AbstractModelForGdbAttacherTest.java @@ -20,6 +20,7 @@ import static org.junit.Assert.assertTrue; import java.util.List; +import ghidra.async.AsyncUtils.TemperamentalRunnable; import ghidra.dbg.target.TargetEnvironment; import ghidra.dbg.target.TargetMethod.TargetParameterMap; import ghidra.dbg.test.AbstractDebuggerModelAttacherTest; @@ -49,4 +50,35 @@ public abstract class AbstractModelForGdbAttacherTest extends AbstractDebuggerMo assertEquals("little", environment.getEndian()); assertTrue(environment.getDebugger().toLowerCase().contains("gdb")); } + + // NB. Gradle/Java hangs on process clean-up if target is still attached + protected void withDetachAndForcefulDummyDestruction(TemperamentalRunnable test) + throws Throwable { + try { + test.run(); + runTestDetach(getAttachSpecimen()); + } + finally { + if (dummy == null) { + return; + } + dummy.process.destroy(); + dummy.process.destroyForcibly(); + } + } + + @Override + public void testAttachByObj() throws Throwable { + withDetachAndForcefulDummyDestruction(() -> super.testAttachByObj()); + } + + @Override + public void testAttachByPid() throws Throwable { + withDetachAndForcefulDummyDestruction(() -> super.testAttachByPid()); + } + + @Override + public void testAttachByPidThenResumeInterrupt() throws Throwable { + withDetachAndForcefulDummyDestruction(() -> super.testAttachByPidThenResumeInterrupt()); + } } diff --git a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DummyProc.java b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DummyProc.java index 07a4638d23..a91b73da92 100644 --- a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DummyProc.java +++ b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DummyProc.java @@ -16,10 +16,12 @@ package ghidra.dbg.testutil; import java.io.*; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import ghidra.framework.Application; +import ghidra.util.Msg; public class DummyProc implements AutoCloseable { public final Process process; @@ -65,11 +67,13 @@ public class DummyProc implements AutoCloseable { .start(); pid = process.pid(); + Msg.info(this, "Started dummy process pid = " + pid + ": " + List.of(args)); } @Override public void close() throws Exception { if (!process.destroyForcibly().waitFor(1000, TimeUnit.MILLISECONDS)) { + Msg.error(this, "Could not terminate process " + pid); throw new TimeoutException("Could not terminate process " + pid); } } From 90212b0b5d59b24d76b02eacfa6105c1f75a31e3 Mon Sep 17 00:00:00 2001 From: d-millar <33498836+d-millar@users.noreply.github.com> Date: Mon, 3 May 2021 19:09:30 +0000 Subject: [PATCH 3/3] GP-0: suppressing pop-up window for internal errors on Execute --- .../dbgeng/impl/dbgeng/control/DebugControlImpl1.java | 6 +++++- .../dbgeng/impl/dbgeng/control/DebugControlImpl4.java | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/impl/dbgeng/control/DebugControlImpl1.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/impl/dbgeng/control/DebugControlImpl1.java index ac8936f9e2..8f5974245a 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/impl/dbgeng/control/DebugControlImpl1.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/impl/dbgeng/control/DebugControlImpl1.java @@ -130,7 +130,11 @@ public class DebugControlImpl1 implements DebugControlInternal { BitmaskSet flags) { ULONG ctlMask = new ULONG(ctl.getBitmask()); ULONG flagMask = new ULONG(flags.getBitmask()); - COMUtils.checkRC(jnaControl.Execute(ctlMask, cmd, flagMask)); + HRESULT hr = jnaControl.Execute(ctlMask, cmd, flagMask); + if (hr.equals(COMUtilsExtra.E_INTERNALEXCEPTION)) { + return; + } + COMUtils.checkRC(hr); } @Override diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/impl/dbgeng/control/DebugControlImpl4.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/impl/dbgeng/control/DebugControlImpl4.java index 30ddba27e2..fa67c30ddc 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/impl/dbgeng/control/DebugControlImpl4.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/impl/dbgeng/control/DebugControlImpl4.java @@ -19,9 +19,11 @@ import com.sun.jna.Native; import com.sun.jna.WString; import com.sun.jna.platform.win32.WinDef.ULONG; import com.sun.jna.platform.win32.WinDef.ULONGByReference; +import com.sun.jna.platform.win32.WinNT.HRESULT; import com.sun.jna.platform.win32.COM.COMUtils; import com.sun.jna.ptr.PointerByReference; +import agent.dbgeng.dbgeng.COMUtilsExtra; import agent.dbgeng.dbgeng.DebugBreakpoint; import agent.dbgeng.dbgeng.DebugBreakpoint.BreakType; import agent.dbgeng.dbgeng.DebugValue.DebugValueType; @@ -90,7 +92,11 @@ public class DebugControlImpl4 extends DebugControlImpl3 { BitmaskSet flags) { ULONG ctlMask = new ULONG(ctl.getBitmask()); ULONG flagMask = new ULONG(flags.getBitmask()); - COMUtils.checkRC(jnaControl.ExecuteWide(ctlMask, new WString(cmd), flagMask)); + HRESULT hr = jnaControl.ExecuteWide(ctlMask, new WString(cmd), flagMask); + if (hr.equals(COMUtilsExtra.E_INTERNALEXCEPTION)) { + return; + } + COMUtils.checkRC(hr); } @Override