मुझे विश्वास है कि ऐसा करने के लिए नि: शुल्क उपकरण हैं, लेकिन यहां तक कि अपना स्वयं का टूल बनाना आसान है। 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: %s\n", 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 -agentpath:libextrace.so MyApplication
यह stdout पर सभी अपवाद वर्ग नाम लॉग करेगा। ExceptionCallback
को एक धागा, एक विधि और एक स्थान भी प्राप्त होता है जहां अपवाद होता है, ताकि आप अधिक विवरण मुद्रित करने के लिए कॉलबैक बढ़ा सकें।
डिफ़ॉल्ट अपवादों को stderr पर भेजा जाता है; इसलिए यदि आप stderr को रीडायरेक्ट करते हैं तो आपको अपने अपवादों को कहीं भी प्राप्त करना चाहिए जहां आपने रीडायरेक्ट किया है। – fge
@fge लेकिन फिर वह अपवाद नहीं देख पाएंगे जहां पकड़ा गया और मुद्रित नहीं किया गया था। –
@ अब्बार्ड-माइंड आह हाँ, मैंने उस भाग को नहीं देखा ... ठीक है, कोड को मापने से कम मुझे – fge