Bunu yapmak için ücretsiz araçlar olduğuna inanıyorum, hatta kendi aracınızı yapmak bile kolay. JVMTI yardımcı olacaktır. İşte
Bütün istisnalar izlemek için yapılmış basit bir JVMTI ajandır:
#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;
}
Kullanmak için, verilen kaynak kodundan paylaşılan kitaplığı (bu nedenle) yapmak ve -agentpath
seçeneğiyle Java çalıştırın:
Bu, stdout'taki tüm özel durum sınıf adlarını günlüğe kaydeder. ExceptionCallback
ayrıca bir iş parçacığı, bir yöntem ve özel durumun oluştuğu bir yer alır, böylece geri bildirimi daha fazla ayrıntıyı yazdırmak için genişletebilirsiniz.
Varsayılan olarak stderr; Bu nedenle, stderr'i yeniden yönlendirirseniz, yeniden yönlendirdiğiniz her yerde istisnalarınızı almalısınız. – fge
@fge ancak o zaman yakalanan ve basılmayan istisnalar görmeyecek. –
@ Absurd-Mind ah evet, ben bu kısmı görmedim ... Eh, kodu enstrümantasyonun kısa bir yolu – fge