diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java index 773533895589..a1248c99a927 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -1715,14 +1715,7 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb ClassLoaderReference classLoader) throws EvaluateException { try { DebuggerManagerThreadImpl.assertIsManagerThread(); - ReferenceType result; - List types = ContainerUtil.filter(getCurrentVm(evaluationContext).classesByName(className), ReferenceType::isPrepared); - // first try to quickly find the equal classloader only - result = ContainerUtil.find(types, refType -> Objects.equals(classLoader, refType.classLoader())); - // now do the full visibility check - if (result == null && classLoader != null) { - result = ContainerUtil.find(types, refType -> isVisibleFromClassLoader(classLoader, refType)); - } + ReferenceType result = findLoadedClass(evaluationContext, className, classLoader); if (result == null && evaluationContext != null) { EvaluationContextImpl evalContext = (EvaluationContextImpl)evaluationContext; if (evalContext.isAutoLoadClasses()) { @@ -1736,6 +1729,19 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb } } + public @Nullable ReferenceType findLoadedClass(@Nullable EvaluationContext evaluationContext, + String className, + ClassLoaderReference classLoader) { + List types = ContainerUtil.filter(getCurrentVm(evaluationContext).classesByName(className), ReferenceType::isPrepared); + // first try to quickly find the equal classloader only + ReferenceType result = ContainerUtil.find(types, refType -> Objects.equals(classLoader, refType.classLoader())); + // now do the full visibility check + if (result == null && classLoader != null) { + result = ContainerUtil.find(types, refType -> isVisibleFromClassLoader(classLoader, refType)); + } + return result; + } + private VirtualMachineProxyImpl getCurrentVm(@Nullable EvaluationContext evaluationContext) { return evaluationContext != null ? ((SuspendContextImpl)evaluationContext.getSuspendContext()).getVirtualMachineProxy() 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 77b3249b6ff4..9cb72354c60b 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 @@ -37,14 +37,15 @@ private const val THREADING_SUPPORT_FQN = "com.intellij.openapi.application.impl internal class DebugeeIdeStateRenderer : ExtraDebugNodesProvider { override fun addExtraNodes(evaluationContext: EvaluationContext, children: XValueChildrenList) { if (!Registry.`is`("devkit.debugger.show.ide.state")) return + val debugProcess = evaluationContext.debugProcess as? DebugProcessImpl ?: return val supportClass = try { - evaluationContext.debugProcess.findClass(evaluationContext, SUPPORT_CLASS_FQN, null) ?: return + debugProcess.findLoadedClass(evaluationContext, SUPPORT_CLASS_FQN, evaluationContext.classLoader) ?: return } catch (_: EvaluateException) { return } val getStateMethod = DebuggerUtils.findMethod(supportClass, GET_STATE_METHOD_NAME, GET_STATE_METHOD_SIGNATURE) ?: return - val state = evaluationContext.debugProcess.invokeMethod(evaluationContext, supportClass as ClassType, getStateMethod, emptyList()) as ObjectReference? + val state = debugProcess.invokeMethod(evaluationContext, supportClass as ClassType, getStateMethod, emptyList()) as ObjectReference? if (state == null) return val stateClass = state.referenceType()