Home | History | Annotate | Download | only in back
      1 /*
      2  * Copyright (c) 2003, 2012, 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 /* Error message and general message handling functions. */
     27 
     28 /* NOTE: We assume that most strings passed around this library are
     29  *       UTF-8 (modified or standard) and not platform encoding.
     30  *       Before sending any strings to the "system" (e.g. OS system
     31  *       calls, or system input/output functions like fprintf) we need
     32  *       to make sure that the strings are transformed from UTF-8 to
     33  *       the platform encoding accepted by the system.
     34  *       UTF-8 and most encodings have simple ASCII or ISO-Latin
     35  *       characters as a subset, so in most cases the strings really
     36  *       don't need to be converted, but we don't know that easily.
     37  *       Parts of messages can be non-ASCII in some cases, so they may
     38  *       include classnames, methodnames, signatures, or other pieces
     39  *       that could contain non-ASCII characters, either from JNI or
     40  *       JVMTI (which both return modified UTF-8 strings).
     41  *       (It's possible that the platform encoding IS UTF-8, but we
     42  *       assume not, just to be safe).
     43  *
     44  */
     45 
     46 #include <stdarg.h>
     47 #include <errno.h>
     48 
     49 #include "util.h"
     50 #include "proc_md.h"
     51 
     52 /* Maximim length of a message */
     53 #define MAX_MESSAGE_LEN MAXPATHLEN*2+512
     54 
     55 /* Print message in platform encoding (assume all input is UTF-8 safe)
     56  *    NOTE: This function is at the lowest level of the call tree.
     57  *          Do not use the ERROR* macros here.
     58  */
     59 static void
     60 vprint_message(FILE *fp, const char *prefix, const char *suffix,
     61                const char *format, va_list ap)
     62 {
     63     jbyte  utf8buf[MAX_MESSAGE_LEN+1];
     64     int    len;
     65     char   pbuf[MAX_MESSAGE_LEN+1];
     66 
     67     /* Fill buffer with single UTF-8 string */
     68     (void)vsnprintf((char*)utf8buf, MAX_MESSAGE_LEN, format, ap);
     69     utf8buf[MAX_MESSAGE_LEN] = 0;
     70     len = (int)strlen((char*)utf8buf);
     71 
     72     /* Convert to platform encoding (ignore errors, dangerous area) */
     73     if (gdata->npt != NULL) {
     74         (void)(gdata->npt->utf8ToPlatform)(gdata->npt->utf,
     75                utf8buf, len, pbuf, MAX_MESSAGE_LEN);
     76     } else {
     77         /* May be called before NPT is initialized so don't fault */
     78         strncpy(pbuf, (char*)utf8buf, len);
     79     }
     80     (void)fprintf(fp, "%s%s%s", prefix, pbuf, suffix);
     81 }
     82 
     83 /* Print message in platform encoding (assume all input is UTF-8 safe)
     84  *    NOTE: This function is at the lowest level of the call tree.
     85  *          Do not use the ERROR* macros here.
     86  */
     87 void
     88 print_message(FILE *fp, const char *prefix,  const char *suffix,
     89               const char *format, ...)
     90 {
     91     va_list ap;
     92 
     93     va_start(ap, format);
     94     vprint_message(fp, prefix, suffix, format, ap);
     95     va_end(ap);
     96 }
     97 
     98 /* Generate error message */
     99 void
    100 error_message(const char *format, ...)
    101 {
    102     va_list ap;
    103 
    104     va_start(ap, format);
    105     vprint_message(stderr, "ERROR: ", "\n", format, ap);
    106     va_end(ap);
    107     if ( gdata->doerrorexit ) {
    108         EXIT_ERROR(AGENT_ERROR_INTERNAL,"Requested errorexit=y exit()");
    109     }
    110 }
    111 
    112 /* Print plain message to stdout. */
    113 void
    114 tty_message(const char *format, ...)
    115 {
    116     va_list ap;
    117 
    118     va_start(ap, format);
    119     vprint_message(stdout, "", "\n", format, ap);
    120     va_end(ap);
    121     (void)fflush(stdout);
    122 }
    123 
    124 /* Print assertion error message to stderr. */
    125 void
    126 jdiAssertionFailed(char *fileName, int lineNumber, char *msg)
    127 {
    128     LOG_MISC(("ASSERT FAILED: %s : %d - %s\n", fileName, lineNumber, msg));
    129     print_message(stderr, "ASSERT FAILED: ", "\n",
    130         "%s : %d - %s", fileName, lineNumber, msg);
    131     if (gdata && gdata->assertFatal) {
    132         EXIT_ERROR(AGENT_ERROR_INTERNAL,"Assertion Failed");
    133     }
    134 }
    135 
    136 /* Macro for case on switch, returns string for name. */
    137 #define CASE_RETURN_TEXT(name) case name: return #name;
    138 
    139 /* Mapping of JVMTI errors to their name */
    140 const char *
    141 jvmtiErrorText(jvmtiError error)
    142 {
    143     switch (error) {
    144         CASE_RETURN_TEXT(JVMTI_ERROR_NONE)
    145         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_THREAD)
    146         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_THREAD_GROUP)
    147         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_PRIORITY)
    148         CASE_RETURN_TEXT(JVMTI_ERROR_THREAD_NOT_SUSPENDED)
    149         CASE_RETURN_TEXT(JVMTI_ERROR_THREAD_SUSPENDED)
    150         CASE_RETURN_TEXT(JVMTI_ERROR_THREAD_NOT_ALIVE)
    151         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_OBJECT)
    152         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_CLASS)
    153         CASE_RETURN_TEXT(JVMTI_ERROR_CLASS_NOT_PREPARED)
    154         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_METHODID)
    155         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_LOCATION)
    156         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_FIELDID)
    157         CASE_RETURN_TEXT(JVMTI_ERROR_NO_MORE_FRAMES)
    158         CASE_RETURN_TEXT(JVMTI_ERROR_OPAQUE_FRAME)
    159         CASE_RETURN_TEXT(JVMTI_ERROR_TYPE_MISMATCH)
    160         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_SLOT)
    161         CASE_RETURN_TEXT(JVMTI_ERROR_DUPLICATE)
    162         CASE_RETURN_TEXT(JVMTI_ERROR_NOT_FOUND)
    163         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_MONITOR)
    164         CASE_RETURN_TEXT(JVMTI_ERROR_NOT_MONITOR_OWNER)
    165         CASE_RETURN_TEXT(JVMTI_ERROR_INTERRUPT)
    166         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_CLASS_FORMAT)
    167         CASE_RETURN_TEXT(JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION)
    168         CASE_RETURN_TEXT(JVMTI_ERROR_FAILS_VERIFICATION)
    169         CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED)
    170         CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED)
    171         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_TYPESTATE)
    172         CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED)
    173         CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED)
    174         CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_VERSION)
    175         CASE_RETURN_TEXT(JVMTI_ERROR_NAMES_DONT_MATCH)
    176         CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED)
    177         CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED)
    178         CASE_RETURN_TEXT(JVMTI_ERROR_NOT_AVAILABLE)
    179         CASE_RETURN_TEXT(JVMTI_ERROR_MUST_POSSESS_CAPABILITY)
    180         CASE_RETURN_TEXT(JVMTI_ERROR_NULL_POINTER)
    181         CASE_RETURN_TEXT(JVMTI_ERROR_ABSENT_INFORMATION)
    182         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_EVENT_TYPE)
    183         CASE_RETURN_TEXT(JVMTI_ERROR_ILLEGAL_ARGUMENT)
    184         CASE_RETURN_TEXT(JVMTI_ERROR_OUT_OF_MEMORY)
    185         CASE_RETURN_TEXT(JVMTI_ERROR_ACCESS_DENIED)
    186         CASE_RETURN_TEXT(JVMTI_ERROR_WRONG_PHASE)
    187         CASE_RETURN_TEXT(JVMTI_ERROR_INTERNAL)
    188         CASE_RETURN_TEXT(JVMTI_ERROR_UNATTACHED_THREAD)
    189         CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_ENVIRONMENT)
    190 
    191         CASE_RETURN_TEXT(AGENT_ERROR_INTERNAL)
    192         CASE_RETURN_TEXT(AGENT_ERROR_VM_DEAD)
    193         CASE_RETURN_TEXT(AGENT_ERROR_NO_JNI_ENV)
    194         CASE_RETURN_TEXT(AGENT_ERROR_JNI_EXCEPTION)
    195         CASE_RETURN_TEXT(AGENT_ERROR_JVMTI_INTERNAL)
    196         CASE_RETURN_TEXT(AGENT_ERROR_JDWP_INTERNAL)
    197         CASE_RETURN_TEXT(AGENT_ERROR_NOT_CURRENT_FRAME)
    198         CASE_RETURN_TEXT(AGENT_ERROR_OUT_OF_MEMORY)
    199         CASE_RETURN_TEXT(AGENT_ERROR_INVALID_TAG)
    200         CASE_RETURN_TEXT(AGENT_ERROR_ALREADY_INVOKING)
    201         CASE_RETURN_TEXT(AGENT_ERROR_INVALID_INDEX)
    202         CASE_RETURN_TEXT(AGENT_ERROR_INVALID_LENGTH)
    203         CASE_RETURN_TEXT(AGENT_ERROR_INVALID_STRING)
    204         CASE_RETURN_TEXT(AGENT_ERROR_INVALID_CLASS_LOADER)
    205         CASE_RETURN_TEXT(AGENT_ERROR_INVALID_ARRAY)
    206         CASE_RETURN_TEXT(AGENT_ERROR_TRANSPORT_LOAD)
    207         CASE_RETURN_TEXT(AGENT_ERROR_TRANSPORT_INIT)
    208         CASE_RETURN_TEXT(AGENT_ERROR_NATIVE_METHOD)
    209         CASE_RETURN_TEXT(AGENT_ERROR_INVALID_COUNT)
    210         CASE_RETURN_TEXT(AGENT_ERROR_INVALID_FRAMEID)
    211         CASE_RETURN_TEXT(AGENT_ERROR_NULL_POINTER)
    212         CASE_RETURN_TEXT(AGENT_ERROR_ILLEGAL_ARGUMENT)
    213         CASE_RETURN_TEXT(AGENT_ERROR_INVALID_THREAD)
    214         CASE_RETURN_TEXT(AGENT_ERROR_INVALID_EVENT_TYPE)
    215         CASE_RETURN_TEXT(AGENT_ERROR_INVALID_OBJECT)
    216         CASE_RETURN_TEXT(AGENT_ERROR_NO_MORE_FRAMES)
    217 
    218         default: return  "ERROR_unknown";
    219     }
    220 }
    221 
    222 const char *
    223 eventText(int i)
    224 {
    225     switch ( i ) {
    226         CASE_RETURN_TEXT(EI_SINGLE_STEP)
    227         CASE_RETURN_TEXT(EI_BREAKPOINT)
    228         CASE_RETURN_TEXT(EI_FRAME_POP)
    229         CASE_RETURN_TEXT(EI_EXCEPTION)
    230         CASE_RETURN_TEXT(EI_THREAD_START)
    231         CASE_RETURN_TEXT(EI_THREAD_END)
    232         CASE_RETURN_TEXT(EI_CLASS_PREPARE)
    233         CASE_RETURN_TEXT(EI_CLASS_LOAD)
    234         CASE_RETURN_TEXT(EI_FIELD_ACCESS)
    235         CASE_RETURN_TEXT(EI_FIELD_MODIFICATION)
    236         CASE_RETURN_TEXT(EI_EXCEPTION_CATCH)
    237         CASE_RETURN_TEXT(EI_METHOD_ENTRY)
    238         CASE_RETURN_TEXT(EI_METHOD_EXIT)
    239         CASE_RETURN_TEXT(EI_VM_INIT)
    240         CASE_RETURN_TEXT(EI_VM_DEATH)
    241         CASE_RETURN_TEXT(EI_GC_FINISH)
    242         default: return "EVENT_unknown";
    243     }
    244 }
    245 
    246 /* Macro for case on switch, returns string for name. */
    247 #define CASE_RETURN_JDWP_ERROR_TEXT(name) case JDWP_ERROR(name): return #name;
    248 
    249 const char *
    250 jdwpErrorText(jdwpError serror)
    251 {
    252     switch ( serror ) {
    253         CASE_RETURN_JDWP_ERROR_TEXT(NONE)
    254         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_THREAD)
    255         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_THREAD_GROUP)
    256         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_PRIORITY)
    257         CASE_RETURN_JDWP_ERROR_TEXT(THREAD_NOT_SUSPENDED)
    258         CASE_RETURN_JDWP_ERROR_TEXT(THREAD_SUSPENDED)
    259         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_OBJECT)
    260         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_CLASS)
    261         CASE_RETURN_JDWP_ERROR_TEXT(CLASS_NOT_PREPARED)
    262         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_METHODID)
    263         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_LOCATION)
    264         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_FIELDID)
    265         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_FRAMEID)
    266         CASE_RETURN_JDWP_ERROR_TEXT(NO_MORE_FRAMES)
    267         CASE_RETURN_JDWP_ERROR_TEXT(OPAQUE_FRAME)
    268         CASE_RETURN_JDWP_ERROR_TEXT(NOT_CURRENT_FRAME)
    269         CASE_RETURN_JDWP_ERROR_TEXT(TYPE_MISMATCH)
    270         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_SLOT)
    271         CASE_RETURN_JDWP_ERROR_TEXT(DUPLICATE)
    272         CASE_RETURN_JDWP_ERROR_TEXT(NOT_FOUND)
    273         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_MONITOR)
    274         CASE_RETURN_JDWP_ERROR_TEXT(NOT_MONITOR_OWNER)
    275         CASE_RETURN_JDWP_ERROR_TEXT(INTERRUPT)
    276         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_CLASS_FORMAT)
    277         CASE_RETURN_JDWP_ERROR_TEXT(CIRCULAR_CLASS_DEFINITION)
    278         CASE_RETURN_JDWP_ERROR_TEXT(FAILS_VERIFICATION)
    279         CASE_RETURN_JDWP_ERROR_TEXT(ADD_METHOD_NOT_IMPLEMENTED)
    280         CASE_RETURN_JDWP_ERROR_TEXT(SCHEMA_CHANGE_NOT_IMPLEMENTED)
    281         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_TYPESTATE)
    282         CASE_RETURN_JDWP_ERROR_TEXT(HIERARCHY_CHANGE_NOT_IMPLEMENTED)
    283         CASE_RETURN_JDWP_ERROR_TEXT(DELETE_METHOD_NOT_IMPLEMENTED)
    284         CASE_RETURN_JDWP_ERROR_TEXT(UNSUPPORTED_VERSION)
    285         CASE_RETURN_JDWP_ERROR_TEXT(NAMES_DONT_MATCH)
    286         CASE_RETURN_JDWP_ERROR_TEXT(CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED)
    287         CASE_RETURN_JDWP_ERROR_TEXT(METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED)
    288         CASE_RETURN_JDWP_ERROR_TEXT(NOT_IMPLEMENTED)
    289         CASE_RETURN_JDWP_ERROR_TEXT(NULL_POINTER)
    290         CASE_RETURN_JDWP_ERROR_TEXT(ABSENT_INFORMATION)
    291         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_EVENT_TYPE)
    292         CASE_RETURN_JDWP_ERROR_TEXT(ILLEGAL_ARGUMENT)
    293         CASE_RETURN_JDWP_ERROR_TEXT(OUT_OF_MEMORY)
    294         CASE_RETURN_JDWP_ERROR_TEXT(ACCESS_DENIED)
    295         CASE_RETURN_JDWP_ERROR_TEXT(VM_DEAD)
    296         CASE_RETURN_JDWP_ERROR_TEXT(INTERNAL)
    297         CASE_RETURN_JDWP_ERROR_TEXT(UNATTACHED_THREAD)
    298         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_TAG)
    299         CASE_RETURN_JDWP_ERROR_TEXT(ALREADY_INVOKING)
    300         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_INDEX)
    301         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_LENGTH)
    302         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_STRING)
    303         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_CLASS_LOADER)
    304         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_ARRAY)
    305         CASE_RETURN_JDWP_ERROR_TEXT(TRANSPORT_LOAD)
    306         CASE_RETURN_JDWP_ERROR_TEXT(TRANSPORT_INIT)
    307         CASE_RETURN_JDWP_ERROR_TEXT(NATIVE_METHOD)
    308         CASE_RETURN_JDWP_ERROR_TEXT(INVALID_COUNT)
    309         default: return "JDWP_ERROR_unknown";
    310     }
    311 }
    312 
    313 static int p = 1;
    314 
    315 void
    316 do_pause(void)
    317 {
    318     THREAD_T tid = GET_THREAD_ID();
    319     PID_T pid    = GETPID();
    320     int timeleft = 600; /* 10 minutes max */
    321     int interval = 10;  /* 10 second message check */
    322 
    323     /*LINTED*/
    324     tty_message("DEBUGGING: JDWP pause for PID %d, THREAD %d (0x%x)",
    325                     /*LINTED*/
    326                     (int)(intptr_t)pid, (int)(intptr_t)tid, (int)(intptr_t)tid);
    327     while ( p && timeleft > 0 ) {
    328         (void)sleep(interval); /* 'assign p = 0;' to get out of loop */
    329         timeleft -= interval;
    330     }
    331     if ( timeleft <= 0 ) {
    332         tty_message("DEBUGGING: JDWP pause got tired of waiting and gave up.");
    333     }
    334 }
    335