Я пытался отлаживать приложение Java с помощью инструментария. Проблема с нынешней системой,Использование Instrumentation для записи необработанного исключения
- Едва ли написано каким-либо заявление в журнале
- Плохо обработки
исключения Это сделало очень трудно отследить причину разбитой функциональности.
Чтобы справиться с ситуацией, я разработал инструмент, java-агент, используя API Instrumentation
, и мне удалось ввести инструкции журнала и решить половину проблемы.
Но следующая проблема заключается в записи Исключения. Я хочу расширить свою запись инструмента за каждое исключение, возникшее во время выполнения приложения. Я попытался использовать блок «try-catch», используя javaassist
API для методов (используя addCatch
, insertBefore
и insertAfter
), и он эффективен в определенной степени.
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);
}
Здесь inserLog(..)
метод впрыснуть необходимое утверждение журнала и работает нормально, но когда есть какие-либо исключения он не приходит к трансформатору.
Но проблема в том, что некоторые из методов обрабатывают исключение внутри (даже с выходом log/sysout).
например:
try {
if(search.equals("Category")){
//do operation
}
} catch (Exception e) {
}
Этот код ест NullPointerException
, когда значение search
равно нулю, я не знаю, что это исключение, и приложение не в состоянии за некоторые вещи еще.
В конечном счете, я хочу, чтобы механизм записи любых исключений, создаваемых приложением. Следующие детали должны быть захвачены
- Исключение Тип
- Excpetion StackTrace
- Метод и имя класса
Я знаю, что есть API Thread.setDefaultUncaughtExceptionHandler
, но не уверен, как это использовать с Java-измерительных приборов. У меня нет какого-либо источника доступа к приложению.
[обновление 1]
Я нашел ссылку ниже говорит использовать retransformation
, я дам попробовать и обновить
How to instrument java system classes?
Любое руководство будет очень полезным.
> но когда есть какое-либо исключение, он не приходит к трансформатору. Просьба прояснить это утверждение. Откуда вы знаете, что Exception не приходит к трансформатору? Ожидаете ли вы '============= исключительное событие в stdout? Конечно, это не так, потому что вы применяете код, который генерирует исключение, и вы регистрируете все исключения, которые ретранслируются сами. –
@AlexeyAndreev, я не совсем понимаю, что вы регистрируете все исключения, которые ретранслируются сами, не могли бы вы перефразировать его PLS –
ОК, я продолжу свой ответ, так как писать сложные комментарии здесь не так просто –