Używanie oprzyrządowania do rejestrowania nieobsługiwanego wyjątku
Próbowałem debugować aplikację Java za pomocą oprzyrządowania. Problem z obecnym systemem to
Prawie nie napisał żadnych wyciągów z dziennikaSłaba obsługa wyjątkówTo bardzo utrudniło śledzenie pierwotnej przyczyny złamanej funkcjonalności.
Aby poradzić sobie z sytuacją, opracowałem narzędzie, używając agenta javaInstrumentation
API, a ja udało mi się wstrzyknąć wyciągi z dziennika i rozwiązać połowę problemu.
Ale następnym problemem jest nagrywanie wyjątku. Chcę rozszerzyć mój rekord narzędzia o każdy wyjątek zgłoszony podczas wykonywania aplikacji. Próbowałem wstrzyknąć blok „try-catch”javaassist
API dla metod (przy użyciuaddCatch
, insertBefore
iinsertAfter
) i jest skuteczny w pewnym stopniu.
public byte[] transform(ClassLoader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer)
throws IllegalClassFormatException {
if (className.startsWith("com/alu/")) {
return insertLog(className, classBeingRedefined, classfileBuffer);
}
if(className.endsWith("Exception")){
System.out.println("============= exception occured "+className);
}
TutajinserLog(..)
metoda wprowadzi niezbędną instrukcję dziennika i będzie działać poprawnie, ale gdy wystąpi wyjątek, nie dojdzie do transformatora.
Ale problem polega na tym, że niektóre metody obsługują wyjątek wewnątrz (nawet bez log / sysout).
na przykład:
try {
if(search.equals("Category")){
//do operation
}
} catch (Exception e) {
}
Ten kod zjadaNullPointerException
kiedy wartośćsearch
ma wartość NULL, nigdy nie wiem, czy ten wyjątek i aplikacja zawiodą w innych sytuacjach.
Ostatecznie chcę mechanizmu rejestrującego każdy wyjątek zgłoszony przez aplikację. następujące dane zostaną przechwycone
Typ wyjątkuExctrion StacktraceNazwa metody i klasyWiem, że jest APIThread.setDefaultUncaughtExceptionHandler
, ale nie jestem pewien, jak to działa z instrumentacją java. Nie mam żadnego źródła dostępu do aplikacji.
[aktualizacja 1]
Znalazłem poniżej link do użyciaretransformation
, Spróbuję i zaktualizuję
Jak instrumentować klasy systemu Java?
Wszelkie wskazówki byłyby bardzo pomocne.