mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
GP-856: Fixed tests for dbgeng, added tests for dbgmodel
This commit is contained in:
parent
a61c2e1400
commit
f077adfffb
76 changed files with 917 additions and 225 deletions
|
@ -77,4 +77,9 @@ public interface DebugSymbols {
|
|||
int getSymbolOptions();
|
||||
|
||||
void setSymbolOptions(int options);
|
||||
|
||||
public int getCurrentScopeFrameIndex();
|
||||
|
||||
public void setCurrentScopeFrameIndex(int index);
|
||||
|
||||
}
|
||||
|
|
|
@ -220,4 +220,13 @@ public class DebugSymbolsImpl1 implements DebugSymbolsInternal {
|
|||
COMUtils.checkRC(jnaSymbols.SetSymbolOptions(ulOptions));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCurrentScopeFrameIndex() {
|
||||
throw new UnsupportedOperationException("Not supported by this interface");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCurrentScopeFrameIndex(int index) {
|
||||
throw new UnsupportedOperationException("Not supported by this interface");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,8 @@ import java.util.*;
|
|||
import com.sun.jna.Native;
|
||||
import com.sun.jna.WString;
|
||||
import com.sun.jna.platform.win32.WinDef.*;
|
||||
import com.sun.jna.platform.win32.WinNT.HRESULT;
|
||||
import com.sun.jna.platform.win32.COM.COMUtils;
|
||||
|
||||
import agent.dbgeng.dbgeng.*;
|
||||
import agent.dbgeng.dbgeng.DebugModule.DebugModuleName;
|
||||
|
@ -28,8 +30,6 @@ import agent.dbgeng.jna.dbgeng.DbgEngNative.DEBUG_MODULE_AND_ID;
|
|||
import agent.dbgeng.jna.dbgeng.DbgEngNative.DEBUG_SYMBOL_ENTRY;
|
||||
import agent.dbgeng.jna.dbgeng.symbols.IDebugSymbols3;
|
||||
|
||||
import com.sun.jna.platform.win32.COM.COMUtils;
|
||||
|
||||
public class DebugSymbolsImpl3 extends DebugSymbolsImpl2 {
|
||||
private final IDebugSymbols3 jnaSymbols;
|
||||
|
||||
|
@ -38,6 +38,20 @@ public class DebugSymbolsImpl3 extends DebugSymbolsImpl2 {
|
|||
this.jnaSymbols = jnaSymbols;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCurrentScopeFrameIndex() {
|
||||
ULONGByReference pulIndex = new ULONGByReference();
|
||||
COMUtils.checkRC(jnaSymbols.GetCurrentScopeFrameIndex(pulIndex));
|
||||
return pulIndex.getValue().intValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCurrentScopeFrameIndex(int index) {
|
||||
ULONG ulIndex = new ULONG(index);
|
||||
HRESULT hr = jnaSymbols.SetCurrentScopeFrameIndex(ulIndex);
|
||||
COMUtils.checkRC(hr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DebugModule getModuleByModuleName(String name, int startIndex) {
|
||||
ULONG ulStartIndex = new ULONG(startIndex);
|
||||
|
|
|
@ -104,6 +104,10 @@ public interface IDebugSymbols3 extends IDebugSymbols2 {
|
|||
}
|
||||
}
|
||||
|
||||
HRESULT GetCurrentScopeFrameIndex(ULONGByReference Index);
|
||||
|
||||
HRESULT SetCurrentScopeFrameIndex(ULONG Index);
|
||||
|
||||
HRESULT GetModuleByModuleNameWide(WString Name, ULONG StartIndex, ULONGByReference Index,
|
||||
ULONGLONGByReference Base);
|
||||
|
||||
|
|
|
@ -33,6 +33,16 @@ public class WrapIDebugSymbols3 extends WrapIDebugSymbols2 implements IDebugSymb
|
|||
super(pvInstance);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HRESULT GetCurrentScopeFrameIndex(ULONGByReference Index) {
|
||||
return _invokeHR(VTIndices3.GET_CURRENT_SCOPE_FRAME_INDEX, getPointer(), Index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HRESULT SetCurrentScopeFrameIndex(ULONG Index) {
|
||||
return _invokeHR(VTIndices3.SET_SCOPE_FRAME_BY_INDEX, getPointer(), Index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HRESULT GetModuleByModuleNameWide(WString Name, ULONG StartIndex, ULONGByReference Index,
|
||||
ULONGLONGByReference Base) {
|
||||
|
|
|
@ -22,6 +22,7 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
|
|||
public class DbgSetActiveThreadCommand extends AbstractDbgCommand<Void> {
|
||||
|
||||
private DbgThread thread;
|
||||
private Integer frameId;
|
||||
|
||||
/**
|
||||
* Set the active thread
|
||||
|
@ -33,6 +34,7 @@ public class DbgSetActiveThreadCommand extends AbstractDbgCommand<Void> {
|
|||
public DbgSetActiveThreadCommand(DbgManagerImpl manager, DbgThread thread, Integer frameId) {
|
||||
super(manager);
|
||||
this.thread = thread;
|
||||
this.frameId = frameId;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -40,6 +42,9 @@ public class DbgSetActiveThreadCommand extends AbstractDbgCommand<Void> {
|
|||
DebugThreadId id = thread.getId();
|
||||
if (id != null) {
|
||||
manager.getSystemObjects().setCurrentThreadId(id);
|
||||
if (frameId != null) {
|
||||
manager.getSymbols().setCurrentScopeFrameIndex(frameId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -121,9 +121,7 @@ public class DbgDebugEventCallbacksAdapter extends DebugEventCallbacksAdapter {
|
|||
}
|
||||
if (flags.contains(ChangeEngineState.CURRENT_THREAD)) {
|
||||
Msg.info(this, "***CurrentThread: " + argument);
|
||||
if (argument < 0) {
|
||||
return checkInterrupt(manager.processEvent(event));
|
||||
}
|
||||
return checkInterrupt(manager.processEvent(event));
|
||||
}
|
||||
if (flags.contains(ChangeEngineState.SYSTEMS)) {
|
||||
Msg.info(this, "***Systems: " + argument);
|
||||
|
|
|
@ -41,9 +41,7 @@ import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
|
|||
import agent.dbgeng.manager.breakpoint.DbgBreakpointType;
|
||||
import agent.dbgeng.manager.cmd.*;
|
||||
import agent.dbgeng.manager.evt.*;
|
||||
import agent.dbgeng.model.iface1.DbgModelTargetActiveScope;
|
||||
import agent.dbgeng.model.iface1.DbgModelTargetFocusScope;
|
||||
import agent.dbgeng.model.iface1.DbgModelTargetInterpreter;
|
||||
import agent.dbgeng.model.iface1.*;
|
||||
import ghidra.async.*;
|
||||
import ghidra.comm.util.BitmaskSet;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
|
@ -951,7 +949,16 @@ public class DbgManagerImpl implements DbgManager {
|
|||
processEvent(new DbgBreakpointModifiedEvent(bptId));
|
||||
}
|
||||
if (flags.contains(ChangeEngineState.CURRENT_THREAD)) {
|
||||
// handled above
|
||||
long id = evt.getArgument();
|
||||
for (DebugThreadId key : getThreads()) {
|
||||
if (key.id == id) {
|
||||
DbgThread thread = getThread(key);
|
||||
if (thread != null) {
|
||||
getEventListeners().fire.threadSelected(thread, null, evt.getCause());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (flags.contains(ChangeEngineState.SYSTEMS)) {
|
||||
processEvent(new DbgSystemsEvent(argument));
|
||||
|
@ -1406,6 +1413,11 @@ public class DbgManagerImpl implements DbgManager {
|
|||
return (DbgSessionImpl) eventSession;
|
||||
}
|
||||
|
||||
public CompletableFuture<Void> setActiveFrame(DbgThread thread, int index) {
|
||||
currentThread = thread;
|
||||
return execute(new DbgSetActiveThreadCommand(this, thread, index));
|
||||
}
|
||||
|
||||
public CompletableFuture<Void> setActiveThread(DbgThread thread) {
|
||||
currentThread = thread;
|
||||
return execute(new DbgSetActiveThreadCommand(this, thread, null));
|
||||
|
|
|
@ -33,7 +33,7 @@ public interface DbgModelTargetDetachable extends DbgModelTargetObject, TargetDe
|
|||
@Override
|
||||
public default CompletableFuture<Void> detach() {
|
||||
DbgProcess process = getManager().getCurrentProcess();
|
||||
return process.detach();
|
||||
return getModel().gateFuture(process.detach());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -33,7 +33,7 @@ public interface DbgModelTargetKillable extends DbgModelTargetObject, TargetKill
|
|||
@Override
|
||||
public default CompletableFuture<Void> kill() {
|
||||
DbgProcess process = getManager().getCurrentProcess();
|
||||
return process.kill();
|
||||
return getModel().gateFuture(process.kill());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -19,8 +19,6 @@ import java.util.List;
|
|||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetObject;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.async.TypeSpec;
|
||||
import ghidra.dbg.error.DebuggerUserException;
|
||||
import ghidra.dbg.target.TargetLauncher.TargetCmdLineLauncher;
|
||||
|
||||
|
@ -36,10 +34,8 @@ public interface DbgModelTargetLauncher extends DbgModelTargetObject, TargetCmdL
|
|||
|
||||
@Override
|
||||
public default CompletableFuture<Void> launch(List<String> args) {
|
||||
return AsyncUtils.sequence(TypeSpec.VOID).then(seq -> {
|
||||
getManager().launch(args).handle(seq::nextIgnore);
|
||||
}).finish().exceptionally((exc) -> {
|
||||
return getModel().gateFuture(getManager().launch(args)).exceptionally((exc) -> {
|
||||
throw new DebuggerUserException("Launch failed for " + args);
|
||||
});
|
||||
}).thenApply(__ -> null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ public interface DbgModelTargetResumable extends DbgModelTargetObject, TargetRes
|
|||
if (process == null) {
|
||||
return AsyncUtils.NIL;
|
||||
}
|
||||
return process.cont();
|
||||
return getModel().gateFuture(process.cont());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -89,6 +89,7 @@ public interface DbgModelTargetBreakpointSpec extends //
|
|||
AddressSpace space = getModel().getAddressSpace("ram");
|
||||
return requestNativeAttributes().thenAccept(attrs -> {
|
||||
if (attrs != null) {
|
||||
map.putAll(attrs);
|
||||
TargetObject addr = (TargetObject) attrs.get("Address");
|
||||
TargetObject id = (TargetObject) attrs.get("Id");
|
||||
//TargetObject unique = (TargetObject) attrs.get("UniqueID");
|
||||
|
@ -108,7 +109,7 @@ public interface DbgModelTargetBreakpointSpec extends //
|
|||
map.put(SPEC_ATTRIBUTE_NAME, this);
|
||||
map.put(EXPRESSION_ATTRIBUTE_NAME, addstr);
|
||||
map.put(KINDS_ATTRIBUTE_NAME, getKinds());
|
||||
map.put(BPT_INDEX_ATTRIBUTE_NAME, Long.decode(idstr));
|
||||
//map.put(BPT_INDEX_ATTRIBUTE_NAME, Long.decode(idstr));
|
||||
map.put(ENABLED_ATTRIBUTE_NAME, enstr.equals("-1"));
|
||||
setEnabled(enstr.equals("-1"), "Refreshed");
|
||||
int size = getBreakpointInfo().getSize();
|
||||
|
|
|
@ -32,6 +32,7 @@ public interface DbgModelTargetModule extends DbgModelTargetObject, TargetModule
|
|||
AddressSpace space = getModel().getAddressSpace("ram");
|
||||
return requestNativeAttributes().thenAccept(attrs -> {
|
||||
if (attrs != null) {
|
||||
map.putAll(attrs);
|
||||
TargetObject baseOffset2 = (TargetObject) attrs.get("BaseAddress");
|
||||
TargetObject nameAttr = (TargetObject) attrs.get("Name");
|
||||
TargetObject size = (TargetObject) attrs.get("Size");
|
||||
|
|
|
@ -24,13 +24,12 @@ import agent.dbgeng.manager.impl.DbgManagerImpl;
|
|||
import agent.dbgeng.model.AbstractDbgModel;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerModelListener;
|
||||
import ghidra.dbg.agent.InvalidatableTargetObjectIf;
|
||||
import ghidra.dbg.agent.SpiTargetObject;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.util.CollectionUtils.Delta;
|
||||
import ghidra.util.datastruct.ListenerSet;
|
||||
|
||||
public interface DbgModelTargetObject extends SpiTargetObject, InvalidatableTargetObjectIf {
|
||||
public interface DbgModelTargetObject extends SpiTargetObject {
|
||||
|
||||
@Override
|
||||
public AbstractDbgModel getModel();
|
||||
|
|
|
@ -40,10 +40,14 @@ public interface DbgModelTargetRegisterBank extends DbgModelTargetObject, Target
|
|||
readRegistersNamed(getCachedElements().keySet());
|
||||
}
|
||||
|
||||
// NB: Does anyone call this anymore?
|
||||
@Override
|
||||
public default CompletableFuture<? extends Map<String, byte[]>> readRegistersNamed(
|
||||
Collection<String> names) {
|
||||
return getModel().gateFuture(doReadRegistersNamed(names));
|
||||
}
|
||||
|
||||
public default CompletableFuture<? extends Map<String, byte[]>> doReadRegistersNamed(
|
||||
Collection<String> names) {
|
||||
DbgManagerImpl manager = getManager();
|
||||
if (manager.isWaiting()) {
|
||||
Msg.warn(this,
|
||||
|
@ -101,6 +105,10 @@ public interface DbgModelTargetRegisterBank extends DbgModelTargetObject, Target
|
|||
|
||||
@Override
|
||||
public default CompletableFuture<Void> writeRegistersNamed(Map<String, byte[]> values) {
|
||||
return getModel().gateFuture(doWriteRegistersNamed(values));
|
||||
}
|
||||
|
||||
public default CompletableFuture<Void> doWriteRegistersNamed(Map<String, byte[]> values) {
|
||||
DbgThread thread = getParentThread().getThread();
|
||||
return AsyncUtils.sequence(TypeSpec.VOID).then(seq -> {
|
||||
requestNativeElements().handle(seq::nextIgnore);
|
||||
|
|
|
@ -51,7 +51,10 @@ public interface DbgModelTargetStackFrame extends //
|
|||
public default CompletableFuture<Void> setActive() {
|
||||
DbgManagerImpl manager = getManager();
|
||||
DbgThreadImpl thread = manager.getCurrentThread();
|
||||
return manager.setActiveThread(thread);
|
||||
String name = this.getName();
|
||||
String stripped = name.substring(1, name.length() - 1);
|
||||
int index = Integer.decode(stripped);
|
||||
return manager.setActiveFrame(thread, index);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -61,6 +64,7 @@ public interface DbgModelTargetStackFrame extends //
|
|||
if (attrs == null) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
map.putAll(attrs);
|
||||
DbgModelTargetObject attributes = (DbgModelTargetObject) attrs.get("Attributes");
|
||||
if (attributes == null) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
|
|
|
@ -26,6 +26,7 @@ public interface DbgModelTargetTTD extends DbgModelTargetObject {
|
|||
if (attrs == null) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
map.putAll(attrs);
|
||||
DbgModelTargetObject attributes = (DbgModelTargetObject) attrs.get("Position");
|
||||
if (attributes == null) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
|
|
|
@ -24,7 +24,7 @@ import agent.dbgeng.manager.cmd.DbgSetActiveThreadCommand;
|
|||
import agent.dbgeng.manager.impl.*;
|
||||
import agent.dbgeng.model.iface1.*;
|
||||
import agent.dbgeng.model.impl.DbgModelTargetStackImpl;
|
||||
import ghidra.dbg.target.TargetThread;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
|
||||
public interface DbgModelTargetThread extends //
|
||||
|
@ -55,7 +55,14 @@ public interface DbgModelTargetThread extends //
|
|||
}
|
||||
}
|
||||
|
||||
public void threadStateChangedSpecific(DbgState state, DbgReason reason);
|
||||
public default void threadStateChangedSpecific(DbgState state, DbgReason reason) {
|
||||
TargetRegisterContainer container =
|
||||
(TargetRegisterContainer) getCachedAttribute("Registers");
|
||||
TargetRegisterBank bank = (TargetRegisterBank) container.getCachedAttribute("User");
|
||||
if (state.equals(DbgState.STOPPED)) {
|
||||
bank.readRegistersNamed(getCachedElements().keySet());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public default CompletableFuture<Void> setActive() {
|
||||
|
|
|
@ -25,10 +25,10 @@ public interface DbgModelTargetThreadContainer extends //
|
|||
DbgModelTargetEventScope, //
|
||||
DbgEventsListenerAdapter {
|
||||
|
||||
public DbgModelTargetThread getTargetThread(DbgThread thread);
|
||||
|
||||
public void threadCreated(DbgThread thread);
|
||||
|
||||
public void threadExited(DebugThreadId threadId);
|
||||
|
||||
public DbgModelTargetThread getTargetThread(DbgThread thread);
|
||||
|
||||
}
|
||||
|
|
|
@ -26,9 +26,14 @@ import ghidra.dbg.target.schema.*;
|
|||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.program.model.address.*;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "MemoryRegion", elements = {
|
||||
@TargetElementType(type = Void.class) }, attributes = {
|
||||
@TargetAttributeType(name = TargetMemoryRegion.MEMORY_ATTRIBUTE_NAME, type = DbgModelTargetMemoryContainerImpl.class),
|
||||
@TargetObjectSchemaInfo(
|
||||
name = "MemoryRegion",
|
||||
elements = {
|
||||
@TargetElementType(type = Void.class) },
|
||||
attributes = {
|
||||
@TargetAttributeType(
|
||||
name = TargetMemoryRegion.MEMORY_ATTRIBUTE_NAME,
|
||||
type = DbgModelTargetMemoryContainerImpl.class),
|
||||
@TargetAttributeType(name = "BaseAddress", type = Address.class),
|
||||
@TargetAttributeType(name = "EndAddress", type = Address.class),
|
||||
@TargetAttributeType(name = "RegionSize", type = String.class),
|
||||
|
|
|
@ -18,10 +18,8 @@ package agent.dbgeng.model.impl;
|
|||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import agent.dbgeng.manager.*;
|
||||
import agent.dbgeng.manager.impl.DbgManagerImpl;
|
||||
import agent.dbgeng.model.iface1.DbgModelTargetFocusScope;
|
||||
import agent.dbgeng.model.iface2.*;
|
||||
import ghidra.dbg.target.TargetFocusScope;
|
||||
|
@ -30,19 +28,44 @@ import ghidra.dbg.target.schema.*;
|
|||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.program.model.address.Address;
|
||||
|
||||
@TargetObjectSchemaInfo(name = "StackFrame", elements = {
|
||||
@TargetElementType(type = Void.class) }, attributes = {
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.FUNC_ATTRIBUTE_NAME, type = String.class),
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.FUNC_TABLE_ENTRY_ATTRIBUTE_NAME, type = String.class),
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.INST_OFFSET_ATTRIBUTE_NAME, type = String.class),
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.FRAME_OFFSET_ATTRIBUTE_NAME, type = String.class),
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.RETURN_OFFSET_ATTRIBUTE_NAME, type = String.class),
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.STACK_OFFSET_ATTRIBUTE_NAME, type = String.class),
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.VIRTUAL_ATTRIBUTE_NAME, type = Boolean.class),
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.PARAM0_ATTRIBUTE_NAME, type = String.class),
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.PARAM1_ATTRIBUTE_NAME, type = String.class),
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.PARAM2_ATTRIBUTE_NAME, type = String.class),
|
||||
@TargetAttributeType(name = DbgModelTargetStackFrame.PARAM3_ATTRIBUTE_NAME, type = String.class),
|
||||
@TargetObjectSchemaInfo(
|
||||
name = "StackFrame",
|
||||
elements = {
|
||||
@TargetElementType(type = Void.class) },
|
||||
attributes = {
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetStackFrame.FUNC_ATTRIBUTE_NAME,
|
||||
type = String.class),
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetStackFrame.FUNC_TABLE_ENTRY_ATTRIBUTE_NAME,
|
||||
type = String.class),
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetStackFrame.INST_OFFSET_ATTRIBUTE_NAME,
|
||||
type = String.class),
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetStackFrame.FRAME_OFFSET_ATTRIBUTE_NAME,
|
||||
type = String.class),
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetStackFrame.RETURN_OFFSET_ATTRIBUTE_NAME,
|
||||
type = String.class),
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetStackFrame.STACK_OFFSET_ATTRIBUTE_NAME,
|
||||
type = String.class),
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetStackFrame.VIRTUAL_ATTRIBUTE_NAME,
|
||||
type = Boolean.class),
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetStackFrame.PARAM0_ATTRIBUTE_NAME,
|
||||
type = String.class),
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetStackFrame.PARAM1_ATTRIBUTE_NAME,
|
||||
type = String.class),
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetStackFrame.PARAM2_ATTRIBUTE_NAME,
|
||||
type = String.class),
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetStackFrame.PARAM3_ATTRIBUTE_NAME,
|
||||
type = String.class),
|
||||
@TargetAttributeType(type = Void.class) })
|
||||
public class DbgModelTargetStackFrameImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetStackFrame {
|
||||
|
@ -137,12 +160,6 @@ public class DbgModelTargetStackFrameImpl extends DbgModelTargetObjectImpl
|
|||
), "Refreshed");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> setActive() {
|
||||
DbgManagerImpl manager = getManager();
|
||||
return manager.setActiveThread(thread.getThread());
|
||||
}
|
||||
|
||||
@Override
|
||||
public TargetObject getThread() {
|
||||
return thread.getParent();
|
||||
|
|
|
@ -121,7 +121,7 @@ public class DbgModelTargetThreadImpl extends DbgModelTargetObjectImpl
|
|||
STATE_ATTRIBUTE_NAME, targetState, //
|
||||
TargetEnvironment.ARCH_ATTRIBUTE_NAME, executionType //
|
||||
), reason.desc());
|
||||
setExecutionState(targetState, reason.desc());
|
||||
//setExecutionState(targetState, reason.desc());
|
||||
registers.threadStateChangedSpecific(state, reason);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue