diff options
author | 2017-01-13 17:54:46 -0800 | |
---|---|---|
committer | 2017-01-13 18:08:37 -0800 | |
commit | f37e302af47b620c80097dc4087a9912ad41b563 (patch) | |
tree | 547fea4dd407bf058b7a588a310921cbf6e2d2e3 | |
parent | 4cddd03950bb21e950afd72cad87e963bc53ea10 (diff) |
ART: Add SetVerboseFlags
Add support for SetVerboseFlags. Add test.
Bug: 31455788
Test: m test-art-host-run-test-901-hello-ti-agent
Change-Id: Iff8ae558c6003d3844b45bb4d7c8ec90998ab810
-rw-r--r-- | runtime/openjdkjvmti/OpenjdkJvmTi.cc | 54 | ||||
-rw-r--r-- | test/901-hello-ti-agent/basics.cc | 16 | ||||
-rw-r--r-- | test/901-hello-ti-agent/expected.txt | 6 | ||||
-rw-r--r-- | test/901-hello-ti-agent/src/Main.java | 20 |
4 files changed, 95 insertions, 1 deletions
diff --git a/runtime/openjdkjvmti/OpenjdkJvmTi.cc b/runtime/openjdkjvmti/OpenjdkJvmTi.cc index 7b24ec4969..8b78959372 100644 --- a/runtime/openjdkjvmti/OpenjdkJvmTi.cc +++ b/runtime/openjdkjvmti/OpenjdkJvmTi.cc @@ -30,6 +30,7 @@ */ #include <string> +#include <type_traits> #include <vector> #include <jni.h> @@ -37,6 +38,7 @@ #include "openjdkjvmti/jvmti.h" #include "art_jvmti.h" +#include "base/logging.h" #include "base/mutex.h" #include "events-inl.h" #include "jni_env_ext-inl.h" @@ -1174,7 +1176,57 @@ class JvmtiFunctions { } static jvmtiError SetVerboseFlag(jvmtiEnv* env, jvmtiVerboseFlag flag, jboolean value) { - return ERR(NOT_IMPLEMENTED); + if (flag == jvmtiVerboseFlag::JVMTI_VERBOSE_OTHER) { + // OTHER is special, as it's 0, so can't do a bit check. + bool val = (value == JNI_TRUE) ? true : false; + + art::gLogVerbosity.collector = val; + art::gLogVerbosity.compiler = val; + art::gLogVerbosity.deopt = val; + art::gLogVerbosity.heap = val; + art::gLogVerbosity.jdwp = val; + art::gLogVerbosity.jit = val; + art::gLogVerbosity.monitor = val; + art::gLogVerbosity.oat = val; + art::gLogVerbosity.profiler = val; + art::gLogVerbosity.signals = val; + art::gLogVerbosity.simulator = val; + art::gLogVerbosity.startup = val; + art::gLogVerbosity.third_party_jni = val; + art::gLogVerbosity.threads = val; + art::gLogVerbosity.verifier = val; + art::gLogVerbosity.image = val; + + // Note: can't switch systrace_lock_logging. That requires changing entrypoints. + + art::gLogVerbosity.agents = val; + } else { + // Spec isn't clear whether "flag" is a mask or supposed to be single. We implement the mask + // semantics. + constexpr std::underlying_type<jvmtiVerboseFlag>::type kMask = + jvmtiVerboseFlag::JVMTI_VERBOSE_GC | + jvmtiVerboseFlag::JVMTI_VERBOSE_CLASS | + jvmtiVerboseFlag::JVMTI_VERBOSE_JNI; + if ((flag & ~kMask) != 0) { + return ERR(ILLEGAL_ARGUMENT); + } + + bool val = (value == JNI_TRUE) ? true : false; + + if ((flag & jvmtiVerboseFlag::JVMTI_VERBOSE_GC) != 0) { + art::gLogVerbosity.gc = val; + } + + if ((flag & jvmtiVerboseFlag::JVMTI_VERBOSE_CLASS) != 0) { + art::gLogVerbosity.class_linker = val; + } + + if ((flag & jvmtiVerboseFlag::JVMTI_VERBOSE_JNI) != 0) { + art::gLogVerbosity.jni = val; + } + } + + return ERR(NONE); } static jvmtiError GetJLocationFormat(jvmtiEnv* env, jvmtiJlocationFormat* format_ptr) { diff --git a/test/901-hello-ti-agent/basics.cc b/test/901-hello-ti-agent/basics.cc index 3a475c6fef..052fb9ac13 100644 --- a/test/901-hello-ti-agent/basics.cc +++ b/test/901-hello-ti-agent/basics.cc @@ -22,6 +22,9 @@ #include "base/macros.h" #include "openjdkjvmti/jvmti.h" +#include "ti-agent/common_helper.h" +#include "ti-agent/common_load.h" + namespace art { namespace Test901HelloTi { @@ -72,9 +75,22 @@ jint OnLoad(JavaVM* vm, CHECK_CALL_SUCCESS(env->DisposeEnvironment()); CHECK_CALL_SUCCESS(env2->DisposeEnvironment()); #undef CHECK_CALL_SUCCESS + + if (vm->GetEnv(reinterpret_cast<void**>(&jvmti_env), JVMTI_VERSION_1_0)) { + printf("Unable to get jvmti env!\n"); + return 1; + } + SetAllCapabilities(jvmti_env); + return JNI_OK; } +extern "C" JNIEXPORT void JNICALL Java_Main_setVerboseFlag( + JNIEnv* env, jclass Main_klass ATTRIBUTE_UNUSED, jint iflag, jboolean val) { + jvmtiVerboseFlag flag = static_cast<jvmtiVerboseFlag>(iflag); + jvmtiError result = jvmti_env->SetVerboseFlag(flag, val); + JvmtiErrorToException(env, result); +} } // namespace Test901HelloTi } // namespace art diff --git a/test/901-hello-ti-agent/expected.txt b/test/901-hello-ti-agent/expected.txt index 414eb3b2ae..2aee99b25a 100644 --- a/test/901-hello-ti-agent/expected.txt +++ b/test/901-hello-ti-agent/expected.txt @@ -1,2 +1,8 @@ Loaded Agent for test 901-hello-ti-agent Hello, world! +0 +1 +2 +4 +8 +JVMTI_ERROR_ILLEGAL_ARGUMENT diff --git a/test/901-hello-ti-agent/src/Main.java b/test/901-hello-ti-agent/src/Main.java index 1ef6289559..775e5c2e0c 100644 --- a/test/901-hello-ti-agent/src/Main.java +++ b/test/901-hello-ti-agent/src/Main.java @@ -16,6 +16,26 @@ public class Main { public static void main(String[] args) { + System.loadLibrary(args[1]); + System.out.println("Hello, world!"); + + set(0); // OTHER + set(1); // GC + set(2); // CLASS + set(4); // JNI + set(8); // Error. } + + private static void set(int i) { + System.out.println(i); + try { + setVerboseFlag(i, true); + setVerboseFlag(i, false); + } catch (RuntimeException e) { + System.out.println(e.getMessage()); + } + } + + private static native void setVerboseFlag(int flag, boolean value); } |