/** * Suspend the main thread when the program enters the main method of the specified main class. * @param debugSession * the debug session. * @param mainClass * the fully qualified name of the main class. * @return * a {@link CompletableFuture} that contains the suspended main thread id. */ public static CompletableFuture<Long> stopOnEntry(IDebugSession debugSession, String mainClass) { CompletableFuture<Long> future = new CompletableFuture<>(); EventRequestManager manager = debugSession.getVM().eventRequestManager(); MethodEntryRequest request = manager.createMethodEntryRequest(); request.addClassFilter(mainClass); request.setSuspendPolicy(EventRequest.SUSPEND_EVENT_THREAD); debugSession.getEventHub().events().filter(debugEvent -> { return debugEvent.event instanceof MethodEntryEvent && request.equals(debugEvent.event.request()); }).subscribe(debugEvent -> { Method method = ((MethodEntryEvent) debugEvent.event).method(); if (method.isPublic() && method.isStatic() && method.name().equals("main") && method.signature().equals("([Ljava/lang/String;)V")) { deleteEventRequestSafely(debugSession.getVM().eventRequestManager(), request); debugEvent.shouldResume = false; ThreadReference bpThread = ((MethodEntryEvent) debugEvent.event).thread(); future.complete(bpThread.uniqueID()); } }); request.enable(); return future; }
@Override public void perform(String[] argv, Context ctx) { EventRequestManager manager = ctx.getVm().eventRequestManager(); MethodEntryRequest mer = manager.createMethodEntryRequest(); mer.setSuspendPolicy(EventRequest.SUSPEND_NONE); mer.enable(); ctx.register(mer, new EventCallback() { @Override public void handleEvent(Event event) { MethodEntryEvent mee = (MethodEntryEvent) event; Method method = mee.method(); System.out.println("--" + method.name()); // mee.thread().resume(); } }); }
public void createRequest(DebugProcessImpl debugProcess) { DebuggerManagerThreadImpl.assertIsManagerThread(); if (!shouldCreateRequest(debugProcess)) { return; } try { RequestManagerImpl requestManager = debugProcess.getRequestsManager(); if (isWatchEntry()) { MethodEntryRequest entryRequest = MethodBreakpoint.findRequest(debugProcess, MethodEntryRequest.class, this); if (entryRequest == null) { entryRequest = requestManager.createMethodEntryRequest(this); } else { entryRequest.disable(); } entryRequest.addClassFilter(getClassPattern()); debugProcess.getRequestsManager().enableRequest(entryRequest); } if (isWatchExit()) { MethodExitRequest exitRequest = MethodBreakpoint.findRequest(debugProcess, MethodExitRequest.class, this); if (exitRequest == null) { exitRequest = requestManager.createMethodExitRequest(this); } else { exitRequest.disable(); } exitRequest.addClassFilter(getClassPattern()); debugProcess.getRequestsManager().enableRequest(exitRequest); } } catch (Exception e) { LOG.debug(e); } }
public static List<MethodEntryRequest> wrapMethodEntryRequests( F3VirtualMachine f3vm, List<MethodEntryRequest> reqs) { if (reqs == null) { return null; } List<MethodEntryRequest> result = new ArrayList<MethodEntryRequest>(); for (MethodEntryRequest req : reqs) { result.add(wrap(f3vm, req)); } return result; }
public void createRequest(DebugProcessImpl debugProcess) { DebuggerManagerThreadImpl.assertIsManagerThread(); if (!ENABLED || !debugProcess.isAttached() || debugProcess.areBreakpointsMuted() || !debugProcess.getRequestsManager().findRequests(this).isEmpty()) { return; } try { RequestManagerImpl requestManager = debugProcess.getRequestsManager(); if (WATCH_ENTRY) { MethodEntryRequest entryRequest = (MethodEntryRequest)findRequest(debugProcess, MethodEntryRequest.class); if (entryRequest == null) { entryRequest = requestManager.createMethodEntryRequest(this); } else { entryRequest.disable(); } entryRequest.addClassFilter(myClassPattern); debugProcess.getRequestsManager().enableRequest(entryRequest); } if (WATCH_EXIT) { MethodExitRequest exitRequest = (MethodExitRequest)findRequest(debugProcess, MethodExitRequest.class); if (exitRequest == null) { exitRequest = requestManager.createMethodExitRequest(this); } else { exitRequest.disable(); } exitRequest.addClassFilter(myClassPattern); debugProcess.getRequestsManager().enableRequest(exitRequest); } } catch (Exception e) { LOG.debug(e); } }
private static MethodEntryRequest methodEntryRequests( EventRequestManager manager, String classpattern) { MethodEntryRequest mereq = manager.createMethodEntryRequest(); mereq.addClassFilter(classpattern); mereq.setSuspendPolicy(EventRequest.SUSPEND_EVENT_THREAD); return mereq; }
/** * Create the desired event requests, and enable * them so that we will get events. * @param excludes Class patterns for which we don't want events * @param watchFields Do we want to watch assignments to fields */ void setEventRequests() { EventRequestManager mgr = vm.eventRequestManager(); ExceptionRequest excReq = mgr.createExceptionRequest(null,true, true); excReq.setSuspendPolicy(EventRequest.SUSPEND_ALL); excReq.enable(); MethodEntryRequest menr = mgr.createMethodEntryRequest(); for (int i=0; i<excludes.size(); ++i) { menr.addClassExclusionFilter(excludes.get(i)); } menr.setSuspendPolicy(EventRequest.SUSPEND_ALL); menr.enable(); MethodExitRequest mexr = mgr.createMethodExitRequest(); for (int i=0; i<excludes.size(); ++i) { mexr.addClassExclusionFilter(excludes.get(i)); } mexr.setSuspendPolicy(EventRequest.SUSPEND_ALL); mexr.enable(); ThreadDeathRequest tdr = mgr.createThreadDeathRequest(); tdr.setSuspendPolicy(EventRequest.SUSPEND_ALL); tdr.enable(); }
static void addExcludes(MethodEntryRequest request) { for (String pattern : excludes()) { request.addClassExclusionFilter(pattern); } }
public MethodEntryRequest createMethodEntryRequest() { return new MethodEntryRequestImpl(); }
public List<MethodEntryRequest> methodEntryRequests() { return (List<MethodEntryRequest>)unmodifiableRequestList(JDWP.EventKind.METHOD_ENTRY); }
protected void createRequestForPreparedClass(@NotNull DebugProcessImpl debugProcess, @NotNull ReferenceType classType) { try { boolean hasMethod = false; for (Iterator iterator = classType.allMethods().iterator(); iterator.hasNext();) { Method method = (Method)iterator.next(); String signature = method.signature(); String name = method.name(); if (getMethodName().equals(name) && mySignature.getName(debugProcess).equals(signature)) { hasMethod = true; break; } } if(!hasMethod) { debugProcess.getRequestsManager().setInvalid( this, DebuggerBundle.message("error.invalid.breakpoint.method.not.found", classType.name()) ); return; } RequestManagerImpl requestManager = debugProcess.getRequestsManager(); if (isWatchEntry()) { MethodEntryRequest entryRequest = findRequest(debugProcess, MethodEntryRequest.class, this); if (entryRequest == null) { entryRequest = requestManager.createMethodEntryRequest(this); } else { entryRequest.disable(); } //entryRequest.addClassFilter(myClassQualifiedName); // use addClassFilter(ReferenceType) in order to stop on subclasses also! entryRequest.addClassFilter(classType); debugProcess.getRequestsManager().enableRequest(entryRequest); } if (isWatchExit()) { MethodExitRequest exitRequest = findRequest(debugProcess, MethodExitRequest.class, this); if (exitRequest == null) { exitRequest = requestManager.createMethodExitRequest(this); } else { exitRequest.disable(); } //exitRequest.addClassFilter(myClassQualifiedName); exitRequest.addClassFilter(classType); debugProcess.getRequestsManager().enableRequest(exitRequest); } } catch (Exception e) { LOG.debug(e); } }
public F3MethodEntryRequest(F3VirtualMachine f3vm, MethodEntryRequest underlying) { super(f3vm, underlying); }
@Override protected MethodEntryRequest underlying() { return (MethodEntryRequest) super.underlying(); }
public List<MethodEntryRequest> methodEntryRequests() { return F3EventRequest.wrapMethodEntryRequests(virtualMachine(), underlying().methodEntryRequests()); }
public static F3EventRequest wrap(F3VirtualMachine f3vm, EventRequest req) { if (req == null) { return null; } if (req instanceof AccessWatchpointRequest) { return new F3AccessWatchpointRequest(f3vm, (AccessWatchpointRequest)req); } else if (req instanceof BreakpointRequest) { return new F3BreakpointRequest(f3vm, (BreakpointRequest)req); } else if (req instanceof ClassPrepareRequest) { return new F3ClassPrepareRequest(f3vm, (ClassPrepareRequest)req); } else if (req instanceof ClassUnloadRequest) { return new F3ClassUnloadRequest(f3vm, (ClassUnloadRequest)req); } else if (req instanceof ExceptionRequest) { return new F3ExceptionRequest(f3vm, (ExceptionRequest)req); } else if (req instanceof MethodEntryRequest) { return new F3MethodEntryRequest(f3vm, (MethodEntryRequest)req); } else if (req instanceof MethodExitRequest) { return new F3MethodExitRequest(f3vm, (MethodExitRequest)req); } else if (req instanceof ModificationWatchpointRequest) { return new F3ModificationWatchpointRequest(f3vm, (ModificationWatchpointRequest)req); } else if (req instanceof MonitorContendedEnterRequest) { return new F3MonitorContendedEnterRequest(f3vm, (MonitorContendedEnterRequest)req); } else if (req instanceof MonitorContendedEnteredRequest) { return new F3MonitorContendedEnteredRequest(f3vm, (MonitorContendedEnteredRequest)req); } else if (req instanceof MonitorWaitRequest) { return new F3MonitorWaitRequest(f3vm, (MonitorWaitRequest)req); } else if (req instanceof MonitorWaitedRequest) { return new F3MonitorWaitedRequest(f3vm, (MonitorWaitedRequest)req); } else if (req instanceof StepRequest) { return new F3StepRequest(f3vm, (StepRequest)req); } else if (req instanceof ThreadDeathRequest) { return new F3ThreadDeathRequest(f3vm, (ThreadDeathRequest)req); } else if (req instanceof ThreadStartRequest) { return new F3ThreadStartRequest(f3vm, (ThreadStartRequest)req); } else if (req instanceof VMDeathRequest) { return new F3VMDeathRequest(f3vm, (VMDeathRequest)req); } else if (req instanceof WatchpointRequest) { return new F3WatchpointRequest(f3vm, (WatchpointRequest)req); } else { return new F3EventRequest(f3vm, req); } }
public static F3MethodEntryRequest wrap( F3VirtualMachine f3vm, MethodEntryRequest req) { return (req == null)? null : new F3MethodEntryRequest(f3vm, req); }
void addExcludes(MethodEntryRequest request) { for (String pattern : excludes()) { request.addClassExclusionFilter(pattern); } }
protected void createRequestForPreparedClass(@NotNull DebugProcessImpl debugProcess, @NotNull ReferenceType classType) { try { boolean hasMethod = false; for (Iterator iterator = classType.allMethods().iterator(); iterator.hasNext();) { Method method = (Method)iterator.next(); String signature = method.signature(); String name = method.name(); if (myMethodName.equals(name) && mySignature.getName(debugProcess).equals(signature)) { hasMethod = true; break; } } if(!hasMethod) { debugProcess.getRequestsManager().setInvalid( this, DebuggerBundle.message("error.invalid.breakpoint.method.not.found", classType.name()) ); return; } RequestManagerImpl requestManager = debugProcess.getRequestsManager(); if (WATCH_ENTRY) { MethodEntryRequest entryRequest = (MethodEntryRequest)findRequest(debugProcess, MethodEntryRequest.class); if (entryRequest == null) { entryRequest = requestManager.createMethodEntryRequest(this); } else { entryRequest.disable(); } //entryRequest.addClassFilter(myClassQualifiedName); // use addClassFilter(ReferenceType) in order to stop on subclasses also! entryRequest.addClassFilter(classType); debugProcess.getRequestsManager().enableRequest(entryRequest); } if (WATCH_EXIT) { MethodExitRequest exitRequest = (MethodExitRequest)findRequest(debugProcess, MethodExitRequest.class); if (exitRequest == null) { exitRequest = requestManager.createMethodExitRequest(this); } else { exitRequest.disable(); } //exitRequest.addClassFilter(myClassQualifiedName); exitRequest.addClassFilter(classType); debugProcess.getRequestsManager().enableRequest(exitRequest); } } catch (Exception e) { LOG.debug(e); } }
private void deleteEventRequest(EventRequestManager manager, MethodEntryRequest request) { manager.deleteEventRequest(request); }
/** * Apply this object's filter to the given event request. */ public void filter(MethodEntryRequest request);