mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 19:42:36 +02:00
GP-0: Fixing DebuggerTraceManagerService tests
This commit is contained in:
parent
56559fe62a
commit
34e67ea909
9 changed files with 42 additions and 60 deletions
|
@ -236,8 +236,8 @@ public class DefaultTraceRecorder implements TraceRecorder {
|
|||
|
||||
@Override
|
||||
public TraceStackFrame getTraceStackFrame(TargetStackFrame frame) {
|
||||
// THIS IS UNUSED
|
||||
return null;
|
||||
// Not the most efficient, but only used in testing.
|
||||
return getTraceStackFrameForSuccessor(frame);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -984,10 +984,10 @@ public class DebuggerTraceManagerServicePlugin extends Plugin
|
|||
return thread;
|
||||
}
|
||||
}
|
||||
if (!Objects.equals(prev.getTrace(), resolved.getTrace())) {
|
||||
return recorder.getTarget();
|
||||
}
|
||||
return null;
|
||||
//if (!Objects.equals(prev.getTrace(), resolved.getTrace())) {
|
||||
return recorder.getTarget();
|
||||
//}
|
||||
//return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -33,6 +33,7 @@ import ghidra.dbg.model.TestTargetStackFrameHasRegisterBank;
|
|||
import ghidra.framework.model.DomainFile;
|
||||
import ghidra.trace.database.thread.DBTraceThread;
|
||||
import ghidra.trace.model.Trace;
|
||||
import ghidra.trace.model.thread.TraceThread;
|
||||
import ghidra.util.SystemUtilities;
|
||||
import ghidra.util.database.UndoableTransaction;
|
||||
|
||||
|
@ -307,30 +308,30 @@ public class DebuggerTraceManagerServiceTest extends AbstractGhidraHeadedDebugge
|
|||
traceManager.activateTrace(trace);
|
||||
waitForSwing();
|
||||
|
||||
assertEquals(0, recorder.getSnap());
|
||||
assertEquals(0, traceManager.getCurrentSnap());
|
||||
long initSnap = recorder.getSnap();
|
||||
assertEquals(initSnap, traceManager.getCurrentSnap());
|
||||
|
||||
recorder.forceSnapshot();
|
||||
waitForSwing();
|
||||
|
||||
assertEquals(1, recorder.getSnap());
|
||||
assertEquals(1, traceManager.getCurrentSnap());
|
||||
assertEquals(initSnap + 1, recorder.getSnap());
|
||||
assertEquals(initSnap + 1, traceManager.getCurrentSnap());
|
||||
|
||||
traceManager.setAutoActivatePresent(false);
|
||||
|
||||
recorder.forceSnapshot();
|
||||
waitForSwing();
|
||||
|
||||
assertEquals(2, recorder.getSnap());
|
||||
assertEquals(1, traceManager.getCurrentSnap());
|
||||
assertEquals(initSnap + 2, recorder.getSnap());
|
||||
assertEquals(initSnap + 1, traceManager.getCurrentSnap());
|
||||
|
||||
traceManager.setAutoActivatePresent(true);
|
||||
|
||||
recorder.forceSnapshot();
|
||||
waitForSwing();
|
||||
|
||||
assertEquals(3, recorder.getSnap());
|
||||
assertEquals(3, traceManager.getCurrentSnap());
|
||||
assertEquals(initSnap + 3, recorder.getSnap());
|
||||
assertEquals(initSnap + 3, traceManager.getCurrentSnap());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -344,6 +345,8 @@ public class DebuggerTraceManagerServiceTest extends AbstractGhidraHeadedDebugge
|
|||
new TestDebuggerTargetTraceMapper(mb.testProcess1));
|
||||
Trace trace = recorder.getTrace();
|
||||
|
||||
waitForValue(() -> modelService.getTarget(trace));
|
||||
|
||||
traceManager.openTrace(trace);
|
||||
waitForSwing();
|
||||
|
||||
|
@ -356,16 +359,22 @@ public class DebuggerTraceManagerServiceTest extends AbstractGhidraHeadedDebugge
|
|||
assertNull(traceManager.getCurrentThread());
|
||||
assertEquals(mb.testProcess1, mb.testModel.session.getFocus());
|
||||
|
||||
traceManager.activateThread(recorder.getTraceThread(mb.testThread1));
|
||||
TraceThread thread = waitForValue(() -> recorder.getTraceThread(mb.testThread1));
|
||||
traceManager.activateThread(thread);
|
||||
waitForSwing();
|
||||
|
||||
assertEquals(mb.testThread1, mb.testModel.session.getFocus());
|
||||
|
||||
TestTargetStack stack = mb.testThread1.addStack();
|
||||
// Note, push simply moves the data, the new frame still has the higher index
|
||||
TestTargetStackFrameHasRegisterBank frame0 = stack.pushFrameHasBank();
|
||||
TestTargetStackFrameHasRegisterBank frame1 = stack.pushFrameHasBank();
|
||||
TestTargetStackFrameHasRegisterBank frame0 = stack.pushFrameHasBank(mb.addr(0x00400000));
|
||||
TestTargetStackFrameHasRegisterBank frame1 = stack.pushFrameHasBank(mb.addr(0x00400100));
|
||||
waitForDomainObject(trace);
|
||||
// Eww. I'm starting to think this could be cheating, considering focus sync at launch
|
||||
waitForValue(() -> recorder.getTraceStackFrame(frame0));
|
||||
waitForValue(() -> recorder.getTraceStackFrame(frame1));
|
||||
waitForValue(() -> recorder.getTargetStackFrame(thread, 0));
|
||||
waitForValue(() -> recorder.getTargetStackFrame(thread, 1));
|
||||
|
||||
// Starting with 0 results in no change in coordinates, so ignored
|
||||
traceManager.activateFrame(1);
|
||||
|
@ -418,8 +427,8 @@ public class DebuggerTraceManagerServiceTest extends AbstractGhidraHeadedDebugge
|
|||
|
||||
TestTargetStack stack = mb.testThread1.addStack();
|
||||
// Note, push simply moves the data, the new frame still has the higher index
|
||||
TestTargetStackFrameHasRegisterBank frame0 = stack.pushFrameHasBank();
|
||||
TestTargetStackFrameHasRegisterBank frame1 = stack.pushFrameHasBank();
|
||||
TestTargetStackFrameHasRegisterBank frame0 = stack.pushFrameHasBank(mb.addr(0x00400000));
|
||||
TestTargetStackFrameHasRegisterBank frame1 = stack.pushFrameHasBank(mb.addr(0x00400100));
|
||||
waitForDomainObject(trace);
|
||||
|
||||
// Starting with 0 results in no change in coordinates, so ignored
|
||||
|
|
|
@ -15,8 +15,6 @@
|
|||
*/
|
||||
package ghidra.dbg.util;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import ghidra.util.Msg;
|
||||
|
||||
public enum ValueUtils {
|
||||
|
@ -44,19 +42,4 @@ public enum ValueUtils {
|
|||
}
|
||||
return cls.cast(val);
|
||||
}
|
||||
|
||||
public static boolean expectBoolean(Object val, Object logObj, String attributeName,
|
||||
boolean fallback, boolean required) {
|
||||
Boolean exp = expectType(val, Boolean.class, logObj, attributeName, null, required);
|
||||
if (exp == null) {
|
||||
return fallback;
|
||||
}
|
||||
return exp;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T extends Collection<E>, E> Class<T> colOf(Class<? super T> colType,
|
||||
Class<E> elemType) {
|
||||
return (Class<T>) colType;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -92,7 +92,7 @@ public class TestDebuggerModelBuilder {
|
|||
* Create register banks which are the top frame of stacks attributed to the threads.
|
||||
*/
|
||||
public void createTestThreadStacksAndFramesAreRegisterBanks() {
|
||||
applyThreadRegisterBankConvention(t -> t.addStack().pushFrameIsBank());
|
||||
applyThreadRegisterBankConvention(t -> t.addStack().pushFrameIsBank(addr(0x00400000)));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -100,6 +100,7 @@ public class TestDebuggerModelBuilder {
|
|||
* threads.
|
||||
*/
|
||||
public void createTestThreadStacksAndFramesHaveRegisterBanks() {
|
||||
applyThreadRegisterBankConvention(t -> t.addStack().pushFrameHasBank().getBank());
|
||||
applyThreadRegisterBankConvention(
|
||||
t -> t.addStack().pushFrameHasBank(addr(0x00400000)).getBank());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
|
||||
import ghidra.dbg.target.TargetStack;
|
||||
import ghidra.program.model.address.Address;
|
||||
|
||||
public class TestTargetStack extends DefaultTestTargetObject<TestTargetStackFrame, TestTargetThread>
|
||||
implements TargetStack {
|
||||
|
@ -42,8 +43,8 @@ public class TestTargetStack extends DefaultTestTargetObject<TestTargetStackFram
|
|||
*
|
||||
* @return the "new" highest-indexed frame, into which old data was pushed
|
||||
*/
|
||||
public TestTargetStackFrameHasRegisterBank pushFrameHasBank() {
|
||||
return pushFrame(new TestTargetStackFrameHasRegisterBank(this, elements.size()));
|
||||
public TestTargetStackFrameHasRegisterBank pushFrameHasBank(Address pc) {
|
||||
return pushFrame(new TestTargetStackFrameHasRegisterBank(this, elements.size(), pc));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -51,7 +52,7 @@ public class TestTargetStack extends DefaultTestTargetObject<TestTargetStackFram
|
|||
*
|
||||
* @return the "new" highest-indexed frame, into which old data was pushed
|
||||
*/
|
||||
public TestTargetStackFrameIsRegisterBank pushFrameIsBank() {
|
||||
return pushFrame(new TestTargetStackFrameIsRegisterBank(this, elements.size()));
|
||||
public TestTargetStackFrameIsRegisterBank pushFrameIsBank(Address pc) {
|
||||
return pushFrame(new TestTargetStackFrameIsRegisterBank(this, elements.size(), pc));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,12 +27,13 @@ public class TestTargetStackFrameHasRegisterBank
|
|||
protected final TestTargetRegisterBankInFrame bank;
|
||||
protected Address pc;
|
||||
|
||||
public TestTargetStackFrameHasRegisterBank(TestTargetStack parent, int level) {
|
||||
public TestTargetStackFrameHasRegisterBank(TestTargetStack parent, int level, Address pc) {
|
||||
super(parent, PathUtils.makeKey(PathUtils.makeIndex(level)), "Frame");
|
||||
bank = new TestTargetRegisterBankInFrame(this);
|
||||
|
||||
changeAttributes(List.of(), Map.of(
|
||||
bank.getName(), bank //
|
||||
bank.getName(), bank, //
|
||||
PC_ATTRIBUTE_NAME, this.pc = pc //
|
||||
), "Initialized");
|
||||
}
|
||||
|
||||
|
|
|
@ -27,9 +27,10 @@ public class TestTargetStackFrameIsRegisterBank
|
|||
|
||||
protected Address pc;
|
||||
|
||||
public TestTargetStackFrameIsRegisterBank(TestTargetStack parent, int level) {
|
||||
public TestTargetStackFrameIsRegisterBank(TestTargetStack parent, int level, Address pc) {
|
||||
super(parent, PathUtils.makeKey(PathUtils.makeIndex(level)), "Frame",
|
||||
parent.getParent().getParent().getParent().regs);
|
||||
setPC(pc);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -49,7 +50,7 @@ public class TestTargetStackFrameIsRegisterBank
|
|||
|
||||
public void setPC(Address address) {
|
||||
changeAttributes(List.of(), Map.of(
|
||||
PC_ATTRIBUTE_NAME, address //
|
||||
PC_ATTRIBUTE_NAME, pc = address //
|
||||
), "PC Updated");
|
||||
}
|
||||
|
||||
|
|
|
@ -281,20 +281,6 @@
|
|||
<attribute schema="OBJECT" />
|
||||
</schema>
|
||||
<schema name="Stack" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
|
||||
<element schema="VOID" />
|
||||
<attribute name="_modified" schema="BOOL" hidden="yes" />
|
||||
<attribute name="_display" schema="STRING" hidden="yes" />
|
||||
<attribute name="_kind" schema="STRING" fixed="yes" hidden="yes" />
|
||||
<attribute name="_update_mode" schema="UPDATE_MODE" hidden="yes" />
|
||||
<attribute name="_short_display" schema="STRING" hidden="yes" />
|
||||
<attribute name="_value" schema="ANY" hidden="yes" />
|
||||
<attribute name="_type" schema="STRING" hidden="yes" />
|
||||
<attribute name="_order" schema="INT" hidden="yes" />
|
||||
<attribute name="Frames" schema="Frames" required="yes" />
|
||||
<attribute schema="ANY" />
|
||||
</schema>
|
||||
<schema name="Frames" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
|
||||
<interface name="Stack" />
|
||||
<element schema="StackFrame" />
|
||||
<attribute name="_modified" schema="BOOL" hidden="yes" />
|
||||
<attribute name="_display" schema="STRING" hidden="yes" />
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue