GP-1470: Record full stack on single-frame change.

This commit is contained in:
Dan 2023-04-24 11:20:20 -04:00
parent 8aa9c8be3a
commit 33eecf3c00

View file

@ -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;