diff options
| -rw-r--r-- | runtime/openjdkjvmti/Android.bp | 1 | ||||
| -rw-r--r-- | runtime/openjdkjvmti/OpenjdkJvmTi.cc | 3 | ||||
| -rw-r--r-- | runtime/openjdkjvmti/ti_dump.cc | 74 | ||||
| -rw-r--r-- | runtime/openjdkjvmti/ti_dump.h | 50 | ||||
| -rwxr-xr-x | test/933-misc-events/build | 17 | ||||
| -rw-r--r-- | test/933-misc-events/expected.txt | 2 | ||||
| -rw-r--r-- | test/933-misc-events/info.txt | 1 | ||||
| -rw-r--r-- | test/933-misc-events/misc_events.cc | 72 | ||||
| -rwxr-xr-x | test/933-misc-events/run | 23 | ||||
| -rw-r--r-- | test/933-misc-events/src/Main.java | 25 | ||||
| -rw-r--r-- | test/Android.bp | 1 |
11 files changed, 269 insertions, 0 deletions
diff --git a/runtime/openjdkjvmti/Android.bp b/runtime/openjdkjvmti/Android.bp index a731c17d9e..976a1e7902 100644 --- a/runtime/openjdkjvmti/Android.bp +++ b/runtime/openjdkjvmti/Android.bp @@ -22,6 +22,7 @@ cc_defaults { "OpenjdkJvmTi.cc", "ti_class.cc", "ti_class_definition.cc", + "ti_dump.cc", "ti_field.cc", "ti_heap.cc", "ti_jni.cc", diff --git a/runtime/openjdkjvmti/OpenjdkJvmTi.cc b/runtime/openjdkjvmti/OpenjdkJvmTi.cc index 33550d1365..417d1041a8 100644 --- a/runtime/openjdkjvmti/OpenjdkJvmTi.cc +++ b/runtime/openjdkjvmti/OpenjdkJvmTi.cc @@ -49,6 +49,7 @@ #include "thread-inl.h" #include "thread_list.h" #include "ti_class.h" +#include "ti_dump.h" #include "ti_field.h" #include "ti_heap.h" #include "ti_jni.h" @@ -1311,6 +1312,7 @@ extern "C" bool ArtPlugin_Initialize() { PhaseUtil::Register(&gEventHandler); ThreadUtil::Register(&gEventHandler); ClassUtil::Register(&gEventHandler); + DumpUtil::Register(&gEventHandler); runtime->GetJavaVM()->AddEnvironmentHook(GetEnvHandler); runtime->AddSystemWeakHolder(&gObjectTagTable); @@ -1322,6 +1324,7 @@ extern "C" bool ArtPlugin_Deinitialize() { PhaseUtil::Unregister(); ThreadUtil::Unregister(); ClassUtil::Unregister(); + DumpUtil::Unregister(); return true; } diff --git a/runtime/openjdkjvmti/ti_dump.cc b/runtime/openjdkjvmti/ti_dump.cc new file mode 100644 index 0000000000..2ee5c409f6 --- /dev/null +++ b/runtime/openjdkjvmti/ti_dump.cc @@ -0,0 +1,74 @@ +/* Copyright (C) 2017 The Android Open Source Project + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This file implements interfaces from the file jvmti.h. This implementation + * is licensed under the same terms as the file jvmti.h. The + * copyright and license information for the file jvmti.h follows. + * + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include "ti_dump.h" + +#include <limits> + + +#include "art_jvmti.h" +#include "base/mutex.h" +#include "events-inl.h" +#include "runtime_callbacks.h" +#include "scoped_thread_state_change-inl.h" +#include "thread-inl.h" +#include "thread_list.h" + +namespace openjdkjvmti { + +struct DumpCallback : public art::RuntimeSigQuitCallback { + void SigQuit() OVERRIDE REQUIRES_SHARED(art::Locks::mutator_lock_) { + art::Thread* thread = art::Thread::Current(); + art::ScopedThreadSuspension sts(thread, art::ThreadState::kNative); + event_handler->DispatchEvent(nullptr, ArtJvmtiEvent::kDataDumpRequest); + } + + EventHandler* event_handler = nullptr; +}; + +static DumpCallback gDumpCallback; + +void DumpUtil::Register(EventHandler* handler) { + gDumpCallback.event_handler = handler; + art::ScopedThreadStateChange stsc(art::Thread::Current(), + art::ThreadState::kWaitingForDebuggerToAttach); + art::ScopedSuspendAll ssa("Add sigquit callback"); + art::Runtime::Current()->GetRuntimeCallbacks()->AddRuntimeSigQuitCallback(&gDumpCallback); +} + +void DumpUtil::Unregister() { + art::ScopedThreadStateChange stsc(art::Thread::Current(), + art::ThreadState::kWaitingForDebuggerToAttach); + art::ScopedSuspendAll ssa("Remove sigquit callback"); + art::Runtime::Current()->GetRuntimeCallbacks()->RemoveRuntimeSigQuitCallback(&gDumpCallback); +} + +} // namespace openjdkjvmti diff --git a/runtime/openjdkjvmti/ti_dump.h b/runtime/openjdkjvmti/ti_dump.h new file mode 100644 index 0000000000..67cb2394f8 --- /dev/null +++ b/runtime/openjdkjvmti/ti_dump.h @@ -0,0 +1,50 @@ +/* Copyright (C) 2017 The Android Open Source Project + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This file implements interfaces from the file jvmti.h. This implementation + * is licensed under the same terms as the file jvmti.h. The + * copyright and license information for the file jvmti.h follows. + * + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#ifndef ART_RUNTIME_OPENJDKJVMTI_TI_DUMP_H_ +#define ART_RUNTIME_OPENJDKJVMTI_TI_DUMP_H_ + +#include "jni.h" +#include "jvmti.h" + +namespace openjdkjvmti { + +class EventHandler; + +class DumpUtil { + public: + static void Register(EventHandler* event_handler); + static void Unregister(); +}; + +} // namespace openjdkjvmti + +#endif // ART_RUNTIME_OPENJDKJVMTI_TI_DUMP_H_ diff --git a/test/933-misc-events/build b/test/933-misc-events/build new file mode 100755 index 0000000000..898e2e54a2 --- /dev/null +++ b/test/933-misc-events/build @@ -0,0 +1,17 @@ +#!/bin/bash +# +# Copyright 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +./default-build "$@" --experimental agents diff --git a/test/933-misc-events/expected.txt b/test/933-misc-events/expected.txt new file mode 100644 index 0000000000..024c560b26 --- /dev/null +++ b/test/933-misc-events/expected.txt @@ -0,0 +1,2 @@ +Received dump request. +Done diff --git a/test/933-misc-events/info.txt b/test/933-misc-events/info.txt new file mode 100644 index 0000000000..875a5f6ec1 --- /dev/null +++ b/test/933-misc-events/info.txt @@ -0,0 +1 @@ +Tests basic functions in the jvmti plugin. diff --git a/test/933-misc-events/misc_events.cc b/test/933-misc-events/misc_events.cc new file mode 100644 index 0000000000..860d4b5e16 --- /dev/null +++ b/test/933-misc-events/misc_events.cc @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <atomic> +#include <signal.h> +#include <sys/types.h> + +#include "base/logging.h" +#include "base/macros.h" +#include "jni.h" +#include "openjdkjvmti/jvmti.h" + +#include "ti-agent/common_helper.h" +#include "ti-agent/common_load.h" + +namespace art { +namespace Test933MiscEvents { + +static std::atomic<bool> saw_dump_request(false); + +static void DumpRequestCallback(jvmtiEnv* jenv ATTRIBUTE_UNUSED) { + printf("Received dump request.\n"); + saw_dump_request.store(true, std::memory_order::memory_order_relaxed); +} + +extern "C" JNIEXPORT void JNICALL Java_Main_testSigQuit( + JNIEnv* env, jclass Main_klass ATTRIBUTE_UNUSED) { + jvmtiEventCallbacks callbacks; + memset(&callbacks, 0, sizeof(jvmtiEventCallbacks)); + callbacks.DataDumpRequest = DumpRequestCallback; + jvmtiError ret = jvmti_env->SetEventCallbacks(&callbacks, sizeof(callbacks)); + if (JvmtiErrorToException(env, ret)) { + return; + } + + ret = jvmti_env->SetEventNotificationMode(JVMTI_ENABLE, + JVMTI_EVENT_DATA_DUMP_REQUEST, + nullptr); + if (JvmtiErrorToException(env, ret)) { + return; + } + + // Send sigquit to self. + kill(getpid(), SIGQUIT); + + // Busy-wait for request. + for (;;) { + sleep(1); + if (saw_dump_request.load(std::memory_order::memory_order_relaxed)) { + break; + } + } + + ret = jvmti_env->SetEventNotificationMode(JVMTI_DISABLE, JVMTI_EVENT_DATA_DUMP_REQUEST, nullptr); + JvmtiErrorToException(env, ret); +} + +} // namespace Test933MiscEvents +} // namespace art diff --git a/test/933-misc-events/run b/test/933-misc-events/run new file mode 100755 index 0000000000..0a8d0672f6 --- /dev/null +++ b/test/933-misc-events/run @@ -0,0 +1,23 @@ +#!/bin/bash +# +# Copyright 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This test checks whether dex files can be injected into parent classloaders. App images preload +# classes, which will make the injection moot. Turn off app images to avoid the issue. + +./default-run "$@" --experimental agents \ + --experimental runtime-plugins \ + --jvmti \ + --no-app-image diff --git a/test/933-misc-events/src/Main.java b/test/933-misc-events/src/Main.java new file mode 100644 index 0000000000..89801a3555 --- /dev/null +++ b/test/933-misc-events/src/Main.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public class Main { + public static void main(String[] args) throws Exception { + testSigQuit(); + + System.out.println("Done"); + } + + private static native void testSigQuit(); +} diff --git a/test/Android.bp b/test/Android.bp index be5bc59e5c..9f435dc4fd 100644 --- a/test/Android.bp +++ b/test/Android.bp @@ -270,6 +270,7 @@ art_cc_defaults { "928-jni-table/jni_table.cc", "929-search/search.cc", "931-agent-thread/agent_thread.cc", + "933-misc-events/misc_events.cc", ], shared_libs: [ "libbase", |