IDEA-323195 "Object has been collected" error during the evaluation - do not use DebugProcess.getVirtualMachineProxy

(cherry picked from commit ddb54d977ab83e4dd2edb144f47353b3aff121e3)

IJ-CR-146826

GitOrigin-RevId: d8a12f7f0bf068c6b1665afca0b738d05de9fb71
This commit is contained in:
Egor Ushakov
2024-10-15 19:25:49 +00:00
committed by intellij-monorepo-bot
parent 5f52e47ac9
commit d0863ae04b
5 changed files with 10 additions and 11 deletions
@@ -107,7 +107,7 @@ public final class AsyncStacksUtils {
() -> process.invokeMethod(evaluationContext, finalMethodPair.first, finalMethodPair.second,
args, ObjectReference.INVOKE_SINGLE_THREADED, true),
result -> result instanceof StringReference ? ((StringReference)result).value() : null,
process.getVirtualMachineProxy());
evaluationContext);
if (value != null) {
List<StackFrameItem> res = new ArrayList<>();
ClassesByNameProvider classesByName = ClassesByNameProvider.createCache(virtualMachineProxy.allClasses());
@@ -160,7 +160,7 @@ public final class EvaluationContextImpl implements EvaluationContext {
return DebuggerUtils.getInstance().processCollectibleValue(computable, value -> {
keep(value);
return value;
}, getDebugProcess().getVirtualMachineProxy());
}, this);
}
public boolean isEvaluationPossible() {
@@ -7,7 +7,6 @@ import com.intellij.debugger.JavaDebuggerBundle;
import com.intellij.debugger.actions.DebuggerAction;
import com.intellij.debugger.engine.*;
import com.intellij.debugger.engine.evaluation.*;
import com.intellij.debugger.engine.jdi.VirtualMachineProxy;
import com.intellij.debugger.impl.attach.PidRemoteConnection;
import com.intellij.debugger.jdi.VirtualMachineProxyImpl;
import com.intellij.debugger.ui.impl.watch.DebuggerTreeNodeExpression;
@@ -355,7 +354,7 @@ public final class DebuggerUtilsImpl extends DebuggerUtilsEx {
public <R, T extends Value> R processCollectibleValue(
@NotNull ThrowableComputable<? extends T, ? extends EvaluateException> valueComputable,
@NotNull Function<? super T, ? extends R> processor,
@NotNull VirtualMachineProxy proxy) throws EvaluateException {
@NotNull EvaluationContext evaluationContext) throws EvaluateException {
int retries = 1;
while (true) {
T result = valueComputable.compute();
@@ -364,12 +363,13 @@ public final class DebuggerUtilsImpl extends DebuggerUtilsEx {
}
catch (ObjectCollectedException oce) {
if (--retries < 0) {
if (proxy instanceof VirtualMachineProxyImpl proxyImpl) {
proxyImpl.suspend();
if (evaluationContext.getSuspendContext() instanceof SuspendContextImpl suspendContextImpl) {
VirtualMachineProxyImpl virtualMachineProxy = suspendContextImpl.getVirtualMachineProxy();
virtualMachineProxy.suspend();
try {
return processor.apply(valueComputable.compute());
} finally {
proxyImpl.resume();
virtualMachineProxy.resume();
}
}
else {
@@ -135,7 +135,7 @@ public final class BatchEvaluator {
evaluationContext, myBatchEvaluatorClass, myBatchEvaluatorMethod, Collections.singletonList(argArray),
MethodImpl.SKIP_ASSIGNABLE_CHECK, true),
result -> result instanceof StringReference ? ((StringReference)result).value() : null,
debugProcess.getVirtualMachineProxy());
evaluationContext);
if (value != null) {
byte[] bytes = value.getBytes(StandardCharsets.ISO_8859_1);
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes))) {
@@ -7,7 +7,6 @@ import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil;
import com.intellij.debugger.engine.evaluation.EvaluationContext;
import com.intellij.debugger.engine.evaluation.TextWithImports;
import com.intellij.debugger.engine.jdi.VirtualMachineProxy;
import com.intellij.execution.ExecutionException;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager;
@@ -134,7 +133,7 @@ public abstract class DebuggerUtils {
}
return result instanceof StringReference ? ((StringReference)result).value() : result.toString();
},
debugProcess.getVirtualMachineProxy());
evaluationContext);
}
throw EvaluateExceptionUtil.createEvaluateException(JavaDebuggerBundle.message("evaluation.error.unsupported.expression.type"));
}
@@ -147,7 +146,7 @@ public abstract class DebuggerUtils {
public abstract <R, T extends Value> R processCollectibleValue(
@NotNull ThrowableComputable<? extends T, ? extends EvaluateException> valueComputable,
@NotNull Function<? super T, ? extends R> processor,
@NotNull VirtualMachineProxy proxy) throws EvaluateException;
@NotNull EvaluationContext evaluationContext) throws EvaluateException;
public static void ensureNotInsideObjectConstructor(@NotNull ObjectReference reference, @NotNull EvaluationContext context)
throws EvaluateException {