コード例 #1
0
 public BreakpointRequest createBreakpointRequest(Location loc) {
   BreakpointRequest bpr = this.eventRequestManager.createBreakpointRequest(loc);
   // this could be SUSPEND_EVENT_THREAD
   bpr.setSuspendPolicy(EventRequest.SUSPEND_ALL);
   bpr.enable();
   return bpr;
 }
コード例 #2
0
  public BreakpointRequest setBreakpoint(
      String clsName, String methodName, String methodSignature) {
    ReferenceType rt = findReferenceType(clsName);
    if (rt == null) {
      rt = resumeToPrepareOf(clsName).referenceType();
    }

    Method method = findMethod(rt, methodName, methodSignature);
    if (method == null) {
      throw new IllegalArgumentException("Bad method name/signature");
    }
    BreakpointRequest bpr = eventRequestManager().createBreakpointRequest(method.location());
    bpr.setSuspendPolicy(EventRequest.SUSPEND_ALL);
    bpr.enable();
    return bpr;
  }
コード例 #3
0
  protected ThreadReference getDebuggedThread(DebugEvaluationTest test) {
    try {
      // desintall previous breakpoints
      this.jdiVM.eventRequestManager().deleteAllBreakpoints();

      // install a breakpoint at the breakpointLine
      List classes = this.jdiVM.classesByName(this.breakpointClassName);
      if (classes.size() == 0) {
        if (this.breakpointClassName.equals("_JDIStackFrame_")) {
          // install special class
          String source =
              "public class _JDIStackFrame_ {\n"
                  + "  public int foo() {\n"
                  + "    return -1;\n"
                  + "  }\n"
                  + "}";
          test.compileAndDeploy(source, "_JDIStackFrame_");
        }

        // force load of class
        test.evaluateWithExpectedDisplayString(
            ("return Class.forName(\"" + this.breakpointClassName + "\");").toCharArray(),
            ("class " + this.breakpointClassName).toCharArray());
        classes = this.jdiVM.classesByName(this.breakpointClassName);
        if (classes.size() == 0) {
          // workaround bug in Standard VM
          Iterator iterator = this.jdiVM.allClasses().iterator();
          while (iterator.hasNext()) {
            ReferenceType type = (ReferenceType) iterator.next();
            if (type.name().equals(this.breakpointClassName)) {
              classes = new ArrayList(1);
              classes.add(type);
              break;
            }
          }
          if (classes.size() == 0) {
            throw new Error("JDI could not retrieve class for " + this.breakpointClassName);
          }
        }
      }
      ClassType clazz = (ClassType) classes.get(0);
      Method method = (Method) clazz.methodsByName(this.breakpointMethodName).get(0);
      Location location;
      if (this.breakpointLine < 0 || this.breakpointLine == Integer.MAX_VALUE) {
        location = method.location();
      } else {
        location = (Location) method.locationsOfLine(this.breakpointLine).get(0);
      }
      BreakpointRequest request =
          this.jdiVM.eventRequestManager().createBreakpointRequest(location);
      request.setSuspendPolicy(EventRequest.SUSPEND_EVENT_THREAD);
      request.enable();

      // create a new thread that hit the breakpoint
      EvaluationTest.Requestor requestor = test.new Requestor();
      try {
        test.resetEnv();
        test.context.evaluate(
            ("(new Thread() {\n"
                    + "  public void run() {\n"
                    + userCode
                    + "\n"
                    + (this.breakpointClassName.equals("_JDIStackFrame_")
                        ? "    new _JDIStackFrame_().foo();\n"
                        : "")
                    + "  }\n"
                    + "  public String toString() {\n"
                    + "    return \"my thread\";\n"
                    + "  }\n"
                    + "}).start();\n")
                .toCharArray(),
            test.getEnv(),
            test.getCompilerOptions(),
            requestor,
            test.getProblemFactory());
      } catch (InstallException e) {
        Assert.assertTrue("Target exception " + e.getMessage(), false);
      }
      EvaluationResult[] results = requestor.results;
      for (int i = 0; i < requestor.resultIndex + 1; i++) {
        if (results[i].hasErrors()) {
          Assert.assertTrue("Compilation error in user code", false);
        }
      }

      // Wait for the breakpoint event
      Event event = null;
      do {
        EventSet set = this.jdiVM.eventQueue().remove();
        Iterator iterator = set.eventIterator();
        while (iterator.hasNext()) {
          event = (Event) iterator.next();
          if (event instanceof BreakpointEvent) break;
        }
      } while (!(event instanceof BreakpointEvent));

      // Return the suspended thread
      return ((BreakpointEvent) event).thread();
    } catch (AbsentInformationException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return null;
  }