@Override public void addBreakpoint(Breakpoint breakpoint) throws DebuggerException { final String className = breakpoint.getLocation().getTarget(); final int lineNumber = breakpoint.getLocation().getLineNumber(); List<ReferenceType> classes = vm.classesByName(className); // it may mean that class doesn't loaded by a target JVM yet if (classes.isEmpty()) { deferBreakpoint(breakpoint); throw new DebuggerException("Class not loaded"); } ReferenceType clazz = classes.get(0); List<com.sun.jdi.Location> locations; try { locations = clazz.locationsOfLine(lineNumber); } catch (AbsentInformationException | ClassNotPreparedException e) { throw new DebuggerException(e.getMessage(), e); } if (locations.isEmpty()) { throw new DebuggerException("Line " + lineNumber + " not found in class " + className); } com.sun.jdi.Location location = locations.get(0); if (location.method() == null) { // Line is out of method. throw new DebuggerException("Invalid line " + lineNumber + " in class " + className); } // Ignore new breakpoint if already have breakpoint at the same location. EventRequestManager requestManager = getEventManager(); for (BreakpointRequest breakpointRequest : requestManager.breakpointRequests()) { if (location.equals(breakpointRequest.location())) { LOG.debug("Breakpoint at {} already set", location); return; } } try { EventRequest breakPointRequest = requestManager.createBreakpointRequest(location); breakPointRequest.setSuspendPolicy(EventRequest.SUSPEND_ALL); String expression = breakpoint.getCondition(); if (!(expression == null || expression.isEmpty())) { ExpressionParser parser = ExpressionParser.newInstance(expression); breakPointRequest.putProperty( "org.eclipse.che.ide.java.debug.condition.expression.parser", parser); } breakPointRequest.setEnabled(true); } catch (NativeMethodException | IllegalThreadStateException | InvalidRequestStateException e) { throw new DebuggerException(e.getMessage(), e); } debuggerCallback.onEvent(new BreakpointActivatedEventImpl(breakpoint)); LOG.debug("Add breakpoint: {}", location); }
private com.sun.jdi.Value evaluate(ExpressionParser parser) throws DebuggerException { final long startTime = System.currentTimeMillis(); try { return parser.evaluate(new Evaluator(vm, getCurrentThread())); } catch (ExpressionException e) { throw new DebuggerException(e.getMessage()); } finally { final long endTime = System.currentTimeMillis(); LOG.debug("==>> Evaluate time: {} ms", (endTime - startTime)); // Evaluation of expression may update state of frame. resetCurrentFrame(); } }
@Override public String evaluate(String expression) throws DebuggerException { com.sun.jdi.Value result = evaluate(ExpressionParser.newInstance(expression)); return result == null ? "null" : result.toString(); }