mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 10:49:34 +02:00
GP-1470: Record full stack on single-frame change.
This commit is contained in:
parent
8aa9c8be3a
commit
33eecf3c00
1 changed files with 26 additions and 28 deletions
|
@ -57,23 +57,7 @@ public class DefaultStackRecorder implements ManagedStackRecorder {
|
|||
|
||||
@Override
|
||||
public void recordStack() {
|
||||
long snap = recorder.getSnap();
|
||||
DebuggerMemoryMapper mm = recorder.getMemoryMapper();
|
||||
Map<Integer, Address> pcsByLevel;
|
||||
synchronized (stack) {
|
||||
pcsByLevel = stack.entrySet()
|
||||
.stream()
|
||||
.collect(Collectors.toMap(e -> e.getKey(), e -> {
|
||||
return mm.targetToTrace(e.getValue().getProgramCounter());
|
||||
}));
|
||||
}
|
||||
recorder.parTx.execute("Stack changed", () -> {
|
||||
TraceStack traceStack = stackManager.getStack(thread, snap, true);
|
||||
traceStack.setDepth(stackDepth(), false);
|
||||
for (Map.Entry<Integer, Address> ent : pcsByLevel.entrySet()) {
|
||||
doRecordFrame(traceStack, ent.getKey(), ent.getValue());
|
||||
}
|
||||
}, thread.getPath());
|
||||
doRecordStack(recorder.getSnap(), getPcsByLevel());
|
||||
}
|
||||
|
||||
public void popStack() {
|
||||
|
@ -89,21 +73,35 @@ public class DefaultStackRecorder implements ManagedStackRecorder {
|
|||
traceFrame.setProgramCounter(null, pc); // Not object-based, so span=null
|
||||
}
|
||||
|
||||
protected Map<Integer, Address> getPcsByLevel() {
|
||||
DebuggerMemoryMapper mm = recorder.getMemoryMapper();
|
||||
synchronized (stack) {
|
||||
return stack.entrySet()
|
||||
.stream()
|
||||
.collect(Collectors.toMap(e -> e.getKey(), e -> {
|
||||
return mm.targetToTrace(e.getValue().getProgramCounter());
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
protected void doRecordStack(long snap, Map<Integer, Address> pcsByLevel) {
|
||||
recorder.parTx.execute("Stack changed", () -> {
|
||||
TraceStack traceStack = stackManager.getStack(thread, snap, true);
|
||||
traceStack.setDepth(stackDepth(), false);
|
||||
for (Map.Entry<Integer, Address> ent : pcsByLevel.entrySet()) {
|
||||
doRecordFrame(traceStack, ent.getKey(), ent.getValue());
|
||||
}
|
||||
}, thread.getPath());
|
||||
}
|
||||
|
||||
public void recordFrame(TargetStackFrame frame) {
|
||||
long snap = recorder.getSnap();
|
||||
Map<Integer, Address> pcsByLevel;
|
||||
synchronized (stack) {
|
||||
stack.put(getFrameLevel(frame), frame);
|
||||
pcsByLevel = getPcsByLevel();
|
||||
}
|
||||
recorder.parTx.execute("Stack frame added", () -> {
|
||||
DebuggerMemoryMapper memoryMapper = recorder.getMemoryMapper();
|
||||
if (memoryMapper == null) {
|
||||
return;
|
||||
}
|
||||
Address pc = frame.getProgramCounter();
|
||||
Address tracePc = pc == null ? null : memoryMapper.targetToTrace(pc);
|
||||
TraceStack traceStack = stackManager.getStack(thread, snap, true);
|
||||
doRecordFrame(traceStack, getFrameLevel(frame), tracePc);
|
||||
}, thread.getPath());
|
||||
doRecordStack(snap, pcsByLevel);
|
||||
}
|
||||
|
||||
protected int stackDepth() {
|
||||
|
@ -117,7 +115,7 @@ public class DefaultStackRecorder implements ManagedStackRecorder {
|
|||
for (TargetObject p = successor; p != null; p = p.getParent()) {
|
||||
if (p instanceof TargetStackFrame) {
|
||||
if (!PathUtils.isIndex(p.getPath())) {
|
||||
throw new AssertionError("Invalid path index "+p.getPath());
|
||||
throw new AssertionError("Invalid path index " + p.getPath());
|
||||
}
|
||||
int index = Integer.decode(p.getIndex());
|
||||
TargetStackFrame frame;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue