Home | History | Annotate | Download | only in ti-agent
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "jvmti_helper.h"
     18 
     19 #include <algorithm>
     20 #include <dlfcn.h>
     21 #include <stdio.h>
     22 #include <sstream>
     23 #include <string.h>
     24 
     25 #include "android-base/logging.h"
     26 #include "scoped_local_ref.h"
     27 
     28 namespace art {
     29 
     30 void CheckJvmtiError(jvmtiEnv* env, jvmtiError error) {
     31   if (error != JVMTI_ERROR_NONE) {
     32     char* error_name;
     33     jvmtiError name_error = env->GetErrorName(error, &error_name);
     34     if (name_error != JVMTI_ERROR_NONE) {
     35       LOG(FATAL) << "Unable to get error name for " << error;
     36     }
     37     LOG(FATAL) << "Unexpected error: " << error_name;
     38   }
     39 }
     40 
     41 void SetAllCapabilities(jvmtiEnv* env) {
     42   jvmtiCapabilities caps;
     43   jvmtiError error1 = env->GetPotentialCapabilities(&caps);
     44   CheckJvmtiError(env, error1);
     45   jvmtiError error2 = env->AddCapabilities(&caps);
     46   CheckJvmtiError(env, error2);
     47 }
     48 
     49 bool JvmtiErrorToException(JNIEnv* env, jvmtiEnv* jvmti_env, jvmtiError error) {
     50   if (error == JVMTI_ERROR_NONE) {
     51     return false;
     52   }
     53 
     54   ScopedLocalRef<jclass> rt_exception(env, env->FindClass("java/lang/RuntimeException"));
     55   if (rt_exception.get() == nullptr) {
     56     // CNFE should be pending.
     57     return true;
     58   }
     59 
     60   char* err;
     61   CheckJvmtiError(jvmti_env, jvmti_env->GetErrorName(error, &err));
     62 
     63   env->ThrowNew(rt_exception.get(), err);
     64 
     65   Deallocate(jvmti_env, err);
     66   return true;
     67 }
     68 
     69 std::ostream& operator<<(std::ostream& os, const jvmtiError& rhs) {
     70   switch (rhs) {
     71     case JVMTI_ERROR_NONE:
     72       return os << "NONE";
     73     case JVMTI_ERROR_INVALID_THREAD:
     74       return os << "INVALID_THREAD";
     75     case JVMTI_ERROR_INVALID_THREAD_GROUP:
     76       return os << "INVALID_THREAD_GROUP";
     77     case JVMTI_ERROR_INVALID_PRIORITY:
     78       return os << "INVALID_PRIORITY";
     79     case JVMTI_ERROR_THREAD_NOT_SUSPENDED:
     80       return os << "THREAD_NOT_SUSPENDED";
     81     case JVMTI_ERROR_THREAD_SUSPENDED:
     82       return os << "THREAD_SUSPENDED";
     83     case JVMTI_ERROR_THREAD_NOT_ALIVE:
     84       return os << "THREAD_NOT_ALIVE";
     85     case JVMTI_ERROR_INVALID_OBJECT:
     86       return os << "INVALID_OBJECT";
     87     case JVMTI_ERROR_INVALID_CLASS:
     88       return os << "INVALID_CLASS";
     89     case JVMTI_ERROR_CLASS_NOT_PREPARED:
     90       return os << "CLASS_NOT_PREPARED";
     91     case JVMTI_ERROR_INVALID_METHODID:
     92       return os << "INVALID_METHODID";
     93     case JVMTI_ERROR_INVALID_LOCATION:
     94       return os << "INVALID_LOCATION";
     95     case JVMTI_ERROR_INVALID_FIELDID:
     96       return os << "INVALID_FIELDID";
     97     case JVMTI_ERROR_NO_MORE_FRAMES:
     98       return os << "NO_MORE_FRAMES";
     99     case JVMTI_ERROR_OPAQUE_FRAME:
    100       return os << "OPAQUE_FRAME";
    101     case JVMTI_ERROR_TYPE_MISMATCH:
    102       return os << "TYPE_MISMATCH";
    103     case JVMTI_ERROR_INVALID_SLOT:
    104       return os << "INVALID_SLOT";
    105     case JVMTI_ERROR_DUPLICATE:
    106       return os << "DUPLICATE";
    107     case JVMTI_ERROR_NOT_FOUND:
    108       return os << "NOT_FOUND";
    109     case JVMTI_ERROR_INVALID_MONITOR:
    110       return os << "INVALID_MONITOR";
    111     case JVMTI_ERROR_NOT_MONITOR_OWNER:
    112       return os << "NOT_MONITOR_OWNER";
    113     case JVMTI_ERROR_INTERRUPT:
    114       return os << "INTERRUPT";
    115     case JVMTI_ERROR_INVALID_CLASS_FORMAT:
    116       return os << "INVALID_CLASS_FORMAT";
    117     case JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION:
    118       return os << "CIRCULAR_CLASS_DEFINITION";
    119     case JVMTI_ERROR_FAILS_VERIFICATION:
    120       return os << "FAILS_VERIFICATION";
    121     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED:
    122       return os << "UNSUPPORTED_REDEFINITION_METHOD_ADDED";
    123     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED:
    124       return os << "UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED";
    125     case JVMTI_ERROR_INVALID_TYPESTATE:
    126       return os << "INVALID_TYPESTATE";
    127     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED:
    128       return os << "UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED";
    129     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED:
    130       return os << "UNSUPPORTED_REDEFINITION_METHOD_DELETED";
    131     case JVMTI_ERROR_UNSUPPORTED_VERSION:
    132       return os << "UNSUPPORTED_VERSION";
    133     case JVMTI_ERROR_NAMES_DONT_MATCH:
    134       return os << "NAMES_DONT_MATCH";
    135     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED:
    136       return os << "UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED";
    137     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED:
    138       return os << "UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED";
    139     case JVMTI_ERROR_UNMODIFIABLE_CLASS:
    140       return os << "JVMTI_ERROR_UNMODIFIABLE_CLASS";
    141     case JVMTI_ERROR_NOT_AVAILABLE:
    142       return os << "NOT_AVAILABLE";
    143     case JVMTI_ERROR_MUST_POSSESS_CAPABILITY:
    144       return os << "MUST_POSSESS_CAPABILITY";
    145     case JVMTI_ERROR_NULL_POINTER:
    146       return os << "NULL_POINTER";
    147     case JVMTI_ERROR_ABSENT_INFORMATION:
    148       return os << "ABSENT_INFORMATION";
    149     case JVMTI_ERROR_INVALID_EVENT_TYPE:
    150       return os << "INVALID_EVENT_TYPE";
    151     case JVMTI_ERROR_ILLEGAL_ARGUMENT:
    152       return os << "ILLEGAL_ARGUMENT";
    153     case JVMTI_ERROR_NATIVE_METHOD:
    154       return os << "NATIVE_METHOD";
    155     case JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED:
    156       return os << "CLASS_LOADER_UNSUPPORTED";
    157     case JVMTI_ERROR_OUT_OF_MEMORY:
    158       return os << "OUT_OF_MEMORY";
    159     case JVMTI_ERROR_ACCESS_DENIED:
    160       return os << "ACCESS_DENIED";
    161     case JVMTI_ERROR_WRONG_PHASE:
    162       return os << "WRONG_PHASE";
    163     case JVMTI_ERROR_INTERNAL:
    164       return os << "INTERNAL";
    165     case JVMTI_ERROR_UNATTACHED_THREAD:
    166       return os << "UNATTACHED_THREAD";
    167     case JVMTI_ERROR_INVALID_ENVIRONMENT:
    168       return os << "INVALID_ENVIRONMENT";
    169   }
    170   LOG(FATAL) << "Unexpected error type " << static_cast<int>(rhs);
    171   __builtin_unreachable();
    172 }
    173 
    174 }  // namespace art
    175