From 8de1cd50414c6c1f361e4d0a86acfcdef109d5db Mon Sep 17 00:00:00 2001 From: d-millar <33498836+d-millar@users.noreply.github.com> Date: Tue, 22 Mar 2022 11:31:56 -0400 Subject: [PATCH] GP-1812: last reset GP-1812: another revert GP-1812: moving changes to alt branches GP-1812: comment in goto no longer applies to registers GP-1812: new providers not retrieving configState GP-1812: NPE mentioned in #4059 GP-1812: MISSING+ENABLED -> ENABLED, not DISABLED_ENABLED GP-1812: name inconsistency in breakpoints GP-1812: String->Address to assist navigation GP-1812: force memory refresh on module load GP-1812: concurrency error processing memory GP-1812: thread/process fix for dbgmodel; restricting changeElements to matching container matching process GP-1812: make currentThread/Process consistent GP-1812: fix for failed DebugClient cleanup; callback error msg issue --- .../cmd/DbgListMemoryRegionsCommand.java | 7 +++++- .../dbgeng/manager/impl/DbgManagerImpl.java | 11 +++++++--- .../model/iface2/DbgModelTargetThread.java | 6 ++--- ...DbgModelTargetBreakpointContainerImpl.java | 16 ++++++++++++++ .../DbgModelTargetProcessContainerImpl.java | 2 +- .../impl/DbgModelTargetRegisterImpl.java | 11 +++++++--- .../model/impl/DbgModelTargetThreadImpl.java | 22 ++++++++++++++----- .../model/DefaultBreakpointRecorder.java | 10 ++++++--- 8 files changed, 65 insertions(+), 20 deletions(-) diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/cmd/DbgListMemoryRegionsCommand.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/cmd/DbgListMemoryRegionsCommand.java index 410a86460a..58499399e7 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/cmd/DbgListMemoryRegionsCommand.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/cmd/DbgListMemoryRegionsCommand.java @@ -50,11 +50,16 @@ public class DbgListMemoryRegionsCommand extends AbstractDbgCommand toRemove = new ArrayList<>(); for (Entry entry : memory.entrySet()) { if (memoryRegions.contains(entry.getValue())) { continue; // Do nothing, we're in sync } - manager.removeMemory(entry.getKey()); + toRemove.add(entry.getKey()); + //manager.removeMemory(entry.getKey()); + } + for (Long key : toRemove) { + manager.removeMemory(key); } return memoryRegions; } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java index 88b0f61476..7ff9bced81 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java @@ -406,10 +406,12 @@ public class DbgManagerImpl implements DbgManager { //TODO: server.terminate(); engThread.execute(100, dbgeng -> { Msg.debug(this, "Disconnecting DebugClient from session"); - dbgeng.endSession(DebugEndSessionFlags.DEBUG_END_DISCONNECT); + dbgeng.endSession(DebugEndSessionFlags.DEBUG_END_PASSIVE); dbgeng.setOutputCallbacks(null); + dbgeng.setEventCallbacks(null); + dbgeng.setInputCallbacks(null); + engThread.shutdown(); }); - engThread.shutdown(); try { engThread.awaitTermination(5000, TimeUnit.MILLISECONDS); } @@ -942,7 +944,8 @@ public class DbgManagerImpl implements DbgManager { //System.err.println("RUNNING " + id); dbgState = DbgState.RUNNING; // NB: Needed by GADP variants, but not IN-VM - getEventListeners().fire.memoryChanged(currentProcess, 0L, 0, evt.getCause()); + getEventListeners().fire.memoryChanged(currentProcess, 0L, 0, + evt.getCause()); processEvent(new DbgRunningEvent(eventThread.getId())); } if (!threads.containsValue(eventThread)) { @@ -1483,11 +1486,13 @@ public class DbgManagerImpl implements DbgManager { public CompletableFuture setActiveFrame(DbgThread thread, int index) { currentThread = thread; + currentProcess = thread.getProcess(); return execute(new DbgSetActiveThreadCommand(this, thread, index)); } public CompletableFuture setActiveThread(DbgThread thread) { currentThread = thread; + currentProcess = thread.getProcess(); return execute(new DbgSetActiveThreadCommand(this, thread, null)); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThread.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThread.java index 903b83ff65..4067fa2059 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThread.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThread.java @@ -20,7 +20,6 @@ import java.util.concurrent.CompletableFuture; import agent.dbgeng.dbgeng.DebugSystemObjects; import agent.dbgeng.dbgeng.DebugThreadId; import agent.dbgeng.manager.*; -import agent.dbgeng.manager.cmd.DbgSetActiveThreadCommand; import agent.dbgeng.manager.impl.*; import agent.dbgeng.model.iface1.*; import agent.dbgeng.model.impl.DbgModelTargetStackImpl; @@ -58,8 +57,9 @@ public interface DbgModelTargetThread extends // @Override public default CompletableFuture setActive() { DbgManagerImpl manager = getManager(); - DbgThread thread = getThread(); - return manager.execute(new DbgSetActiveThreadCommand(manager, thread, null)); + DbgProcessImpl process = (DbgProcessImpl) getParentProcess().getProcess(); + manager.setActiveProcess(process); + return manager.setActiveThread(getThread()); } public DbgModelTargetStackImpl getStack(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointContainerImpl.java index 685920d94a..b6e8ef76a5 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetBreakpointContainerImpl.java @@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import agent.dbgeng.manager.DbgCause; +import agent.dbgeng.manager.DbgProcess; import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo; import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.model.iface2.*; @@ -54,19 +55,34 @@ public class DbgModelTargetBreakpointContainerImpl extends DbgModelTargetObjectI ), "Initialized"); } + private boolean isMatch(DbgBreakpointInfo info) { + DbgProcess bptProc = info.getProc(); + DbgModelTargetProcess parentProcess = getParentProcess(); + return parentProcess.getProcess().equals(bptProc); + } + @Override public void breakpointCreated(DbgBreakpointInfo info, DbgCause cause) { + if (!isMatch(info)) { + return; + } changeElements(List.of(), List.of(getTargetBreakpointSpec(info)), Map.of(), "Created"); } @Override public void breakpointModified(DbgBreakpointInfo newInfo, DbgBreakpointInfo oldInfo, DbgCause cause) { + if (!isMatch(newInfo)) { + return; + } getTargetBreakpointSpec(oldInfo).updateInfo(oldInfo, newInfo, "Modified"); } @Override public void breakpointDeleted(DbgBreakpointInfo info, DbgCause cause) { + if (!isMatch(info)) { + return; + } DbgModelImpl impl = (DbgModelImpl) model; impl.deleteModelObject(info.getDebugBreakpoint()); changeElements(List.of( // diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessContainerImpl.java index 28abb2868e..e322c2af8d 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetProcessContainerImpl.java @@ -105,7 +105,7 @@ public class DbgModelTargetProcessContainerImpl extends DbgModelTargetObjectImpl } DbgModelTargetMemoryContainer memory = process.getMemory(); if (memory != null) { - memory.requestElements(false); + memory.requestElements(true); } } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterImpl.java index f131e301ce..5a1a16b772 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterImpl.java @@ -25,9 +25,14 @@ import ghidra.dbg.target.TargetRegister; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; -@TargetObjectSchemaInfo(name = "RegisterDescriptor", elements = { - @TargetElementType(type = Void.class) }, attributes = { - @TargetAttributeType(name = TargetRegister.CONTAINER_ATTRIBUTE_NAME, type = DbgModelTargetRegisterContainerImpl.class), +@TargetObjectSchemaInfo( + name = "RegisterDescriptor", + elements = { + @TargetElementType(type = Void.class) }, + attributes = { + @TargetAttributeType( + name = TargetRegister.CONTAINER_ATTRIBUTE_NAME, + type = DbgModelTargetRegisterContainerImpl.class), @TargetAttributeType(type = Void.class) }) public class DbgModelTargetRegisterImpl extends DbgModelTargetObjectImpl implements DbgModelTargetRegister { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadImpl.java index edf58dbd0c..0df542100d 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadImpl.java @@ -21,7 +21,6 @@ import java.util.concurrent.CompletableFuture; import agent.dbgeng.dbgeng.DebugThreadId; import agent.dbgeng.manager.*; -import agent.dbgeng.manager.cmd.DbgSetActiveThreadCommand; import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.model.iface1.DbgModelTargetFocusScope; import agent.dbgeng.model.iface2.*; @@ -30,10 +29,21 @@ import ghidra.dbg.target.TargetFocusScope; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; -@TargetObjectSchemaInfo(name = "Thread", elements = { - @TargetElementType(type = Void.class) }, attributes = { - @TargetAttributeType(name = "Registers", type = DbgModelTargetRegisterContainerImpl.class, required = true, fixed = true), - @TargetAttributeType(name = "Stack", type = DbgModelTargetStackImpl.class, required = true, fixed = true), +@TargetObjectSchemaInfo( + name = "Thread", + elements = { + @TargetElementType(type = Void.class) }, + attributes = { + @TargetAttributeType( + name = "Registers", + type = DbgModelTargetRegisterContainerImpl.class, + required = true, + fixed = true), + @TargetAttributeType( + name = "Stack", + type = DbgModelTargetStackImpl.class, + required = true, + fixed = true), @TargetAttributeType(name = TargetEnvironment.ARCH_ATTRIBUTE_NAME, type = String.class), @TargetAttributeType(type = Void.class) }) public class DbgModelTargetThreadImpl extends DbgModelTargetObjectImpl @@ -146,7 +156,7 @@ public class DbgModelTargetThreadImpl extends DbgModelTargetObjectImpl @Override public CompletableFuture setActive() { DbgManagerImpl manager = getManager(); - return manager.execute(new DbgSetActiveThreadCommand(manager, thread, null)); + return manager.setActiveThread(thread); } public DbgModelTargetRegisterContainerAndBank getRegisters() { diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultBreakpointRecorder.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultBreakpointRecorder.java index 485799e991..38da4dd81c 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultBreakpointRecorder.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultBreakpointRecorder.java @@ -166,9 +166,13 @@ public class DefaultBreakpointRecorder implements ManagedBreakpointRecorder { else { traceBpt.setClearedSnap(snap - 1); } - breakpointManager.placeBreakpoint(path, snap, range, - traceBpt.getThreads(), traceBpt.getKinds(), traceBpt.isEnabled(snap), - traceBpt.getComment()); + TraceBreakpoint newtraceBpt = + breakpointManager.placeBreakpoint(path, snap, range, + traceBpt.getThreads(), traceBpt.getKinds(), traceBpt.isEnabled(snap), + traceBpt.getComment()); + // placeBreakpoint resets the name - maybe pass name in? + newtraceBpt.setName(traceBpt.getName()); + } catch (DuplicateNameException e) { // Split, and length matters not