From 519af577850adddfb101a763bbac28562051cb8d Mon Sep 17 00:00:00 2001 From: Maksim Zuev Date: Wed, 23 Oct 2024 12:51:03 +0200 Subject: [PATCH] [debugger devkit] EA-1491048 Do not evaluate methods after pause GitOrigin-RevId: 49a6d42e24bc071cb5d0d117695401eb42ee2dfe --- .../devkit/debugger/DebugeeIdeStateRenderer.kt | 15 +++++++++++++-- .../jetbrains/idea/devkit/debugger/stepping.kt | 2 ++ .../org/jetbrains/idea/devkit/debugger/utils.kt | 12 ++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/DebugeeIdeStateRenderer.kt b/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/DebugeeIdeStateRenderer.kt index c7809d5bfed9..159358711bfc 100644 --- a/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/DebugeeIdeStateRenderer.kt +++ b/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/DebugeeIdeStateRenderer.kt @@ -2,6 +2,7 @@ package org.jetbrains.idea.devkit.debugger import com.intellij.debugger.engine.* +import com.intellij.debugger.engine.evaluation.EvaluateException import com.intellij.debugger.engine.evaluation.EvaluationContext import com.intellij.debugger.engine.evaluation.EvaluationContextImpl import com.intellij.debugger.engine.jdi.StackFrameProxy @@ -51,7 +52,9 @@ internal fun getIdeState(evaluationContext: EvaluationContext): IdeState? = try } } catch (e: Exception) { - DebuggerUtilsImpl.logError(e) + if (!logIncorrectSuspendState(e)) { + DebuggerUtilsImpl.logError(e) + } null } @@ -62,7 +65,15 @@ internal class DebugeeIdeStateRenderer : ExtraDebugNodesProvider { val ideState = getIdeState(evaluationContext) ?: return if (ideState.readAllowed == null && ideState.writeAllowed == null) return - val (isReadActionAllowed, isWriteActionAllowed) = (ideState.readAllowed to ideState.writeAllowed).adjustLockStatus(evaluationContext) + val (isReadActionAllowed, isWriteActionAllowed) = try { + (ideState.readAllowed to ideState.writeAllowed).adjustLockStatus(evaluationContext) + } + catch (e: EvaluateException) { + if (!logIncorrectSuspendState(e)) { + DebuggerUtilsImpl.logError(e) + } + return + } fun icon(isAvailable: Boolean) = if (isAvailable) "✓" else "✗" children.addTopValue(object : XNamedValue(DevKitDebuggerBundle.message("debugger.ide.state")) { diff --git a/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/stepping.kt b/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/stepping.kt index 3e31f21bded2..64377bec7961 100644 --- a/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/stepping.kt +++ b/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/stepping.kt @@ -79,6 +79,7 @@ private class SessionThreadsData(val disposable: Disposable) { state.setNonCancellable(suspendContext, true) } catch (e: Exception) { + if (logIncorrectSuspendState(e)) return DebuggerUtilsImpl.logError(e) } } @@ -97,6 +98,7 @@ private class SessionThreadsData(val disposable: Disposable) { } } catch (e: Exception) { + if (logIncorrectSuspendState(e)) return DebuggerUtilsImpl.logError(e) } } diff --git a/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/utils.kt b/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/utils.kt index 3e74b3686f62..f1ed1e93ad04 100644 --- a/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/utils.kt +++ b/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/utils.kt @@ -2,10 +2,10 @@ package org.jetbrains.idea.devkit.debugger import com.intellij.debugger.engine.DebugProcessImpl -import com.intellij.debugger.engine.SuspendContextImpl import com.intellij.debugger.engine.evaluation.EvaluateException import com.intellij.debugger.engine.evaluation.EvaluationContext -import com.intellij.debugger.engine.events.SuspendContextCommandImpl +import com.intellij.openapi.diagnostic.fileLogger +import com.sun.jdi.IncompatibleThreadStateException import com.sun.jdi.ReferenceType internal fun findClassOrNull(evaluationContext: EvaluationContext, fqn: String): ReferenceType? { @@ -17,3 +17,11 @@ internal fun findClassOrNull(evaluationContext: EvaluationContext, fqn: String): null } } + +internal fun logIncorrectSuspendState(e: Exception): Boolean { + if (e !is EvaluateException) return false + val cause = e.cause ?: return false + if (cause !is IncompatibleThreadStateException) return false + fileLogger().info(e) + return true +}