List<StackFrameItem> (@NotNull StackFrameProxyImpl frame, @NotNull SuspendContextImpl suspendContext) { DebugProcessImpl debugProcess = suspendContext.getDebugProcess(); Map<Object, List<StackFrameItem>> capturedStacks = debugProcess.getUserData(CAPTURED_STACKS); if (ContainerUtil.isEmpty(capturedStacks)) { return null; } List<StackCapturingLineBreakpoint> captureBreakpoints = debugProcess.getUserData(CAPTURE_BREAKPOINTS); if (ContainerUtil.isEmpty(captureBreakpoints)) { return null; } try { Location location = frame.location(); String className = location.declaringType().name(); String methodName = DebuggerUtilsEx.getLocationMethodName(location); for (StackCapturingLineBreakpoint b : captureBreakpoints) { String insertClassName = b.myCapturePoint.myInsertClassName; if ((StringUtil.isEmpty(insertClassName) || StringUtil.equals(insertClassName, className)) && StringUtil.equals(b.myCapturePoint.myInsertMethodName, methodName)) { try { Value key = b.myInsertEvaluator.evaluate(new EvaluationContextImpl(suspendContext, frame)); return key instanceof ObjectReference ? capturedStacks.get(getKey((ObjectReference)key)) : null; } catch (EvaluateException e) { LOG.debug(e); if (!(e.getCause() instanceof IncompatibleThreadStateException)) { debugProcess.printToConsole(JavaDebuggerBundle.message("error.unable.to.evaluate.insert.expression", e.getMessage()) + "\n"); } } } } } catch (EvaluateException e) { LOG.debug(e); } return null; }