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
|
@Override
|
||||||
public void recordStack() {
|
public void recordStack() {
|
||||||
long snap = recorder.getSnap();
|
doRecordStack(recorder.getSnap(), getPcsByLevel());
|
||||||
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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void popStack() {
|
public void popStack() {
|
||||||
|
@ -89,21 +73,35 @@ public class DefaultStackRecorder implements ManagedStackRecorder {
|
||||||
traceFrame.setProgramCounter(null, pc); // Not object-based, so span=null
|
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) {
|
public void recordFrame(TargetStackFrame frame) {
|
||||||
long snap = recorder.getSnap();
|
long snap = recorder.getSnap();
|
||||||
|
Map<Integer, Address> pcsByLevel;
|
||||||
synchronized (stack) {
|
synchronized (stack) {
|
||||||
stack.put(getFrameLevel(frame), frame);
|
stack.put(getFrameLevel(frame), frame);
|
||||||
|
pcsByLevel = getPcsByLevel();
|
||||||
}
|
}
|
||||||
recorder.parTx.execute("Stack frame added", () -> {
|
doRecordStack(snap, pcsByLevel);
|
||||||
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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int stackDepth() {
|
protected int stackDepth() {
|
||||||
|
@ -117,7 +115,7 @@ public class DefaultStackRecorder implements ManagedStackRecorder {
|
||||||
for (TargetObject p = successor; p != null; p = p.getParent()) {
|
for (TargetObject p = successor; p != null; p = p.getParent()) {
|
||||||
if (p instanceof TargetStackFrame) {
|
if (p instanceof TargetStackFrame) {
|
||||||
if (!PathUtils.isIndex(p.getPath())) {
|
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());
|
int index = Integer.decode(p.getIndex());
|
||||||
TargetStackFrame frame;
|
TargetStackFrame frame;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue