From 11a9881258dbfa471100a2ab4d6bbf337bfee707 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 16 Sep 2015 15:18:05 +0300 Subject: [PATCH] try to fetch reduced variables list if failed with the full --- .../debugger/jdi/LocalVariablesUtil.java | 48 +++++++++++-------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java b/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java index 0dc827788e14..fc21899bafa0 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java @@ -24,7 +24,6 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Computable; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.ReflectionUtil; import com.sun.jdi.*; import org.jetbrains.annotations.NotNull; @@ -129,8 +128,26 @@ public class LocalVariablesUtil { return map; } + // now try to fetch stack values List vars = collectVariablesFromBytecode(frameProxy); StackFrame frame = frameProxy.getStackFrame(); + int size = vars.size(); + while (size > 0) { + try { + return fetchSlotValues(map, vars.subList(0, size), frame); + } + catch (Exception e) { + LOG.info(e); + } + size--; // try with the reduced list + } + + return map; + } + + private static Map fetchSlotValues(Map map, + List vars, + StackFrame frame) throws Exception { final Field frameIdField = frame.getClass().getDeclaredField("id"); frameIdField.setAccessible(true); final Object frameId = frameIdField.get(frame); @@ -147,27 +164,18 @@ public class LocalVariablesUtil { ps = ourEnqueueMethod.invoke(null, vm, frame.thread(), frameId, slotInfoArray); } - try { - final Object reply = ourWaitForReplyMethod.invoke(null, vm, ps); - final Field valuesField = reply.getClass().getDeclaredField("values"); - valuesField.setAccessible(true); - final Value[] values = (Value[])valuesField.get(reply); - if (vars.size() != values.length) { - throw new InternalException("Wrong number of values returned from target VM"); - } - int idx = 0; - for (DecompiledLocalVariable var : vars) { - map.put(var, values[idx++]); - } - return map; + final Object reply = ourWaitForReplyMethod.invoke(null, vm, ps); + final Field valuesField = reply.getClass().getDeclaredField("values"); + valuesField.setAccessible(true); + final Value[] values = (Value[])valuesField.get(reply); + if (vars.size() != values.length) { + throw new InternalException("Wrong number of values returned from target VM"); } - catch (InvocationTargetException e) { - final Throwable target = e.getTargetException(); - if (target instanceof Exception) { - throw (Exception)target; - } - throw e; + int idx = 0; + for (DecompiledLocalVariable var : vars) { + map.put(var, values[idx++]); } + return map; } private static Object createSlotInfoArray(Collection vars) throws Exception {