Re: DefaultUncaughtExceptionHandler и тишина
От: rfq  
Дата: 18.05.15 17:52
Оценка: 1 (1)
Здравствуйте, mkind, Вы писали:
M>И всё. Никак не удается вытащить stack trace побольше. Пробовал даже так (хотя и понимал, что не поможет)

M>
M>public void uncaughtException(Thread t, Throwable e) {
M>        Set<Thread> threads = Thread.getAllStackTraces().keySet();
M>        StringBuilder builder = new StringBuilder();
M>        threads.forEach(thread -> builder.append(Arrays.toString(thread.getStackTrace())).append("\n"));
M>        logger.error("Uncaught exception in thread " + Thread.currentThread().getName()+ "\n" + builder.toString(), e);
M>    }
M>


Stack trace надо брать не у thread, а у параметра Throwable e:
Re[2]: DefaultUncaughtExceptionHandler и тишина
От: rfq  
Дата: 18.05.15 18:02
Оценка: 1 (1)
Здравствуйте, rfq, Вы писали:

rfq>Stack trace надо брать не у thread, а у параметра Throwable e:

 e.printStackTrace(); // выводит в stderr

Чтобы превратить в строку и вывести с через логгер, см
http://www.javapractices.com/topic/TopicAction.do?Id=78
DefaultUncaughtExceptionHandler и тишина
От: mkind Россия http://kishlaly.com
Дата: 15.05.15 13:51
Оценка:
Коллеги, добрый день!
(приложение является шаманской помесью swing + spring)
Устанавливаю UncaughtExceptionHandler потоку:
Thread.setDefaultUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler());


Класс представляет собой отсылку к логгеру:

public class DefaultUncaughtExceptionHandler implements UncaughtExceptionHandler {

    public static final Logger logger = LoggerFactory.getLogger(DefaultUncaughtExceptionHandler.class);

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        logger.error("Uncaught Exception detected in thread {}", t, e);
    }
}


Периодически ловлю в логе такую ошибку и следом за ней AWT поток начинает жутко тормозить:

[AWT-EventQueue-0] DefaultUncaughtExceptionHandler - Uncaught Exception detected in thread Thread[AWT-EventQueue-0,6,main]
java.lang.ArrayIndexOutOfBoundsException: null


И всё. Никак не удается вытащить stack trace побольше. Пробовал даже так (хотя и понимал, что не поможет)

public void uncaughtException(Thread t, Throwable e) {
        Set<Thread> threads = Thread.getAllStackTraces().keySet();
        StringBuilder builder = new StringBuilder();
        threads.forEach(thread -> builder.append(Arrays.toString(thread.getStackTrace())).append("\n"));
        logger.error("Uncaught exception in thread " + Thread.currentThread().getName()+ "\n" + builder.toString(), e);
    }


В коде никто явно не бросает ArrayIndexOutOfBoundsException, изучение всех возможных циклов тоже ничего не дал. Есть подозрение, что ошибка где-то глубже.

В IntelliJ IDEA можно создать Java Exception Brakepoint, который можно натравить на конкретный класс исключения, но проблема в том, что я не могу подключиться дебагом на работающие приложение.
Может быть, есть другие способы изощренного логирования?

Кстати, дампы памяти и потоков не показали ничего интересного. Хип, как всегда, завален char[] и хэшмапами, ни одного дедлока или подозрительного blocking state.
Knowledge itself is power
F.Bacon
Отредактировано 15.05.2015 14:07 mkind . Предыдущая версия . Еще …
Отредактировано 15.05.2015 13:58 mkind . Предыдущая версия .
Re: DefaultUncaughtExceptionHandler и тишина
От: Blazkowicz Россия  
Дата: 15.05.15 16:39
Оценка:
Здравствуйте, mkind, Вы писали:

Опция -XX:-OmitStackTraceInFastThrow случайно не активирована
Re: DefaultUncaughtExceptionHandler и тишина
От: UDI Россия  
Дата: 15.05.15 16:39
Оценка:
Ошибка выкидывается в потоке, отвечающем за обработку очереди графической составляющей приложения. Видимо, модель какого-то элемента интерфейса изменяется из другого потока в момент, когда выполяется событие из очереди, требующее перерисовки элемента (этого или его контейнера, или др.). А в модели наверное фигурирует какой-то экзмепляр коллекции или массив, к которому идет обращение по уже не акутальному порядковому индексу.
"Не волнуйся, голова! Теперь будет думать компьютер"
Гомер Джей Симпсон
Re[2]: DefaultUncaughtExceptionHandler и тишина
От: mkind Россия http://kishlaly.com
Дата: 18.05.15 11:09
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Опция -XX:-OmitStackTraceInFastThrow случайно не активирована


нету, ни +OmitStackTraceInFastThrow , ни -OmitStackTraceInFastThrow =)
Knowledge itself is power
F.Bacon
Re[2]: DefaultUncaughtExceptionHandler и тишина
От: mkind Россия http://kishlaly.com
Дата: 18.05.15 11:10
Оценка:
Здравствуйте, UDI, Вы писали:

UDI>Ошибка выкидывается в потоке, отвечающем за обработку очереди графической составляющей приложения. Видимо, модель какого-то элемента интерфейса изменяется из другого потока в момент, когда выполяется событие из очереди, требующее перерисовки элемента (этого или его контейнера, или др.). А в модели наверное фигурирует какой-то экзмепляр коллекции или массив, к которому идет обращение по уже не акутальному порядковому индексу.


Вот я и пытаюсь отловить того негодяя, который обращается к неактуальному порядковому индексу
Knowledge itself is power
F.Bacon
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.