aboutsummaryrefslogtreecommitdiff
path: root/driver/jvm_tooling.h
diff options
context:
space:
mode:
Diffstat (limited to 'driver/jvm_tooling.h')
-rw-r--r--driver/jvm_tooling.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/driver/jvm_tooling.h b/driver/jvm_tooling.h
new file mode 100644
index 00000000..be9582de
--- /dev/null
+++ b/driver/jvm_tooling.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2021 Code Intelligence GmbH
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include <jni.h>
+
+#include <string>
+
+namespace jazzer {
+
+void DumpJvmStackTraces();
+
+// JVM is a thin wrapper around JNI_CreateJavaVM and DestroyJavaVM. The JVM
+// instance is created inside the constructor with some default JNI options
+// + options which can be added to via command line flags.
+class JVM {
+ private:
+ JavaVM *jvm_;
+ JNIEnv *env_;
+
+ public:
+ // Creates a JVM instance with default options + options that were provided as
+ // command line flags.
+ explicit JVM(const std::string &executable_path);
+
+ // Destroy the running JVM instance.
+ ~JVM();
+
+ // Get the JNI environment for interaction with the running JVM instance.
+ JNIEnv &GetEnv() const;
+
+ jclass FindClass(std::string class_name) const;
+ jmethodID GetStaticMethodID(jclass class_id, const std::string &method_name,
+ const std::string &signature,
+ bool is_required = true) const;
+ jmethodID GetMethodID(jclass class_id, const std::string &method_name,
+ const std::string &signature) const;
+ jfieldID GetStaticFieldID(jclass jclass, const std::string &field_name,
+ const std::string &type) const;
+};
+
+// Adds convenience methods to convert a jvm exception to std::string
+// using StringWriter and PrintWriter. The stack trace can be subjected to
+// further processing, such as deduplication token computation and severity
+// annotation.
+class ExceptionPrinter {
+ private:
+ const JVM &jvm_;
+
+ jclass string_writer_class_;
+ jmethodID string_writer_constructor_;
+ jmethodID string_writer_to_string_method_;
+
+ jclass print_writer_class_;
+ jmethodID print_writer_constructor_;
+ jmethodID print_stack_trace_method_;
+
+ jclass exception_utils_;
+ jmethodID compute_dedup_token_method_;
+ jmethodID preprocess_throwable_method_;
+
+ protected:
+ explicit ExceptionPrinter(JVM &jvm);
+
+ // returns the current JVM exception stack trace as a string
+ std::string getStackTrace(jthrowable exception) const;
+ // augments the throwable with additional information such as severity markers
+ jthrowable preprocessException(jthrowable exception) const;
+ // returns a hash of the exception stack trace for deduplication purposes
+ jlong computeDedupToken(jthrowable exception) const;
+};
+
+} /* namespace jazzer */