我相信有免费的工具可以做到这一点,但是即使制作自己的工具也很容易。JVMTI将提供帮助。
这是我制作的用于跟踪所有异常的简单JVMTI代理:
#include <jni.h>#include <jvmti.h>#include <string.h>#include <stdio.h>void JNICALL ExceptionCallback(jvmtiEnv* jvmti, JNIEnv* env, jthread thread, jmethodID method, jlocation location, jobject exception, jmethodID catch_method, jlocation catch_location) { char* class_name; jclass exception_class = (*env)->GetObjectClass(env, exception); (*jvmti)->GetClassSignature(jvmti, exception_class, &class_name, NULL); printf("Exception: %sn", class_name);}JNIEXPORT jint JNICALL Agent_onLoad(JavaVM* vm, char* options, void* reserved) { jvmtiEnv* jvmti; jvmtiEventCallbacks callbacks; jvmtiCapabilities capabilities; (*vm)->GetEnv(vm, (void**)&jvmti, JVMTI_VERSION_1_0); memset(&capabilities, 0, sizeof(capabilities)); capabilities.can_generate_exception_events = 1; (*jvmti)->AddCapabilities(jvmti, &capabilities); memset(&callbacks, 0, sizeof(callbacks)); callbacks.Exception = ExceptionCallback; (*jvmti)->SetEventCallbacks(jvmti, &callbacks, sizeof(callbacks)); (*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION, NULL); return 0;}要使用它,请从给定的源代码制作一个共享库(.so),然后使用以下
-agentpath选项运行Java :
java -agentpath:libextrace.so MyApplication
这将在stdout上记录所有异常类名称。
ExceptionCallback还接收到发生异常的线程,方法和位置,因此您可以扩展回调以显示更多详细信息。



