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/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