From cac43030eb260a6a526a1ed9ba23c2e281e24fd8 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Thu, 1 Apr 2021 13:37:30 -0400 Subject: [PATCH] GP-822: Fixed issue with GDB when launched process terminates immediately. --- .../gdb/manager/impl/GdbManagerImpl.java | 5 ++-- .../impl/cmd/GdbGetThreadInfoCommand.java | 5 ++++ .../model/impl/GdbModelTargetInferior.java | 28 ++++++++++++++----- .../service/model/TraceObjectManager.java | 4 +-- .../dbg/util/DebuggerCallbackReorderer.java | 4 ++- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/GdbManagerImpl.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/GdbManagerImpl.java index f50bd05a4f..16416e2166 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/GdbManagerImpl.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/GdbManagerImpl.java @@ -70,7 +70,8 @@ public class GdbManagerImpl implements GdbManager { CLI, MI2; } - private static final boolean LOG_IO = true; + private static final boolean LOG_IO = + Boolean.parseBoolean(System.getProperty("agent.gdb.manager.log")); private static final PrintWriter DBG_LOG; static { if (LOG_IO) { @@ -838,7 +839,7 @@ public class GdbManagerImpl implements GdbManager { throw new RuntimeException("GDB gave an unrecognized response", e); } catch (IllegalArgumentException e) { - Msg.warn(this, e.getMessage()); + Msg.warn(this, "Error processing GDB output", e); } } } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/cmd/GdbGetThreadInfoCommand.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/cmd/GdbGetThreadInfoCommand.java index bd726d8354..ca3152cd9a 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/cmd/GdbGetThreadInfoCommand.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/cmd/GdbGetThreadInfoCommand.java @@ -36,6 +36,11 @@ public class GdbGetThreadInfoCommand extends AbstractGdbCommandWithThreadId evt, GdbPendingCommand pending) { if (evt instanceof AbstractGdbCompletedCommandEvent) { diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferior.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferior.java index 3c6eac59a1..14e58139a6 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferior.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferior.java @@ -222,20 +222,34 @@ public class GdbModelTargetInferior protected CompletableFuture inferiorStarted(Long pid) { parent.getListeners().fire.event( parent, null, TargetEventType.PROCESS_CREATED, "Inferior " + inferior.getId() + - " started " + inferior.getExecutable() + " pid=" + inferior.getPid(), + " started " + inferior.getExecutable() + " pid=" + pid, List.of(this)); AsyncFence fence = new AsyncFence(); fence.include(modules.refreshInternal()); //fence.include(registers.refreshInternal()); fence.include(environment.refreshInternal()); fence.include(impl.gdb.listInferiors()); // HACK to update inferior.getExecutable() - // NB. Hack also updates inferior.getPid(), so ignore pid parameter return fence.ready().thenAccept(__ -> { - changeAttributes(List.of(), - Map.ofEntries(Map.entry(STATE_ATTRIBUTE_NAME, state = realState), - Map.entry(PID_ATTRIBUTE_NAME, inferior.getPid()), - Map.entry(DISPLAY_ATTRIBUTE_NAME, updateDisplay())), - "Refresh on started"); + // NB. Hack also updates inferior.getPid() + Long p = pid; + if (p == null) { + // Might have become null if it quickly terminates + // Also, we should save it before waiting on the refresh + p = inferior.getPid(); + } + if (p == null) { + changeAttributes(List.of(), + Map.ofEntries(Map.entry(STATE_ATTRIBUTE_NAME, state = realState), + Map.entry(DISPLAY_ATTRIBUTE_NAME, updateDisplay())), + "Refresh on started"); + } + else { + changeAttributes(List.of(), + Map.ofEntries(Map.entry(STATE_ATTRIBUTE_NAME, state = realState), + Map.entry(PID_ATTRIBUTE_NAME, p), + Map.entry(DISPLAY_ATTRIBUTE_NAME, updateDisplay())), + "Refresh on started"); + } }); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/TraceObjectManager.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/TraceObjectManager.java index 318751b28c..0782b9326a 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/TraceObjectManager.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/TraceObjectManager.java @@ -298,8 +298,8 @@ public class TraceObjectManager { } public void removeRegisterBank(TargetObject removed) { - ManagedThreadRecorder rec = recorder.getThreadRecorderForSuccessor(removed); - rec.removeRegisters((TargetRegisterBank) removed); + //ManagedThreadRecorder rec = recorder.getThreadRecorderForSuccessor(removed); + //rec.removeRegisters((TargetRegisterBank) removed); } public void addRegisterContainer(TargetObject added) { diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/util/DebuggerCallbackReorderer.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/util/DebuggerCallbackReorderer.java index 7383b8898f..a1a54bf74e 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/util/DebuggerCallbackReorderer.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/util/DebuggerCallbackReorderer.java @@ -165,7 +165,9 @@ public class DebuggerCallbackReorderer implements DebuggerModelListener { TargetObject obj = (TargetObject) val; if (!PathUtils.isLink(object.getPath(), ent.getKey(), obj.getPath())) { ObjectRecord rec = records.get(obj); - rec.added(); + if (rec != null) { + rec.added(); + } } } }