Как просмотреть все, что работает в потоке событий - PullRequest
4 голосов
/ 18 апреля 2011

Мы столкнулись с ошибкой, которую мы не можем отследить, где что-то замораживает наш поток свинга (прошло уже почти 2 недели и никаких реальных результатов) - мы опытные программисты на Swing, но у нас есть огромная программа, и мы считаем, что онанекоторые из устаревшего кода

Мне интересно, есть ли какой-либо способ кроме редактирования фактического EventQueue класса в JDK, который позволит нам просматривать все части нашего кода, в настоящее время работающие в потоке диспетчеризации событий -может быть, какой-нибудь инструмент, который позволит нам просматривать вещи, когда они входят или выходят из потока рассылки событий?

Ответы [ 4 ]

5 голосов
/ 18 апреля 2011

Один интересный подход заключается в расширении EventQueue и push(), как показано здесь .

4 голосов
/ 18 апреля 2011

Регистрация всего, что проходит через поток рассылки событий, кажется неуклюжим способом диагностики зависания. Не проще ли подождать, пока возникнет проблема, а затем спросить в потоке рассылки событий, что он делает сейчас ? Один из способов сделать это - включить мониторинг JMX , подключиться к выполняемому процессу с помощью клиента JMX, такого как VisualVM (который поставляется с JDK), дождаться возникновения проблемы, а затем взять дамп потока .

Если вы по-прежнему хотите регистрировать все, что делает поток рассылки событий, вы можете сделать это:

  1. В Eclipse запустите приложение в режиме отладки.
  2. Создайте точку останова на EventQueue.dispatchEvent, щелкните ее правой кнопкой мыши, выберите «свойства», проверьте «условие» и введите следующее «условие»:

    System.out.println(arg0);
    return false;
    
2 голосов
/ 18 апреля 2011

Возможно, стоит попробовать BTrace , чтобы обработать EventQueue и захватывать трассировки стека каждый раз, когда что-то добавляется.Я думаю, что в последней версии VisualVM есть плагины, которые позволят вам оснастить работающую JVM скриптом BTrace.

0 голосов
/ 17 декабря 2013

Если вы используете Oracle JRE, уже включено TracedEventQueue . Вы можете установить его, как упоминалось ранее:

EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new TracedEventQueue());

Обратите внимание, это выдаст лот вывода ...

...