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