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ów

To 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 klasy

Wiem, ż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.

questionAnswers(3)

yourAnswerToTheQuestion