Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/back/error_messages.c
38765 views
/*1* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425/* Error message and general message handling functions. */2627/* NOTE: We assume that most strings passed around this library are28* UTF-8 (modified or standard) and not platform encoding.29* Before sending any strings to the "system" (e.g. OS system30* calls, or system input/output functions like fprintf) we need31* to make sure that the strings are transformed from UTF-8 to32* the platform encoding accepted by the system.33* UTF-8 and most encodings have simple ASCII or ISO-Latin34* characters as a subset, so in most cases the strings really35* don't need to be converted, but we don't know that easily.36* Parts of messages can be non-ASCII in some cases, so they may37* include classnames, methodnames, signatures, or other pieces38* that could contain non-ASCII characters, either from JNI or39* JVMTI (which both return modified UTF-8 strings).40* (It's possible that the platform encoding IS UTF-8, but we41* assume not, just to be safe).42*43*/4445#include <stdarg.h>46#include <errno.h>4748#include "util.h"49#include "proc_md.h"5051/* Maximim length of a message */52#define MAX_MESSAGE_LEN MAXPATHLEN*2+5125354/* Print message in platform encoding (assume all input is UTF-8 safe)55* NOTE: This function is at the lowest level of the call tree.56* Do not use the ERROR* macros here.57*/58static void59vprint_message(FILE *fp, const char *prefix, const char *suffix,60const char *format, va_list ap)61{62jbyte utf8buf[MAX_MESSAGE_LEN+1];63int len;64char pbuf[MAX_MESSAGE_LEN+1];6566/* Fill buffer with single UTF-8 string */67(void)vsnprintf((char*)utf8buf, MAX_MESSAGE_LEN, format, ap);68utf8buf[MAX_MESSAGE_LEN] = 0;69len = (int)strlen((char*)utf8buf);7071/* Convert to platform encoding (ignore errors, dangerous area) */72if (gdata->npt != NULL) {73(void)(gdata->npt->utf8ToPlatform)(gdata->npt->utf,74utf8buf, len, pbuf, MAX_MESSAGE_LEN);75} else {76/* May be called before NPT is initialized so don't fault */77strncpy(pbuf, (char*)utf8buf, len);78}79(void)fprintf(fp, "%s%s%s", prefix, pbuf, suffix);80}8182/* Print message in platform encoding (assume all input is UTF-8 safe)83* NOTE: This function is at the lowest level of the call tree.84* Do not use the ERROR* macros here.85*/86void87print_message(FILE *fp, const char *prefix, const char *suffix,88const char *format, ...)89{90va_list ap;9192va_start(ap, format);93vprint_message(fp, prefix, suffix, format, ap);94va_end(ap);95}9697/* Generate error message */98void99error_message(const char *format, ...)100{101va_list ap;102103va_start(ap, format);104vprint_message(stderr, "ERROR: ", "\n", format, ap);105va_end(ap);106if ( gdata->doerrorexit ) {107EXIT_ERROR(AGENT_ERROR_INTERNAL,"Requested errorexit=y exit()");108}109}110111/* Print plain message to stdout. */112void113tty_message(const char *format, ...)114{115va_list ap;116117va_start(ap, format);118vprint_message(stdout, "", "\n", format, ap);119va_end(ap);120(void)fflush(stdout);121}122123/* Print assertion error message to stderr. */124void125jdiAssertionFailed(char *fileName, int lineNumber, char *msg)126{127LOG_MISC(("ASSERT FAILED: %s : %d - %s\n", fileName, lineNumber, msg));128print_message(stderr, "ASSERT FAILED: ", "\n",129"%s : %d - %s", fileName, lineNumber, msg);130if (gdata && gdata->assertFatal) {131EXIT_ERROR(AGENT_ERROR_INTERNAL,"Assertion Failed");132}133}134135/* Macro for case on switch, returns string for name. */136#define CASE_RETURN_TEXT(name) case name: return #name;137138/* Mapping of JVMTI errors to their name */139const char *140jvmtiErrorText(jvmtiError error)141{142switch (error) {143CASE_RETURN_TEXT(JVMTI_ERROR_NONE)144CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_THREAD)145CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_THREAD_GROUP)146CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_PRIORITY)147CASE_RETURN_TEXT(JVMTI_ERROR_THREAD_NOT_SUSPENDED)148CASE_RETURN_TEXT(JVMTI_ERROR_THREAD_SUSPENDED)149CASE_RETURN_TEXT(JVMTI_ERROR_THREAD_NOT_ALIVE)150CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_OBJECT)151CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_CLASS)152CASE_RETURN_TEXT(JVMTI_ERROR_CLASS_NOT_PREPARED)153CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_METHODID)154CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_LOCATION)155CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_FIELDID)156CASE_RETURN_TEXT(JVMTI_ERROR_NO_MORE_FRAMES)157CASE_RETURN_TEXT(JVMTI_ERROR_OPAQUE_FRAME)158CASE_RETURN_TEXT(JVMTI_ERROR_TYPE_MISMATCH)159CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_SLOT)160CASE_RETURN_TEXT(JVMTI_ERROR_DUPLICATE)161CASE_RETURN_TEXT(JVMTI_ERROR_NOT_FOUND)162CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_MONITOR)163CASE_RETURN_TEXT(JVMTI_ERROR_NOT_MONITOR_OWNER)164CASE_RETURN_TEXT(JVMTI_ERROR_INTERRUPT)165CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_CLASS_FORMAT)166CASE_RETURN_TEXT(JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION)167CASE_RETURN_TEXT(JVMTI_ERROR_FAILS_VERIFICATION)168CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED)169CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED)170CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_TYPESTATE)171CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED)172CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED)173CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_VERSION)174CASE_RETURN_TEXT(JVMTI_ERROR_NAMES_DONT_MATCH)175CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED)176CASE_RETURN_TEXT(JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED)177CASE_RETURN_TEXT(JVMTI_ERROR_NOT_AVAILABLE)178CASE_RETURN_TEXT(JVMTI_ERROR_MUST_POSSESS_CAPABILITY)179CASE_RETURN_TEXT(JVMTI_ERROR_NULL_POINTER)180CASE_RETURN_TEXT(JVMTI_ERROR_ABSENT_INFORMATION)181CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_EVENT_TYPE)182CASE_RETURN_TEXT(JVMTI_ERROR_ILLEGAL_ARGUMENT)183CASE_RETURN_TEXT(JVMTI_ERROR_OUT_OF_MEMORY)184CASE_RETURN_TEXT(JVMTI_ERROR_ACCESS_DENIED)185CASE_RETURN_TEXT(JVMTI_ERROR_WRONG_PHASE)186CASE_RETURN_TEXT(JVMTI_ERROR_INTERNAL)187CASE_RETURN_TEXT(JVMTI_ERROR_UNATTACHED_THREAD)188CASE_RETURN_TEXT(JVMTI_ERROR_INVALID_ENVIRONMENT)189190CASE_RETURN_TEXT(AGENT_ERROR_INTERNAL)191CASE_RETURN_TEXT(AGENT_ERROR_VM_DEAD)192CASE_RETURN_TEXT(AGENT_ERROR_NO_JNI_ENV)193CASE_RETURN_TEXT(AGENT_ERROR_JNI_EXCEPTION)194CASE_RETURN_TEXT(AGENT_ERROR_JVMTI_INTERNAL)195CASE_RETURN_TEXT(AGENT_ERROR_JDWP_INTERNAL)196CASE_RETURN_TEXT(AGENT_ERROR_NOT_CURRENT_FRAME)197CASE_RETURN_TEXT(AGENT_ERROR_OUT_OF_MEMORY)198CASE_RETURN_TEXT(AGENT_ERROR_INVALID_TAG)199CASE_RETURN_TEXT(AGENT_ERROR_ALREADY_INVOKING)200CASE_RETURN_TEXT(AGENT_ERROR_INVALID_INDEX)201CASE_RETURN_TEXT(AGENT_ERROR_INVALID_LENGTH)202CASE_RETURN_TEXT(AGENT_ERROR_INVALID_STRING)203CASE_RETURN_TEXT(AGENT_ERROR_INVALID_CLASS_LOADER)204CASE_RETURN_TEXT(AGENT_ERROR_INVALID_ARRAY)205CASE_RETURN_TEXT(AGENT_ERROR_TRANSPORT_LOAD)206CASE_RETURN_TEXT(AGENT_ERROR_TRANSPORT_INIT)207CASE_RETURN_TEXT(AGENT_ERROR_NATIVE_METHOD)208CASE_RETURN_TEXT(AGENT_ERROR_INVALID_COUNT)209CASE_RETURN_TEXT(AGENT_ERROR_INVALID_FRAMEID)210CASE_RETURN_TEXT(AGENT_ERROR_NULL_POINTER)211CASE_RETURN_TEXT(AGENT_ERROR_ILLEGAL_ARGUMENT)212CASE_RETURN_TEXT(AGENT_ERROR_INVALID_THREAD)213CASE_RETURN_TEXT(AGENT_ERROR_INVALID_EVENT_TYPE)214CASE_RETURN_TEXT(AGENT_ERROR_INVALID_OBJECT)215CASE_RETURN_TEXT(AGENT_ERROR_NO_MORE_FRAMES)216217default: return "ERROR_unknown";218}219}220221const char *222eventText(int i)223{224switch ( i ) {225CASE_RETURN_TEXT(EI_SINGLE_STEP)226CASE_RETURN_TEXT(EI_BREAKPOINT)227CASE_RETURN_TEXT(EI_FRAME_POP)228CASE_RETURN_TEXT(EI_EXCEPTION)229CASE_RETURN_TEXT(EI_THREAD_START)230CASE_RETURN_TEXT(EI_THREAD_END)231CASE_RETURN_TEXT(EI_CLASS_PREPARE)232CASE_RETURN_TEXT(EI_CLASS_LOAD)233CASE_RETURN_TEXT(EI_FIELD_ACCESS)234CASE_RETURN_TEXT(EI_FIELD_MODIFICATION)235CASE_RETURN_TEXT(EI_EXCEPTION_CATCH)236CASE_RETURN_TEXT(EI_METHOD_ENTRY)237CASE_RETURN_TEXT(EI_METHOD_EXIT)238CASE_RETURN_TEXT(EI_VM_INIT)239CASE_RETURN_TEXT(EI_VM_DEATH)240CASE_RETURN_TEXT(EI_GC_FINISH)241default: return "EVENT_unknown";242}243}244245/* Macro for case on switch, returns string for name. */246#define CASE_RETURN_JDWP_ERROR_TEXT(name) case JDWP_ERROR(name): return #name;247248const char *249jdwpErrorText(jdwpError serror)250{251switch ( serror ) {252CASE_RETURN_JDWP_ERROR_TEXT(NONE)253CASE_RETURN_JDWP_ERROR_TEXT(INVALID_THREAD)254CASE_RETURN_JDWP_ERROR_TEXT(INVALID_THREAD_GROUP)255CASE_RETURN_JDWP_ERROR_TEXT(INVALID_PRIORITY)256CASE_RETURN_JDWP_ERROR_TEXT(THREAD_NOT_SUSPENDED)257CASE_RETURN_JDWP_ERROR_TEXT(THREAD_SUSPENDED)258CASE_RETURN_JDWP_ERROR_TEXT(INVALID_OBJECT)259CASE_RETURN_JDWP_ERROR_TEXT(INVALID_CLASS)260CASE_RETURN_JDWP_ERROR_TEXT(CLASS_NOT_PREPARED)261CASE_RETURN_JDWP_ERROR_TEXT(INVALID_METHODID)262CASE_RETURN_JDWP_ERROR_TEXT(INVALID_LOCATION)263CASE_RETURN_JDWP_ERROR_TEXT(INVALID_FIELDID)264CASE_RETURN_JDWP_ERROR_TEXT(INVALID_FRAMEID)265CASE_RETURN_JDWP_ERROR_TEXT(NO_MORE_FRAMES)266CASE_RETURN_JDWP_ERROR_TEXT(OPAQUE_FRAME)267CASE_RETURN_JDWP_ERROR_TEXT(NOT_CURRENT_FRAME)268CASE_RETURN_JDWP_ERROR_TEXT(TYPE_MISMATCH)269CASE_RETURN_JDWP_ERROR_TEXT(INVALID_SLOT)270CASE_RETURN_JDWP_ERROR_TEXT(DUPLICATE)271CASE_RETURN_JDWP_ERROR_TEXT(NOT_FOUND)272CASE_RETURN_JDWP_ERROR_TEXT(INVALID_MONITOR)273CASE_RETURN_JDWP_ERROR_TEXT(NOT_MONITOR_OWNER)274CASE_RETURN_JDWP_ERROR_TEXT(INTERRUPT)275CASE_RETURN_JDWP_ERROR_TEXT(INVALID_CLASS_FORMAT)276CASE_RETURN_JDWP_ERROR_TEXT(CIRCULAR_CLASS_DEFINITION)277CASE_RETURN_JDWP_ERROR_TEXT(FAILS_VERIFICATION)278CASE_RETURN_JDWP_ERROR_TEXT(ADD_METHOD_NOT_IMPLEMENTED)279CASE_RETURN_JDWP_ERROR_TEXT(SCHEMA_CHANGE_NOT_IMPLEMENTED)280CASE_RETURN_JDWP_ERROR_TEXT(INVALID_TYPESTATE)281CASE_RETURN_JDWP_ERROR_TEXT(HIERARCHY_CHANGE_NOT_IMPLEMENTED)282CASE_RETURN_JDWP_ERROR_TEXT(DELETE_METHOD_NOT_IMPLEMENTED)283CASE_RETURN_JDWP_ERROR_TEXT(UNSUPPORTED_VERSION)284CASE_RETURN_JDWP_ERROR_TEXT(NAMES_DONT_MATCH)285CASE_RETURN_JDWP_ERROR_TEXT(CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED)286CASE_RETURN_JDWP_ERROR_TEXT(METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED)287CASE_RETURN_JDWP_ERROR_TEXT(NOT_IMPLEMENTED)288CASE_RETURN_JDWP_ERROR_TEXT(NULL_POINTER)289CASE_RETURN_JDWP_ERROR_TEXT(ABSENT_INFORMATION)290CASE_RETURN_JDWP_ERROR_TEXT(INVALID_EVENT_TYPE)291CASE_RETURN_JDWP_ERROR_TEXT(ILLEGAL_ARGUMENT)292CASE_RETURN_JDWP_ERROR_TEXT(OUT_OF_MEMORY)293CASE_RETURN_JDWP_ERROR_TEXT(ACCESS_DENIED)294CASE_RETURN_JDWP_ERROR_TEXT(VM_DEAD)295CASE_RETURN_JDWP_ERROR_TEXT(INTERNAL)296CASE_RETURN_JDWP_ERROR_TEXT(UNATTACHED_THREAD)297CASE_RETURN_JDWP_ERROR_TEXT(INVALID_TAG)298CASE_RETURN_JDWP_ERROR_TEXT(ALREADY_INVOKING)299CASE_RETURN_JDWP_ERROR_TEXT(INVALID_INDEX)300CASE_RETURN_JDWP_ERROR_TEXT(INVALID_LENGTH)301CASE_RETURN_JDWP_ERROR_TEXT(INVALID_STRING)302CASE_RETURN_JDWP_ERROR_TEXT(INVALID_CLASS_LOADER)303CASE_RETURN_JDWP_ERROR_TEXT(INVALID_ARRAY)304CASE_RETURN_JDWP_ERROR_TEXT(TRANSPORT_LOAD)305CASE_RETURN_JDWP_ERROR_TEXT(TRANSPORT_INIT)306CASE_RETURN_JDWP_ERROR_TEXT(NATIVE_METHOD)307CASE_RETURN_JDWP_ERROR_TEXT(INVALID_COUNT)308default: return "JDWP_ERROR_unknown";309}310}311312static int p = 1;313314void315do_pause(void)316{317THREAD_T tid = GET_THREAD_ID();318PID_T pid = GETPID();319int timeleft = 600; /* 10 minutes max */320int interval = 10; /* 10 second message check */321322/*LINTED*/323tty_message("DEBUGGING: JDWP pause for PID %d, THREAD %d (0x%x)",324/*LINTED*/325(int)(intptr_t)pid, (int)(intptr_t)tid, (int)(intptr_t)tid);326while ( p && timeleft > 0 ) {327(void)sleep(interval); /* 'assign p = 0;' to get out of loop */328timeleft -= interval;329}330if ( timeleft <= 0 ) {331tty_message("DEBUGGING: JDWP pause got tired of waiting and gave up.");332}333}334335336