jvmtiEnv.cpp revision 1926
1472N/A * or visit www.oracle.com if you need additional information or have any
1879N/A#include "precompiled.hpp"
1879N/A#include "classfile/systemDictionary.hpp"
1879N/A#include "classfile/vmSymbols.hpp"
1879N/A#include "interpreter/bytecodeStream.hpp"
1879N/A#include "interpreter/interpreter.hpp"
1879N/A#include "jvmtifiles/jvmtiEnv.hpp"
1879N/A#include "memory/resourceArea.hpp"
1879N/A#include "memory/universe.inline.hpp"
1879N/A#include "oops/cpCacheOop.hpp"
1879N/A#include "oops/instanceKlass.hpp"
1879N/A#include "prims/jniCheck.hpp"
1879N/A#include "prims/jvm_misc.hpp"
1879N/A#include "prims/jvmtiAgentThread.hpp"
1879N/A#include "prims/jvmtiClassFileReconstituter.hpp"
1879N/A#include "prims/jvmtiCodeBlobEvents.hpp"
1879N/A#include "prims/jvmtiExtensions.hpp"
1879N/A#include "prims/jvmtiGetLoadedClasses.hpp"
1879N/A#include "prims/jvmtiImpl.hpp"
1879N/A#include "prims/jvmtiManageCapabilities.hpp"
1879N/A#include "prims/jvmtiRawMonitor.hpp"
1879N/A#include "prims/jvmtiRedefineClasses.hpp"
1879N/A#include "prims/jvmtiTagMap.hpp"
1879N/A#include "prims/jvmtiThreadState.inline.hpp"
1879N/A#include "prims/jvmtiUtil.hpp"
1879N/A#include "runtime/arguments.hpp"
1879N/A#include "runtime/deoptimization.hpp"
1879N/A#include "runtime/interfaceSupport.hpp"
1879N/A#include "runtime/javaCalls.hpp"
1879N/A#include "runtime/jfieldIDWorkaround.hpp"
1879N/A#include "runtime/osThread.hpp"
1879N/A#include "runtime/reflectionUtils.hpp"
1879N/A#include "runtime/signature.hpp"
1879N/A#include "runtime/vframe.hpp"
1879N/A#include "runtime/vmThread.hpp"
1879N/A#include "services/threadService.hpp"
1879N/A#include "utilities/exceptions.hpp"
1879N/A#include "utilities/preserveException.hpp"
1879N/A# include "thread_linux.inline.hpp"
1879N/A# include "thread_solaris.inline.hpp"
1879N/A# include "thread_windows.inline.hpp"
0N/A#define TraceJVMTICalls false
0N/A return JVMTI_ERROR_NONE;
609N/A return JVMTI_ERROR_THREAD_NOT_ALIVE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_INVALID_THREAD;
0N/A return JVMTI_ERROR_INVALID_THREAD;
0N/A return JVMTI_ERROR_THREAD_NOT_ALIVE;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetClassLoaderClasses(jobject initiating_loader, jint* class_count_ptr, jclass** classes_ptr) {
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_INVALID_CLASS;
0N/A return JVMTI_ERROR_INVALID_CLASS;
0N/A return JVMTI_ERROR_UNMODIFIABLE_CLASS;
0N/A return JVMTI_ERROR_INVALID_CLASS;
0N/A return JVMTI_ERROR_UNMODIFIABLE_CLASS;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::SetEventNotificationMode(jvmtiEventMode mode, jvmtiEvent event_type, jthread event_thread, ...) {
0N/A return JVMTI_ERROR_INVALID_THREAD;
0N/A return JVMTI_ERROR_INVALID_THREAD;
0N/A return JVMTI_ERROR_THREAD_NOT_ALIVE;
0N/A return JVMTI_ERROR_INVALID_EVENT_TYPE;
0N/A return JVMTI_ERROR_ILLEGAL_ARGUMENT;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A get_capabilities());
0N/A JvmtiManageCapabilities::relinquish_capabilities(get_capabilities(), capabilities_ptr, get_capabilities());
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
1121N/A } else if (use_version_1_0_semantics()) {
1121N/A return JVMTI_ERROR_WRONG_PHASE;
0N/A return JVMTI_ERROR_ILLEGAL_ARGUMENT;
0N/A if (TraceClassLoading) {
0N/A return JVMTI_ERROR_NONE;
1120N/A return JVMTI_ERROR_WRONG_PHASE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_ILLEGAL_ARGUMENT;
0N/A if (HAS_PENDING_EXCEPTION) {
0N/A return JVMTI_ERROR_INTERNAL;
0N/A if (HAS_PENDING_EXCEPTION) {
0N/A return JVMTI_ERROR_INTERNAL;
0N/A return JVMTI_ERROR_NONE;
1120N/A return JVMTI_ERROR_WRONG_PHASE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_ILLEGAL_ARGUMENT;
0N/A return JVMTI_ERROR_ILLEGAL_ARGUMENT;
0N/A case JVMTI_VERBOSE_OTHER:
0N/A case JVMTI_VERBOSE_CLASS:
0N/A case JVMTI_VERBOSE_GC:
0N/A case JVMTI_VERBOSE_JNI:
0N/A return JVMTI_ERROR_ILLEGAL_ARGUMENT;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A#ifndef JVMTI_KERNEL
0N/A return JVMTI_ERROR_INVALID_THREAD;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return (JVMTI_ERROR_NONE);
0N/A return (JVMTI_ERROR_THREAD_SUSPENDED);
0N/A return (JVMTI_ERROR_THREAD_NOT_ALIVE);
0N/A return (JVMTI_ERROR_THREAD_NOT_ALIVE);
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::SuspendThreadList(jint request_count, const jthread* request_list, jvmtiError* results) {
0N/A for (int i = 0; i < request_count; i++) {
0N/A if (needSafepoint > 0) {
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
0N/A return JVMTI_ERROR_INTERNAL;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::ResumeThreadList(jint request_count, const jthread* request_list, jvmtiError* results) {
0N/A for (int i = 0; i < request_count; i++) {
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_INVALID_THREAD;
0N/A JavaThread* java_thread = java_lang_Thread::thread(JNIHandles::resolve_external_guard(thread));
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_INVALID_THREAD;
0N/A return JVMTI_ERROR_OUT_OF_MEMORY;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetOwnedMonitorInfo(JavaThread* java_thread, jint* owned_monitor_count_ptr, jobject** owned_monitors_ptr) {
0N/A for (int i = 0; i < owned_monitor_count; i++) {
0N/A (*owned_monitors_ptr)[i] =
0N/A for (int i = 0; i < owned_monitor_count; i++) {
0N/A delete owned_monitors_list;
0N/AJvmtiEnv::GetOwnedMonitorStackDepthInfo(JavaThread* java_thread, jint* monitor_info_count_ptr, jvmtiMonitorStackDepthInfo** monitor_info_ptr) {
0N/A for (int i = 0; i < owned_monitor_count; i++) {
0N/A for (int i = 0; i < owned_monitor_count; i++) {
0N/A delete owned_monitors_list;
0N/AJvmtiEnv::RunAgentThread(jthread thread, jvmtiStartFunction proc, const void* arg, jint priority) {
0N/A return JVMTI_ERROR_INVALID_THREAD;
0N/A return JVMTI_ERROR_INVALID_PRIORITY;
0N/A return JVMTI_ERROR_OUT_OF_MEMORY;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetThreadGroupChildren(jthreadGroup group, jint* thread_count_ptr, jthread** threads_ptr, jint* group_count_ptr, jthreadGroup** groups_ptr) {
0N/A int hidden_threads = 0;
0N/A return JVMTI_ERROR_OUT_OF_MEMORY;
0N/A return JVMTI_ERROR_OUT_OF_MEMORY;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetStackTrace(JavaThread* java_thread, jint start_depth, jint max_frame_count, jvmtiFrameInfo* frame_buffer, jint* count_ptr) {
0N/AJvmtiEnv::GetAllStackTraces(jint max_frame_count, jvmtiStackInfo** stack_info_ptr, jint* thread_count_ptr) {
0N/AJvmtiEnv::GetThreadListStackTraces(jint thread_count, const jthread* thread_list, jint max_frame_count, jvmtiStackInfo** stack_info_ptr) {
609N/A return JVMTI_ERROR_THREAD_NOT_ALIVE;
609N/A return JVMTI_ERROR_THREAD_NOT_ALIVE;
0N/A if (!is_thread_fully_suspended(java_thread, true /* wait for suspend completion */, &debug_bits)) {
0N/A return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
0N/A return JVMTI_ERROR_INTERNAL;
0N/A return JVMTI_ERROR_OPAQUE_FRAME;
0N/A int frame_count = 0;
0N/A return JVMTI_ERROR_NO_MORE_FRAMES;
0N/A return JVMTI_ERROR_OPAQUE_FRAME;
0N/A if (!is_interpreted[i]) {
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetFrameLocation(JavaThread* java_thread, jint depth, jmethodID* method_ptr, jlocation* location_ptr) {
609N/A return JVMTI_ERROR_THREAD_NOT_ALIVE;
0N/A return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
0N/A if (TraceJVMTICalls) {
0N/A return JVMTI_ERROR_NO_MORE_FRAMES;
0N/A return JVMTI_ERROR_OPAQUE_FRAME;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::FollowReferences(jint heap_filter, jclass klass, jobject initial_object, const jvmtiHeapCallbacks* callbacks, const void* user_data) {
0N/A return JVMTI_ERROR_INVALID_CLASS;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_INVALID_CLASS;
0N/A JvmtiTagMap::tag_map_for(this)->follow_references(heap_filter, kh, initial_object, callbacks, user_data);
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::IterateThroughHeap(jint heap_filter, jclass klass, const jvmtiHeapCallbacks* callbacks, const void* user_data) {
0N/A return JVMTI_ERROR_INVALID_CLASS;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_INVALID_CLASS;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetObjectsWithTags(jint tag_count, const jlong* tags, jint* count_ptr, jobject** object_result_ptr, jlong** tag_result_ptr) {
0N/A return JvmtiTagMap::tag_map_for(this)->get_objects_with_tags((jlong*)tags, tag_count, count_ptr, object_result_ptr, tag_result_ptr);
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::IterateOverObjectsReachableFromObject(jobject object, jvmtiObjectReferenceCallback object_reference_callback, const void* user_data) {
0N/A JvmtiTagMap::tag_map_for(this)->iterate_over_objects_reachable_from_object(object, object_reference_callback, user_data);
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::IterateOverReachableObjects(jvmtiHeapRootCallback heap_root_callback, jvmtiStackReferenceCallback stack_ref_callback, jvmtiObjectReferenceCallback object_ref_callback, const void* user_data) {
0N/A JvmtiTagMap::tag_map_for(this)->iterate_over_reachable_objects(heap_root_callback, stack_ref_callback, object_ref_callback, user_data);
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::IterateOverHeap(jvmtiHeapObjectFilter object_filter, jvmtiHeapObjectCallback heap_object_callback, const void* user_data) {
0N/A JvmtiTagMap::tag_map_for(this)->iterate_over_heap(object_filter, KlassHandle(), heap_object_callback, user_data);
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::IterateOverInstancesOfClass(oop k_mirror, jvmtiHeapObjectFilter object_filter, jvmtiHeapObjectCallback heap_object_callback, const void* user_data) {
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_INVALID_CLASS;
0N/A JvmtiTagMap::tag_map_for(this)->iterate_over_heap(object_filter, klass, heap_object_callback, user_data);
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
1926N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_INVALID_LOCATION;
0N/A return JVMTI_ERROR_INVALID_LOCATION;
0N/A return JVMTI_ERROR_DUPLICATE;
0N/A if (TraceJVMTICalls) {
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_INVALID_LOCATION;
0N/A return JVMTI_ERROR_INVALID_LOCATION;
0N/A return JVMTI_ERROR_NOT_FOUND;
0N/A if (TraceJVMTICalls) {
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A if (!isPrimitive) {
0N/A if (isPrimitive) {
0N/A char* gen_result;
0N/A (unsigned char **)&gen_result);
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_ABSENT_INFORMATION;
0N/A return JVMTI_ERROR_ABSENT_INFORMATION;
0N/A return JVMTI_ERROR_NONE;
0N/A assert((Klass::cast(k)->oop_is_instance() || Klass::cast(k)->oop_is_array()), "should be an instance or an array klass");
0N/A if (HAS_PENDING_EXCEPTION) {
0N/A return JVMTI_ERROR_INTERNAL;
0N/A return JVMTI_ERROR_NONE;
0N/A *method_count_ptr = 0;
0N/A return JVMTI_ERROR_NONE;
0N/A if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
0N/A return JVMTI_ERROR_CLASS_NOT_PREPARED;
0N/A *method_count_ptr = 0;
0N/A return JVMTI_ERROR_NONE;
0N/A assert(original_index >= 0 && original_index < result_length, "invalid original method index");
0N/A return JVMTI_ERROR_NONE;
0N/A *field_count_ptr = 0;
0N/A return JVMTI_ERROR_NONE;
0N/A if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
0N/A return JVMTI_ERROR_CLASS_NOT_PREPARED;
0N/A *field_count_ptr = 0;
0N/A return JVMTI_ERROR_NONE;
0N/A int result_count = 0;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetImplementedInterfaces(oop k_mirror, jint* interface_count_ptr, jclass** interfaces_ptr) {
0N/A *interface_count_ptr = 0;
0N/A return JVMTI_ERROR_NONE;
0N/A if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) ))
0N/A return JVMTI_ERROR_CLASS_NOT_PREPARED;
0N/A *interface_count_ptr = 0;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetClassVersionNumbers(oop k_mirror, jint* minor_version_ptr, jint* major_version_ptr) {
0N/A return JVMTI_ERROR_ABSENT_INFORMATION;
0N/A return JVMTI_ERROR_INVALID_CLASS;
0N/A return JVMTI_ERROR_ABSENT_INFORMATION;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetConstantPool(oop k_mirror, jint* constant_pool_count_ptr, jint* constant_pool_byte_count_ptr, unsigned char** constant_pool_bytes_ptr) {
0N/A return JVMTI_ERROR_ABSENT_INFORMATION;
0N/A return JVMTI_ERROR_INVALID_CLASS;
0N/A return JVMTI_ERROR_ABSENT_INFORMATION;
0N/A unsigned char *cpool_bytes;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_ABSENT_INFORMATION;
0N/A return JVMTI_ERROR_ABSENT_INFORMATION;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetFieldName(fieldDescriptor* fdesc_ptr, char** name_ptr, char** signature_ptr, char** generic_ptr) {
0N/A return JVMTI_ERROR_OUT_OF_MEMORY;
0N/A return JVMTI_ERROR_OUT_OF_MEMORY;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetMethodName(methodOop method_oop, char** name_ptr, char** signature_ptr, char** generic_ptr) {
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetLineNumberTable(methodOop method_oop, jint* entry_count_ptr, jvmtiLineNumberEntry** table_ptr) {
0N/A return (JVMTI_ERROR_ABSENT_INFORMATION);
0N/A num_entries++;
0N/A if (num_entries > 0) {
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetMethodLocation(methodOop method_oop, jlocation* start_location_ptr, jlocation* end_location_ptr) {
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetLocalVariableTable(methodOop method_oop, jint* entry_count_ptr, jvmtiLocalVariableEntry** table_ptr) {
0N/A return (JVMTI_ERROR_ABSENT_INFORMATION);
0N/A if (num_entries > 0) {
0N/A for (int i = 0; i < num_entries; i++) {
0N/A if (generic_signature_index > 0) {
0N/A const char *utf8_gen_sign = (const char *)
0N/A return JVMTI_ERROR_NONE;
0N/AJvmtiEnv::GetBytecodes(methodOop method_oop, jint* bytecode_count_ptr, unsigned char** bytecodes_ptr) {
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
1121N/A if (use_version_1_0_semantics() &&
0N/A *is_obsolete_ptr = true;
0N/A *is_obsolete_ptr = false;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_INTERNAL;
0N/A return JVMTI_ERROR_NOT_MONITOR_OWNER;
0N/A return JVMTI_ERROR_NONE;
0N/A // in thread.cpp.
0N/A#ifdef PROPER_TRANSITIONS
0N/A return JVMTI_ERROR_INTERNAL;
0N/A return JVMTI_ERROR_NONE;
0N/A#ifdef PROPER_TRANSITIONS
0N/A#ifdef PROPER_TRANSITIONS
0N/A return JVMTI_ERROR_INTERRUPT;
0N/A return JVMTI_ERROR_NOT_MONITOR_OWNER;
0N/A return JVMTI_ERROR_INTERNAL;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NOT_MONITOR_OWNER;
0N/A return JVMTI_ERROR_INTERNAL;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NOT_MONITOR_OWNER;
0N/A return JVMTI_ERROR_INTERNAL;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_OUT_OF_MEMORY;
0N/A memcpy(*function_table,(JavaThread::current())->get_jni_functions(),sizeof(jniNativeInterface));
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_ILLEGAL_ARGUMENT;
0N/AJvmtiEnv::GetExtensionFunctions(jint* extension_count_ptr, jvmtiExtensionFunctionInfo** extensions) {
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A return JVMTI_ERROR_NONE;
0N/A for (SystemProperty* p = Arguments::system_properties(); p != NULL && i < *count_ptr; p = p->next(), i++) {