コード例 #1
0
ファイル: JavaDebugger.java プロジェクト: yanxch/che
 @Override
 public List<Breakpoint> getAllBreakpoints() throws DebuggerException {
   List<BreakpointRequest> breakpointRequests;
   try {
     breakpointRequests = getEventManager().breakpointRequests();
   } catch (DebuggerException e) {
     Throwable cause = e.getCause();
     if (cause instanceof VMCannotBeModifiedException) {
       // If target VM in read-only state then list of break point always empty.
       return Collections.emptyList();
     }
     throw e;
   }
   List<Breakpoint> breakPoints = new ArrayList<>(breakpointRequests.size());
   for (BreakpointRequest breakpointRequest : breakpointRequests) {
     com.sun.jdi.Location location = breakpointRequest.location();
     // Breakpoint always enabled at the moment. Managing states of breakpoint is not supported for
     // now.
     breakPoints.add(
         newDto(BreakpointDto.class)
             .withEnabled(true)
             .withLocation(
                 newDto(LocationDto.class)
                     .withTarget(location.declaringType().name())
                     .withLineNumber(location.lineNumber())));
   }
   Collections.sort(breakPoints, BREAKPOINT_COMPARATOR);
   return breakPoints;
 }
コード例 #2
0
ファイル: JavaDebugger.java プロジェクト: yanxch/che
  @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);
  }
コード例 #3
0
ファイル: JavaDebugger.java プロジェクト: yanxch/che
 @Override
 public void deleteBreakpoint(Location location) throws DebuggerException {
   final String className = location.getTarget();
   final int lineNumber = location.getLineNumber();
   EventRequestManager requestManager = getEventManager();
   List<BreakpointRequest> snapshot = new ArrayList<>(requestManager.breakpointRequests());
   for (BreakpointRequest breakpointRequest : snapshot) {
     com.sun.jdi.Location jdiLocation = breakpointRequest.location();
     if (jdiLocation.declaringType().name().equals(className)
         && jdiLocation.lineNumber() == lineNumber) {
       requestManager.deleteEventRequest(breakpointRequest);
       LOG.debug("Delete breakpoint: {}", location);
     }
   }
 }