Skip to content

Commit a5bbebc

Browse files
Clear stackframe cache if the thread state has changed (#439)
1 parent fa39242 commit a5bbebc

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/IStackFrameManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,11 @@ public interface IStackFrameManager {
4141
* @return the refreshed stackframes
4242
*/
4343
StackFrame[] reloadStackFrames(ThreadReference thread, int start, int length);
44+
45+
/**
46+
* Clear the stackframes cache from the specified thread.
47+
*
48+
* @param thread the jdi thread
49+
*/
50+
void clearStackFrames(ThreadReference thread);
4451
}

com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/StackFrameManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,9 @@ public synchronized StackFrame[] reloadStackFrames(ThreadReference thread, int s
6666
return new StackFrame[0];
6767
}
6868
}
69+
70+
@Override
71+
public synchronized void clearStackFrames(ThreadReference thread) {
72+
threadStackFrameMap.remove(thread.uniqueID());
73+
}
6974
}

com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/StackTraceRequestHandler.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ public CompletableFuture<Response> handle(Command command, Arguments arguments,
7070
int totalFrames = 0;
7171
if (thread != null) {
7272
try {
73+
// Thread state has changed and then invalidate the stack frame cache.
74+
if (stacktraceArgs.startFrame == 0) {
75+
context.getStackFrameManager().clearStackFrames(thread);
76+
}
77+
7378
totalFrames = thread.frameCount();
7479
int count = stacktraceArgs.levels == 0 ? totalFrames - stacktraceArgs.startFrame
7580
: Math.min(totalFrames - stacktraceArgs.startFrame, stacktraceArgs.levels);
@@ -80,10 +85,10 @@ public CompletableFuture<Response> handle(Command command, Arguments arguments,
8085

8186
StackFrame[] frames = context.getStackFrameManager().reloadStackFrames(thread, stacktraceArgs.startFrame, count);
8287
List<StackFrameInfo> jdiFrames = resolveStackFrameInfos(frames, context.asyncJDWP());
83-
for (int i = stacktraceArgs.startFrame; i < jdiFrames.size() && count-- > 0; i++) {
84-
StackFrameReference stackframe = new StackFrameReference(thread, i);
88+
for (int i = 0; i < count; i++) {
89+
StackFrameReference stackframe = new StackFrameReference(thread, stacktraceArgs.startFrame + i);
8590
int frameId = context.getRecyclableIdPool().addObject(stacktraceArgs.threadId, stackframe);
86-
StackFrameInfo jdiFrame = jdiFrames.get(i - stacktraceArgs.startFrame);
91+
StackFrameInfo jdiFrame = jdiFrames.get(i);
8792
result.add(convertDebuggerStackFrameToClient(jdiFrame, frameId, context));
8893
}
8994
} catch (IncompatibleThreadStateException | IndexOutOfBoundsException | URISyntaxException

0 commit comments

Comments
 (0)