Home | History | Annotate | Download | only in request
      1 /*
      2  * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
      3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      4  *
      5  * This code is free software; you can redistribute it and/or modify it
      6  * under the terms of the GNU General Public License version 2 only, as
      7  * published by the Free Software Foundation.  Oracle designates this
      8  * particular file as subject to the "Classpath" exception as provided
      9  * by Oracle in the LICENSE file that accompanied this code.
     10  *
     11  * This code is distributed in the hope that it will be useful, but WITHOUT
     12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  * version 2 for more details (a copy is included in the LICENSE file that
     15  * accompanied this code).
     16  *
     17  * You should have received a copy of the GNU General Public License version
     18  * 2 along with this work; if not, write to the Free Software Foundation,
     19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     20  *
     21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     22  * or visit www.oracle.com if you need additional information or have any
     23  * questions.
     24  */
     25 
     26 package com.sun.jdi.request;
     27 
     28 import com.sun.jdi.*;
     29 
     30 import java.util.List;
     31 
     32 /**
     33  * Manages the creation and deletion of {@link EventRequest}s. A single
     34  * implementor of this interface exists in a particuar VM and
     35  * is accessed through {@link VirtualMachine#eventRequestManager()}
     36  *
     37  * @see EventRequest
     38  * @see com.sun.jdi.event.Event
     39  * @see BreakpointRequest
     40  * @see com.sun.jdi.event.BreakpointEvent
     41  * @see VirtualMachine
     42  *
     43  * @author Robert Field
     44  * @since  1.3
     45  */
     46 
     47 @jdk.Exported
     48 public interface EventRequestManager extends Mirror {
     49 
     50     /**
     51      * Creates a new disabled {@link ClassPrepareRequest}.
     52      * The new event request is added to the list managed by this
     53      * EventRequestManager. Use {@link EventRequest#enable()} to
     54      * activate this event request.
     55      *
     56      * @return the created {@link ClassPrepareRequest}
     57      */
     58     ClassPrepareRequest createClassPrepareRequest();
     59 
     60     /**
     61      * Creates a new disabled {@link ClassUnloadRequest}.
     62      * The new event request is added to the list managed by this
     63      * EventRequestManager. Use {@link EventRequest#enable()} to
     64      * activate this event request.
     65      *
     66      * @return the created {@link ClassUnloadRequest}
     67      */
     68     ClassUnloadRequest createClassUnloadRequest();
     69 
     70     /**
     71      * Creates a new disabled {@link ThreadStartRequest}.
     72      * The new event request is added to the list managed by this
     73      * EventRequestManager. Use {@link EventRequest#enable()} to
     74      * activate this event request.
     75      *
     76      * @return the created {@link ThreadStartRequest}
     77      */
     78     ThreadStartRequest createThreadStartRequest();
     79 
     80     /**
     81      * Creates a new disabled {@link ThreadDeathRequest}.
     82      * The new event request is added to the list managed by this
     83      * EventRequestManager. Use {@link EventRequest#enable()} to
     84      * activate this event request.
     85      *
     86      * @return the created {@link ThreadDeathRequest}
     87      */
     88     ThreadDeathRequest createThreadDeathRequest();
     89 
     90     /**
     91      * Creates a new disabled {@link ExceptionRequest}.
     92      * The new event request is added to the list managed by this
     93      * EventRequestManager. Use {@link EventRequest#enable()} to
     94      * activate this event request.
     95      * <P>
     96      * A specific exception type and its subclasses can be selected
     97      * for exception events. Caught exceptions,  uncaught exceptions,
     98      * or both can be selected. Note, however, that
     99      * at the time an exception is thrown, it is not always
    100      * possible to determine whether it is truly caught. See
    101      * {@link com.sun.jdi.event.ExceptionEvent#catchLocation} for
    102      * details.
    103      * @param refType If non-null, specifies that exceptions which are
    104      *                instances of refType will be reported. Note: this
    105      *                will include instances of sub-types.  If null,
    106      *                all instances will be reported
    107      * @param notifyCaught If true, caught exceptions will be reported.
    108      * @param notifyUncaught If true, uncaught exceptions will be reported.
    109      *
    110      * @return the created {@link ExceptionRequest}
    111      */
    112     ExceptionRequest createExceptionRequest(ReferenceType refType,
    113                                             boolean notifyCaught,
    114                                             boolean notifyUncaught);
    115 
    116     /**
    117      * Creates a new disabled {@link MethodEntryRequest}.
    118      * The new event request is added to the list managed by this
    119      * EventRequestManager. Use {@link EventRequest#enable()} to
    120      * activate this event request.
    121      *
    122      * @return the created {@link MethodEntryRequest}
    123      */
    124     MethodEntryRequest createMethodEntryRequest();
    125 
    126     /**
    127      * Creates a new disabled {@link MethodExitRequest}.
    128      * The new event request is added to the list managed by this
    129      * EventRequestManager. Use {@link EventRequest#enable()} to
    130      * activate this event request.
    131      *
    132      * @return the created {@link MethodExitRequest}
    133      */
    134     MethodExitRequest createMethodExitRequest();
    135 
    136      /**
    137      * Creates a new disabled {@link MonitorContendedEnterRequest}.
    138      * The new event request is added to the list managed by this
    139      * EventRequestManager. Use {@link EventRequest#enable()} to
    140      * activate this event request.
    141      *
    142      * Not all target virtual machines support this operation.
    143      * Use {@link VirtualMachine#canRequestMonitorEvents()}
    144      * to determine if the operation is supported.
    145      *
    146      * @return the created {@link MonitorContendedEnterRequest}
    147      * @throws java.lang.UnsupportedOperationException if
    148      * the target VM does not support this
    149      * operation.
    150      *
    151      * @since 1.6
    152      */
    153     MonitorContendedEnterRequest createMonitorContendedEnterRequest();
    154 
    155     /**
    156      * Creates a new disabled {@link MonitorContendedEnteredRequest}.
    157      * The new event request is added to the list managed by this
    158      * EventRequestManager. Use {@link EventRequest#enable()} to
    159      * activate this event request.
    160      *
    161      * Not all target virtual machines support this operation.
    162      * Use {@link VirtualMachine#canRequestMonitorEvents()}
    163      * to determine if the operation is supported.
    164      *
    165      * @return the created {@link MonitorContendedEnteredRequest}
    166      * @throws java.lang.UnsupportedOperationException if
    167      * the target VM does not support this
    168      * operation.
    169      *
    170      * @since 1.6
    171      */
    172 
    173     MonitorContendedEnteredRequest createMonitorContendedEnteredRequest();
    174 
    175     /**
    176      * Creates a new disabled {@link MonitorWaitRequest}.
    177      * The new event request is added to the list managed by this
    178      * EventRequestManager. Use {@link EventRequest#enable()} to
    179      * activate this event request.
    180      *
    181      * Not all target virtual machines support this operation.
    182      * Use {@link VirtualMachine#canRequestMonitorEvents()}
    183      * to determine if the operation is supported.
    184      *
    185      * @return the created {@link MonitorWaitRequest}
    186      * @throws java.lang.UnsupportedOperationException if
    187      * the target VM does not support this
    188      * operation.
    189      *
    190      * @since 1.6
    191      */
    192     MonitorWaitRequest createMonitorWaitRequest();
    193 
    194     /**
    195      * Creates a new disabled {@link MonitorWaitedRequest}.
    196      * The new event request is added to the list managed by this
    197      * EventRequestManager. Use {@link EventRequest#enable()} to
    198      * activate this event request.
    199      *
    200      * Not all target virtual machines support this operation.
    201      * Use {@link VirtualMachine#canRequestMonitorEvents()}
    202      * to determine if the operation is supported.
    203      *
    204      * @return the created {@link MonitorWaitedRequest}
    205      * @throws java.lang.UnsupportedOperationException if
    206      * the target VM does not support this
    207      * operation.
    208      *
    209      * @since 1.6
    210      */
    211     MonitorWaitedRequest createMonitorWaitedRequest();
    212 
    213     /**
    214      * Creates a new disabled {@link StepRequest}.
    215      * The new event request is added to the list managed by this
    216      * EventRequestManager. Use {@link EventRequest#enable()} to
    217      * activate this event request.
    218      * <p>
    219      * The returned request will control stepping only in the specified
    220      * <code>thread</code>; all other threads will be unaffected.
    221      * A <code>size</code>value of {@link com.sun.jdi.request.StepRequest#STEP_MIN} will generate a
    222      * step event each time the code index changes. It represents the
    223      * smallest step size available and often maps to the instruction
    224      * level.
    225      * A <code>size</code> value of {@link com.sun.jdi.request.StepRequest#STEP_LINE} will generate a
    226      * step event each time the source line changes unless line number information is not available,
    227      * in which case a STEP_MIN will be done instead.  For example, no line number information is
    228      * available during the execution of a method that has been rendered obsolete by
    229      * by a {@link com.sun.jdi.VirtualMachine#redefineClasses} operation.
    230      * A <code>depth</code> value of {@link com.sun.jdi.request.StepRequest#STEP_INTO} will generate
    231      * step events in any called methods.  A <code>depth</code> value
    232      * of {@link com.sun.jdi.request.StepRequest#STEP_OVER} restricts step events to the current frame
    233      * or caller frames. A <code>depth</code> value of {@link com.sun.jdi.request.StepRequest#STEP_OUT}
    234      * restricts step events to caller frames only. All depth
    235      * restrictions are relative to the call stack immediately before the
    236      * step takes place.
    237      * <p>
    238      * Only one pending step request is allowed per thread.
    239      * <p>
    240      * Note that a typical debugger will want to cancel stepping
    241      * after the first step is detected.  Thus a next line method
    242      * would do the following:
    243      * <code>
    244      * <pre>
    245      *     EventRequestManager mgr = myVM.{@link VirtualMachine#eventRequestManager eventRequestManager}();
    246      *     StepRequest request = mgr.createStepRequest(myThread,
    247      *                                                 StepRequest.{@link StepRequest#STEP_LINE STEP_LINE},
    248      *                                                 StepRequest.{@link StepRequest#STEP_OVER STEP_OVER});
    249      *     request.{@link EventRequest#addCountFilter addCountFilter}(1);  // next step only
    250      *     request.enable();
    251      *     myVM.{@link VirtualMachine#resume resume}();
    252      * </pre>
    253      * </code>
    254      *
    255      * @param thread the thread in which to step
    256      * @param depth the step depth
    257      * @param size the step size
    258      * @return the created {@link StepRequest}
    259      * @throws DuplicateRequestException if there is already a pending
    260      * step request for the specified thread.
    261      * @throws IllegalArgumentException if the size or depth arguments
    262      * contain illegal values.
    263      */
    264     StepRequest createStepRequest(ThreadReference thread,
    265                                   int size,
    266                                   int depth);
    267 
    268     /**
    269      * Creates a new disabled {@link BreakpointRequest}.
    270      * The given {@link Location} must have a valid
    271      * (that is, non-negative) code index. The new
    272      * breakpoint is added to the list managed by this
    273      * EventRequestManager. Multiple breakpoints at the
    274      * same location are permitted. Use {@link EventRequest#enable()} to
    275      * activate this event request.
    276      *
    277      * @param location the location of the new breakpoint.
    278      * @return the created {@link BreakpointRequest}
    279      * @throws NativeMethodException if location is within a native method.
    280      */
    281     BreakpointRequest createBreakpointRequest(Location location);
    282 
    283     /**
    284      * Creates a new disabled watchpoint which watches accesses to the
    285      * specified field. The new
    286      * watchpoint is added to the list managed by this
    287      * EventRequestManager. Multiple watchpoints on the
    288      * same field are permitted.
    289      * Use {@link EventRequest#enable()} to
    290      * activate this event request.
    291      * <P>
    292      * Not all target virtual machines support this operation.
    293      * Use {@link VirtualMachine#canWatchFieldAccess()}
    294      * to determine if the operation is supported.
    295      *
    296      * @param field the field to watch
    297      * @return the created watchpoint
    298      * @throws java.lang.UnsupportedOperationException if
    299      * the target virtual machine does not support this
    300      * operation.
    301      */
    302     AccessWatchpointRequest createAccessWatchpointRequest(Field field);
    303 
    304     /**
    305      * Creates a new disabled watchpoint which watches accesses to the
    306      * specified field. The new
    307      * watchpoint is added to the list managed by this
    308      * EventRequestManager. Multiple watchpoints on the
    309      * same field are permitted.
    310      * Use {@link EventRequest#enable()} to
    311      * activate this event request.
    312      * <P>
    313      * Not all target virtual machines support this operation.
    314      * Use {@link VirtualMachine#canWatchFieldModification()}
    315      * to determine if the operation is supported.
    316      *
    317      * @param field the field to watch
    318      * @return the created watchpoint
    319      * @throws java.lang.UnsupportedOperationException if
    320      * the target virtual machine does not support this
    321      * operation.
    322      */
    323     ModificationWatchpointRequest createModificationWatchpointRequest(Field field);
    324 
    325     /**
    326      * Creates a new disabled {@link VMDeathRequest}.
    327      * The new request is added to the list managed by this
    328      * EventRequestManager.
    329      * Use {@link EventRequest#enable()} to
    330      * activate this event request.
    331      * <P>
    332      * This request (if enabled) will cause a
    333      * {@link com.sun.jdi.event.VMDeathEvent}
    334      * to be sent on termination of the target VM.
    335      * <P>
    336      * A VMDeathRequest with a suspend policy of
    337      * {@link EventRequest#SUSPEND_ALL SUSPEND_ALL}
    338      * can be used to assure processing of incoming
    339      * {@link EventRequest#SUSPEND_NONE SUSPEND_NONE} or
    340      * {@link EventRequest#SUSPEND_EVENT_THREAD SUSPEND_EVENT_THREAD}
    341      * events before VM death.  If all event processing is being
    342      * done in the same thread as event sets are being read,
    343      * enabling the request is all that is needed since the VM
    344      * will be suspended until the {@link com.sun.jdi.event.EventSet}
    345      * containing the {@link com.sun.jdi.event.VMDeathEvent}
    346      * is resumed.
    347      * <P>
    348      * Not all target virtual machines support this operation.
    349      * Use {@link VirtualMachine#canRequestVMDeathEvent()}
    350      * to determine if the operation is supported.
    351      *
    352      * @return the created request
    353      * @throws java.lang.UnsupportedOperationException if
    354      * the target VM does not support this
    355      * operation.
    356      *
    357      * @since 1.4
    358      */
    359     VMDeathRequest createVMDeathRequest();
    360 
    361     /**
    362      * Removes an eventRequest. The eventRequest is disabled and
    363      * the removed from the requests managed by this
    364      * EventRequestManager. Once the eventRequest is deleted, no
    365      * operations (for example, {@link EventRequest#setEnabled})
    366      * are permitted - attempts to do so will generally cause an
    367      * {@link InvalidRequestStateException}.
    368      * No other eventRequests are effected.
    369      * <P>
    370      * Because this method changes the underlying lists of event
    371      * requests, attempting to directly delete from a list returned
    372      * by a request accessor (e.g. below):
    373      * <PRE>
    374      *   Iterator iter = requestManager.stepRequests().iterator();
    375      *   while (iter.hasNext()) {
    376      *      requestManager.deleteEventRequest(iter.next());
    377      *  }
    378      * </PRE>
    379      * may cause a {@link java.util.ConcurrentModificationException}.
    380      * Instead use
    381      * {@link #deleteEventRequests(List) deleteEventRequests(List)}
    382      * or copy the list before iterating.
    383      *
    384      * @param eventRequest the eventRequest to remove
    385      */
    386     void deleteEventRequest(EventRequest eventRequest);
    387 
    388     /**
    389      * Removes a list of {@link EventRequest}s.
    390      *
    391      * @see #deleteEventRequest(EventRequest)
    392      *
    393      * @param eventRequests the list of eventRequests to remove
    394      */
    395     void deleteEventRequests(List<? extends EventRequest> eventRequests);
    396 
    397     /**
    398      * Remove all breakpoints managed by this EventRequestManager.
    399      *
    400      * @see #deleteEventRequest(EventRequest)
    401      */
    402     void deleteAllBreakpoints();
    403 
    404     /**
    405      * Return an unmodifiable list of the enabled and disabled step requests.
    406      * This list is a live view of these requests and thus changes as requests
    407      * are added and deleted.
    408      * @return the all {@link StepRequest} objects.
    409      */
    410     List<StepRequest> stepRequests();
    411 
    412     /**
    413      * Return an unmodifiable list of the enabled and disabled class prepare requests.
    414      * This list is a live view of these requests and thus changes as requests
    415      * are added and deleted.
    416      * @return the all {@link ClassPrepareRequest} objects.
    417      */
    418     List<ClassPrepareRequest> classPrepareRequests();
    419 
    420     /**
    421      * Return an unmodifiable list of the enabled and disabled class unload requests.
    422      * This list is a live view of these requests and thus changes as requests
    423      * are added and deleted.
    424      * @return the all {@link ClassUnloadRequest} objects.
    425      */
    426     List<ClassUnloadRequest> classUnloadRequests();
    427 
    428     /**
    429      * Return an unmodifiable list of the enabled and disabled thread start requests.
    430      * This list is a live view of these requests and thus changes as requests
    431      * are added and deleted.
    432      * @return the all {@link ThreadStartRequest} objects.
    433      */
    434     List<ThreadStartRequest> threadStartRequests();
    435 
    436     /**
    437      * Return an unmodifiable list of the enabled and disabled thread death requests.
    438      * This list is a live view of these requests and thus changes as requests
    439      * are added and deleted.
    440      * @return the all {@link ThreadDeathRequest} objects.
    441      */
    442     List<ThreadDeathRequest> threadDeathRequests();
    443 
    444     /**
    445      * Return an unmodifiable list of the enabled and disabled exception requests.
    446      * This list is a live view of these requests and thus changes as requests
    447      * are added and deleted.
    448      * @return the all {@link ExceptionRequest} objects.
    449      */
    450     List<ExceptionRequest> exceptionRequests();
    451 
    452     /**
    453      * Return an unmodifiable list of the enabled and disabled breakpoint requests.
    454      * This list is a live view of these requests and thus changes as requests
    455      * are added and deleted.
    456      * @return the list of all {@link BreakpointRequest} objects.
    457      */
    458     List<BreakpointRequest> breakpointRequests();
    459 
    460     /**
    461      * Return an unmodifiable list of the enabled and disabled access
    462      * watchpoint requests.
    463      * This list is a live view of these requests and thus changes as requests
    464      * are added and deleted.
    465      * @return the all {@link AccessWatchpointRequest} objects.
    466      */
    467     List<AccessWatchpointRequest> accessWatchpointRequests();
    468 
    469     /**
    470      * Return an unmodifiable list of the enabled and disabled modification
    471      * watchpoint requests.
    472      * This list is a live view of these requests and thus changes as requests
    473      * are added and deleted.
    474      * @return the all {@link ModificationWatchpointRequest} objects.
    475      */
    476     List<ModificationWatchpointRequest> modificationWatchpointRequests();
    477 
    478     /**
    479      * Return an unmodifiable list of the enabled and disabled method entry requests.
    480      * This list is a live view of these requests and thus changes as requests
    481      * are added and deleted.
    482      * @return the list of all {@link MethodEntryRequest} objects.
    483      */
    484     List<MethodEntryRequest> methodEntryRequests();
    485 
    486     /**
    487      * Return an unmodifiable list of the enabled and disabled method exit requests.
    488      * This list is a live view of these requests and thus changes as requests
    489      * are added and deleted.
    490      * @return the list of all {@link MethodExitRequest} objects.
    491      */
    492     List<MethodExitRequest> methodExitRequests();
    493 
    494     /**
    495      * Return an unmodifiable list of the enabled and disabled monitor contended enter requests.
    496      * This list is a live view of these requests and thus changes as requests
    497      * are added and deleted.
    498      * @return the list of all {@link MonitorContendedEnterRequest} objects.
    499      *
    500      * @since 1.6
    501      */
    502     List<MonitorContendedEnterRequest> monitorContendedEnterRequests();
    503 
    504     /**
    505      * Return an unmodifiable list of the enabled and disabled monitor contended entered requests.
    506      * This list is a live view of these requests and thus changes as requests
    507      * are added and deleted.
    508      * @return the list of all {@link MonitorContendedEnteredRequest} objects.
    509      *
    510      * @since 1.6
    511      */
    512     List<MonitorContendedEnteredRequest> monitorContendedEnteredRequests();
    513 
    514     /**
    515      * Return an unmodifiable list of the enabled and disabled monitor wait requests.
    516      * This list is a live view of these requests and thus changes as requests
    517      * are added and deleted.
    518      * @return the list of all {@link MonitorWaitRequest} objects.
    519      *
    520      * @since 1.6
    521      */
    522     List<MonitorWaitRequest> monitorWaitRequests();
    523 
    524     /**
    525      * Return an unmodifiable list of the enabled and disabled monitor waited requests.
    526      * This list is a live view of these requests and thus changes as requests
    527      * are added and deleted.
    528      * @return the list of all {@link MonitorWaitedRequest} objects.
    529      *
    530      * @since 1.6
    531      */
    532     List<MonitorWaitedRequest> monitorWaitedRequests();
    533 
    534     /**
    535      * Return an unmodifiable list of the enabled and disabled VM death requests.
    536      * This list is a live view of these requests and thus changes as requests
    537      * are added and deleted.
    538      * Note: the unsolicited VMDeathEvent does not have a
    539      * corresponding request.
    540      * @return the list of all {@link VMDeathRequest} objects.
    541      *
    542      * @since 1.4
    543      */
    544     List<VMDeathRequest> vmDeathRequests();
    545 }
    546