1 /*
   2  * Copyright (c) 2003, 2018, 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.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 #include <stdio.h>
  25 #include <string.h>
  26 #include "JVMTITools.h"
  27 
  28 #ifdef __cplusplus
  29 extern "C" {
  30 #endif
  31 
  32 const char* TranslateState(jint flags) {
  33     static char str[15 * 20];
  34 
  35     if (flags == 0)
  36         return "<none>";
  37 
  38     str[0] = '\0';
  39 
  40     if (flags & JVMTI_THREAD_STATE_ALIVE) {
  41         strcat(str, " ALIVE");
  42     }
  43 
  44     if (flags & JVMTI_THREAD_STATE_TERMINATED) {
  45         strcat(str, " TERMINATED");
  46     }
  47 
  48     if (flags & JVMTI_THREAD_STATE_RUNNABLE) {
  49         strcat(str, " RUNNABLE");
  50     }
  51 
  52     if (flags & JVMTI_THREAD_STATE_WAITING) {
  53         strcat(str, " WAITING");
  54     }
  55 
  56     if (flags & JVMTI_THREAD_STATE_WAITING_INDEFINITELY) {
  57         strcat(str, " WAITING_INDEFINITELY");
  58     }
  59 
  60     if (flags & JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT) {
  61         strcat(str, " WAITING_WITH_TIMEOUT");
  62     }
  63 
  64     if (flags & JVMTI_THREAD_STATE_SLEEPING) {
  65         strcat(str, " SLEEPING");
  66     }
  67 
  68     if (flags & JVMTI_THREAD_STATE_IN_OBJECT_WAIT) {
  69         strcat(str, " IN_OBJECT_WAIT");
  70     }
  71 
  72     if (flags & JVMTI_THREAD_STATE_PARKED) {
  73         strcat(str, " PARKED");
  74     }
  75 
  76     if (flags & JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER) {
  77         strcat(str, " BLOCKED_ON_MONITOR_ENTER");
  78     }
  79 
  80     if (flags & JVMTI_THREAD_STATE_SUSPENDED) {
  81         strcat(str, " SUSPENDED");
  82     }
  83 
  84     if (flags & JVMTI_THREAD_STATE_INTERRUPTED) {
  85         strcat(str, " INTERRUPTED");
  86     }
  87 
  88     if (flags & JVMTI_THREAD_STATE_IN_NATIVE) {
  89         strcat(str, " IN_NATIVE");
  90     }
  91 
  92 
  93     return str;
  94 }
  95 
  96 const char* TranslateEvent(jvmtiEvent event_type) {
  97     switch (event_type) {
  98     case JVMTI_EVENT_VM_INIT:
  99         return ("JVMTI_EVENT_VM_INIT");
 100     case JVMTI_EVENT_VM_DEATH:
 101         return ("JVMTI_EVENT_VM_DEATH");
 102     case JVMTI_EVENT_THREAD_START:
 103         return ("JVMTI_EVENT_THREAD_START");
 104     case JVMTI_EVENT_THREAD_END:
 105         return ("JVMTI_EVENT_THREAD_END");
 106     case JVMTI_EVENT_CLASS_FILE_LOAD_HOOK:
 107         return ("JVMTI_EVENT_CLASS_FILE_LOAD_HOOK");
 108     case JVMTI_EVENT_CLASS_LOAD:
 109         return ("JVMTI_EVENT_CLASS_LOAD");
 110     case JVMTI_EVENT_CLASS_PREPARE:
 111         return ("JVMTI_EVENT_CLASS_PREPARE");
 112     case JVMTI_EVENT_VM_START:
 113         return ("JVMTI_EVENT_VM_START");
 114     case JVMTI_EVENT_EXCEPTION:
 115         return ("JVMTI_EVENT_EXCEPTION");
 116     case JVMTI_EVENT_EXCEPTION_CATCH:
 117         return ("JVMTI_EVENT_EXCEPTION_CATCH");
 118     case JVMTI_EVENT_SINGLE_STEP:
 119         return ("JVMTI_EVENT_SINGLE_STEP");
 120     case JVMTI_EVENT_FRAME_POP:
 121         return ("JVMTI_EVENT_FRAME_POP");
 122     case JVMTI_EVENT_BREAKPOINT:
 123         return ("JVMTI_EVENT_BREAKPOINT");
 124     case JVMTI_EVENT_FIELD_ACCESS:
 125         return ("JVMTI_EVENT_FIELD_ACCESS");
 126     case JVMTI_EVENT_FIELD_MODIFICATION:
 127         return ("JVMTI_EVENT_FIELD_MODIFICATION");
 128     case JVMTI_EVENT_METHOD_ENTRY:
 129         return ("JVMTI_EVENT_METHOD_ENTRY");
 130     case JVMTI_EVENT_METHOD_EXIT:
 131         return ("JVMTI_EVENT_METHOD_EXIT");
 132     case JVMTI_EVENT_NATIVE_METHOD_BIND:
 133         return ("JVMTI_EVENT_NATIVE_METHOD_BIND");
 134     case JVMTI_EVENT_COMPILED_METHOD_LOAD:
 135         return ("JVMTI_EVENT_COMPILED_METHOD_LOAD");
 136     case JVMTI_EVENT_COMPILED_METHOD_UNLOAD:
 137         return ("JVMTI_EVENT_COMPILED_METHOD_UNLOAD");
 138     case JVMTI_EVENT_DYNAMIC_CODE_GENERATED:
 139         return ("JVMTI_EVENT_DYNAMIC_CODE_GENERATED");
 140     case JVMTI_EVENT_DATA_DUMP_REQUEST:
 141         return ("JVMTI_EVENT_DATA_DUMP_REQUEST");
 142     case JVMTI_EVENT_MONITOR_WAIT:
 143         return ("JVMTI_EVENT_MONITOR_WAIT");
 144     case JVMTI_EVENT_MONITOR_WAITED:
 145         return ("JVMTI_EVENT_MONITOR_WAITED");
 146     case JVMTI_EVENT_MONITOR_CONTENDED_ENTER:
 147         return ("JVMTI_EVENT_MONITOR_CONTENDED_ENTER");
 148     case JVMTI_EVENT_MONITOR_CONTENDED_ENTERED:
 149         return ("JVMTI_EVENT_MONITOR_CONTENDED_ENTERED");
 150     case JVMTI_EVENT_GARBAGE_COLLECTION_START:
 151         return ("JVMTI_EVENT_GARBAGE_COLLECTION_START");
 152     case JVMTI_EVENT_GARBAGE_COLLECTION_FINISH:
 153         return ("JVMTI_EVENT_GARBAGE_COLLECTION_FINISH");
 154     case JVMTI_EVENT_OBJECT_FREE:
 155         return ("JVMTI_EVENT_OBJECT_FREE");
 156     case JVMTI_EVENT_VM_OBJECT_ALLOC:
 157         return ("JVMTI_EVENT_VM_OBJECT_ALLOC");
 158     default:
 159         return ("<unknown event>");
 160     }
 161 }
 162 
 163 const char* TranslateError(jvmtiError err) {
 164     switch (err) {
 165     case JVMTI_ERROR_NONE:
 166         return ("JVMTI_ERROR_NONE");
 167     case JVMTI_ERROR_INVALID_THREAD:
 168         return ("JVMTI_ERROR_INVALID_THREAD");
 169     case JVMTI_ERROR_INVALID_THREAD_GROUP:
 170         return ("JVMTI_ERROR_INVALID_THREAD_GROUP");
 171     case JVMTI_ERROR_INVALID_PRIORITY:
 172         return ("JVMTI_ERROR_INVALID_PRIORITY");
 173     case JVMTI_ERROR_THREAD_NOT_SUSPENDED:
 174         return ("JVMTI_ERROR_THREAD_NOT_SUSPENDED");
 175     case JVMTI_ERROR_THREAD_SUSPENDED:
 176         return ("JVMTI_ERROR_THREAD_SUSPENDED");
 177     case JVMTI_ERROR_THREAD_NOT_ALIVE:
 178         return ("JVMTI_ERROR_THREAD_NOT_ALIVE");
 179     case JVMTI_ERROR_INVALID_OBJECT:
 180         return ("JVMTI_ERROR_INVALID_OBJECT");
 181     case JVMTI_ERROR_INVALID_CLASS:
 182         return ("JVMTI_ERROR_INVALID_CLASS");
 183     case JVMTI_ERROR_CLASS_NOT_PREPARED:
 184         return ("JVMTI_ERROR_CLASS_NOT_PREPARED");
 185     case JVMTI_ERROR_INVALID_METHODID:
 186         return ("JVMTI_ERROR_INVALID_METHODID");
 187     case JVMTI_ERROR_INVALID_LOCATION:
 188         return ("JVMTI_ERROR_INVALID_LOCATION");
 189     case JVMTI_ERROR_INVALID_FIELDID:
 190         return ("JVMTI_ERROR_INVALID_FIELDID");
 191     case JVMTI_ERROR_NO_MORE_FRAMES:
 192         return ("JVMTI_ERROR_NO_MORE_FRAMES");
 193     case JVMTI_ERROR_OPAQUE_FRAME:
 194         return ("JVMTI_ERROR_OPAQUE_FRAME");
 195     case JVMTI_ERROR_TYPE_MISMATCH:
 196         return ("JVMTI_ERROR_TYPE_MISMATCH");
 197     case JVMTI_ERROR_INVALID_SLOT:
 198         return ("JVMTI_ERROR_INVALID_SLOT");
 199     case JVMTI_ERROR_DUPLICATE:
 200         return ("JVMTI_ERROR_DUPLICATE");
 201     case JVMTI_ERROR_NOT_FOUND:
 202         return ("JVMTI_ERROR_NOT_FOUND");
 203     case JVMTI_ERROR_INVALID_MONITOR:
 204         return ("JVMTI_ERROR_INVALID_MONITOR");
 205     case JVMTI_ERROR_NOT_MONITOR_OWNER:
 206         return ("JVMTI_ERROR_NOT_MONITOR_OWNER");
 207     case JVMTI_ERROR_INTERRUPT:
 208         return ("JVMTI_ERROR_INTERRUPT");
 209     case JVMTI_ERROR_INVALID_CLASS_FORMAT:
 210         return ("JVMTI_ERROR_INVALID_CLASS_FORMAT");
 211     case JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION:
 212         return ("JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION");
 213     case JVMTI_ERROR_FAILS_VERIFICATION:
 214         return ("JVMTI_ERROR_FAILS_VERIFICATION");
 215     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED:
 216         return ("JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED");
 217     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED:
 218         return ("JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED");
 219     case JVMTI_ERROR_INVALID_TYPESTATE:
 220         return ("JVMTI_ERROR_INVALID_TYPESTATE");
 221     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED:
 222         return ("JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED");
 223     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED:
 224         return ("JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED");
 225     case JVMTI_ERROR_UNSUPPORTED_VERSION:
 226         return ("JVMTI_ERROR_UNSUPPORTED_VERSION");
 227     case JVMTI_ERROR_NAMES_DONT_MATCH:
 228         return ("JVMTI_ERROR_NAMES_DONT_MATCH");
 229     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED:
 230         return ("JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED");
 231     case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED:
 232         return ("JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED");
 233     case JVMTI_ERROR_UNMODIFIABLE_CLASS:
 234         return ("JVMTI_ERROR_UNMODIFIABLE_CLASS");
 235     case JVMTI_ERROR_NOT_AVAILABLE:
 236         return ("JVMTI_ERROR_NOT_AVAILABLE");
 237     case JVMTI_ERROR_MUST_POSSESS_CAPABILITY:
 238         return ("JVMTI_ERROR_MUST_POSSESS_CAPABILITY");
 239     case JVMTI_ERROR_NULL_POINTER:
 240         return ("JVMTI_ERROR_NULL_POINTER");
 241     case JVMTI_ERROR_ABSENT_INFORMATION:
 242         return ("JVMTI_ERROR_ABSENT_INFORMATION");
 243     case JVMTI_ERROR_INVALID_EVENT_TYPE:
 244         return ("JVMTI_ERROR_INVALID_EVENT_TYPE");
 245     case JVMTI_ERROR_ILLEGAL_ARGUMENT:
 246         return ("JVMTI_ERROR_ILLEGAL_ARGUMENT");
 247     case JVMTI_ERROR_NATIVE_METHOD:
 248         return ("JVMTI_ERROR_NATIVE_METHOD");
 249     case JVMTI_ERROR_OUT_OF_MEMORY:
 250         return ("JVMTI_ERROR_OUT_OF_MEMORY");
 251     case JVMTI_ERROR_ACCESS_DENIED:
 252         return ("JVMTI_ERROR_ACCESS_DENIED");
 253     case JVMTI_ERROR_WRONG_PHASE:
 254         return ("JVMTI_ERROR_WRONG_PHASE");
 255     case JVMTI_ERROR_INTERNAL:
 256         return ("JVMTI_ERROR_INTERNAL");
 257     case JVMTI_ERROR_UNATTACHED_THREAD:
 258         return ("JVMTI_ERROR_UNATTACHED_THREAD");
 259     case JVMTI_ERROR_INVALID_ENVIRONMENT:
 260         return ("JVMTI_ERROR_INVALID_ENVIRONMENT");
 261     default:
 262         return ("<unknown error>");
 263     }
 264 }
 265 
 266 const char* TranslatePhase(jvmtiPhase phase) {
 267     switch (phase) {
 268     case JVMTI_PHASE_ONLOAD:
 269         return ("JVMTI_PHASE_ONLOAD");
 270     case JVMTI_PHASE_PRIMORDIAL:
 271         return ("JVMTI_PHASE_PRIMORDIAL");
 272     case JVMTI_PHASE_START:
 273         return ("JVMTI_PHASE_START");
 274     case JVMTI_PHASE_LIVE:
 275         return ("JVMTI_PHASE_LIVE");
 276     case JVMTI_PHASE_DEAD:
 277         return ("JVMTI_PHASE_DEAD");
 278     default:
 279         return ("<unknown phase>");
 280     }
 281 }
 282 
 283 const char* TranslateRootKind(jvmtiHeapRootKind root) {
 284     switch (root) {
 285     case JVMTI_HEAP_ROOT_JNI_GLOBAL:
 286         return ("JVMTI_HEAP_ROOT_JNI_GLOBAL");
 287     case JVMTI_HEAP_ROOT_JNI_LOCAL:
 288         return ("JVMTI_HEAP_ROOT_JNI_LOCAL");
 289     case JVMTI_HEAP_ROOT_SYSTEM_CLASS:
 290         return ("JVMTI_HEAP_ROOT_SYSTEM_CLASS");
 291     case JVMTI_HEAP_ROOT_MONITOR:
 292         return ("JVMTI_HEAP_ROOT_MONITOR");
 293     case JVMTI_HEAP_ROOT_STACK_LOCAL:
 294         return ("JVMTI_HEAP_ROOT_STACK_LOCAL");
 295     case JVMTI_HEAP_ROOT_THREAD:
 296         return ("JVMTI_HEAP_ROOT_THREAD");
 297     case JVMTI_HEAP_ROOT_OTHER:
 298         return ("JVMTI_HEAP_ROOT_OTHER");
 299     default:
 300         return ("<unknown root kind>");
 301     }
 302 }
 303 
 304 const char* TranslateObjectRefKind(jvmtiObjectReferenceKind ref) {
 305     switch (ref) {
 306     case JVMTI_REFERENCE_CLASS:
 307         return ("JVMTI_REFERENCE_CLASS");
 308     case JVMTI_REFERENCE_FIELD:
 309         return ("JVMTI_REFERENCE_FIELD");
 310     case JVMTI_REFERENCE_ARRAY_ELEMENT:
 311         return ("JVMTI_REFERENCE_ARRAY_ELEMENT");
 312     case JVMTI_REFERENCE_CLASS_LOADER:
 313         return ("JVMTI_REFERENCE_CLASS_LOADER");
 314     case JVMTI_REFERENCE_SIGNERS:
 315         return ("JVMTI_REFERENCE_SIGNERS");
 316     case JVMTI_REFERENCE_PROTECTION_DOMAIN:
 317         return ("JVMTI_REFERENCE_PROTECTION_DOMAIN");
 318     case JVMTI_REFERENCE_INTERFACE:
 319         return ("JVMTI_REFERENCE_INTERFACE");
 320     case JVMTI_REFERENCE_STATIC_FIELD:
 321         return ("JVMTI_REFERENCE_STATIC_FIELD");
 322     case JVMTI_REFERENCE_CONSTANT_POOL:
 323         return ("JVMTI_REFERENCE_CONSTANT_POOL");
 324     default:
 325         return ("<unknown reference kind>");
 326     }
 327 }
 328 
 329 #ifdef __cplusplus
 330 }
 331 #endif