From 0184a4e6111b8dfe5fe2428e60783b9f33bd8a32 Mon Sep 17 00:00:00 2001 From: Egor Ushakov Date: Wed, 11 Apr 2018 18:59:01 +0300 Subject: [PATCH] IDEA-190076 Incorrect frame state after thread death --- .../intellij/debugger/engine/JavaExecutionStack.java | 11 ++++++----- .../com/intellij/debugger/engine/JavaStackFrame.java | 7 +++++++ resources-en/src/messages/DebuggerBundle.properties | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaExecutionStack.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaExecutionStack.java index 272b19fd9d5b..f658d377fceb 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaExecutionStack.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaExecutionStack.java @@ -119,11 +119,12 @@ public class JavaExecutionStack extends XExecutionStack { @Override public void contextAction(@NotNull SuspendContextImpl suspendContext) { if (container.isObsolete()) return; - if (!myThreadProxy.isCollected() && myDebugProcess.getSuspendManager().isSuspended(myThreadProxy)) { - int status = myThreadProxy.status(); - if (!(status == ThreadReference.THREAD_STATUS_UNKNOWN) && - !(status == ThreadReference.THREAD_STATUS_NOT_STARTED) && - !(status == ThreadReference.THREAD_STATUS_ZOMBIE)) { + int status = myThreadProxy.status(); + if (status == ThreadReference.THREAD_STATUS_ZOMBIE) { + container.errorOccurred(DebuggerBundle.message("frame.panel.thread.finished")); + } + else if (!myThreadProxy.isCollected() && myDebugProcess.getSuspendManager().isSuspended(myThreadProxy)) { + if (!(status == ThreadReference.THREAD_STATUS_UNKNOWN) && !(status == ThreadReference.THREAD_STATUS_NOT_STARTED)) { try { int added = 0; Iterator iterator = myThreadProxy.frames().iterator(); diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java index 658df9691fd5..4faee8c18468 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java @@ -142,6 +142,13 @@ public class JavaStackFrame extends XStackFrame implements JVMStackFrameInfoProv buildVariablesThreadAction(getFrameDebuggerContext(getDebuggerContext()), children, node); node.addChildren(children, true); } + + @Override + protected void commandCancelled() { + if (!node.isObsolete()) { + node.addChildren(XValueChildrenList.EMPTY, true); + } + } }); } diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index 46b09990ba58..2237d8973379 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -492,6 +492,7 @@ breakpoint.properties.panel.option.dependency.type.lable=After breakpoint was hi watchs.add.text=Add to watches breakpoint.properties.panel.option.suspend.default=Make De&fault frame.panel.frames.not.available=Frames not available for unsuspended thread +frame.panel.thread.finished=Thread has finished execution frame.panel.async.stacktrace=Async stacktrace error.corrupt.debug.info=Debug info might be corrupt: {0} action.kill.process.text=Kill Process