1c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light/* 2c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * Copyright (C) 2013 The Android Open Source Project 3c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * 4c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * Licensed under the Apache License, Version 2.0 (the "License"); 5c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * you may not use this file except in compliance with the License. 6c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * You may obtain a copy of the License at 7c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * 8c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * http://www.apache.org/licenses/LICENSE-2.0 9c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * 10c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * Unless required by applicable law or agreed to in writing, software 11c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * distributed under the License is distributed on an "AS IS" BASIS, 12c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * See the License for the specific language governing permissions and 14c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light * limitations under the License. 15c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light */ 16c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light 17c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include <inttypes.h> 188cf9cb386cd9286d67e879f1ee501ec00d72a4e1Andreas Gampe 198cf9cb386cd9286d67e879f1ee501ec00d72a4e1Andreas Gampe#include <cstdio> 20c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include <memory> 21c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light 22c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include "android-base/logging.h" 23c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include "android-base/stringprintf.h" 24c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light 25c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include "jni.h" 26c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include "jvmti.h" 27c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include "scoped_local_ref.h" 28c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light 29c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light// Test infrastructure 30c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include "jni_binder.h" 31c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include "jni_helper.h" 32c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include "jvmti_helper.h" 33c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include "test_env.h" 34c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light#include "ti_macros.h" 35c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light 36c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Lightnamespace art { 37c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Lightnamespace Test996ObsoleteBreakpoints { 38c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light 39c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Lightstatic constexpr jint kNumFrames = 10; 40c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light 41c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Lightstatic jmethodID GetFirstObsoleteMethod(JNIEnv* env, jvmtiEnv* jvmti_env) { 42c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light jint frame_count; 43c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light jvmtiFrameInfo frames[kNumFrames]; 44c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light if (JvmtiErrorToException(env, jvmti_env, 45c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light jvmti_env->GetStackTrace(nullptr, // current thread 46c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light 0, 47c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light kNumFrames, 48c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light frames, 49c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light &frame_count))) { 50c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light return nullptr; 51c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light } 52c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light for (jint i = 0; i < frame_count; i++) { 53c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light jboolean is_obsolete = false; 54c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light if (JvmtiErrorToException(env, jvmti_env, 55c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light jvmti_env->IsMethodObsolete(frames[i].method, &is_obsolete))) { 56c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light return nullptr; 57c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light } 58c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light if (is_obsolete) { 59c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light return frames[i].method; 60c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light } 61c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light } 62c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light ScopedLocalRef<jclass> rt_exception(env, env->FindClass("java/lang/RuntimeException")); 63c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light env->ThrowNew(rt_exception.get(), "Unable to find obsolete method!"); 64c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light return nullptr; 65c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light} 66c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light 67c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Lightextern "C" JNIEXPORT void JNICALL Java_art_Test996_setBreakpointOnObsoleteMethod( 68c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light JNIEnv* env, jclass k ATTRIBUTE_UNUSED, jlong loc) { 69c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light jmethodID method = GetFirstObsoleteMethod(env, jvmti_env); 70c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light if (method == nullptr) { 71c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light return; 72c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light } 73c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light JvmtiErrorToException(env, jvmti_env, jvmti_env->SetBreakpoint(method, loc)); 74c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light} 75c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light 76c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light} // namespace Test996ObsoleteBreakpoints 77c38c3699b8d91c837c0e590a618aeb4860eed5ccAlex Light} // namespace art 78