Отладка сбоев пользовательского интерфейса Java - PullRequest
2 голосов
/ 18 декабря 2008

Я пытаюсь отладить проблему, когда пользователь нажимает кнопку, а пользовательский интерфейс просто умирает. Я знаю, удачи.

Журналы просто заканчиваются после того, как пользователь нажимает кнопку, поэтому я думаю, что могут быть некоторые исключения / ошибки, которые мы не регистрируем. Может быть, OutOfMemoryError.

Любые предложения о том, как поступить? чтобы получить больше информации. Настройка команд Java и т. Д.

Спасибо за любую помощь

  • богатый

Ответы [ 6 ]

4 голосов
/ 18 декабря 2008

Какая версия Java и какая машина?

В любом случае, вот совок: поток очереди событий работает несколько отдельно от основного потока. В Java <5 была ошибка, затрудняющая захват событий из этого потока, поэтому некоторые исключения просто исчезли. В Java 5 появился новый метод <code>Thread.setDefaultUncaughtExceptionHandler(), который позволит вам настроить обработчик исключений для всего, что в противном случае могло бы остаться необработанным. Добавьте туда обработчик, перехватите все Throwables и зарегистрируйте их.

Это также хороший взлом для работы с вещами, которые вы могли бы также назвать System.exit(); иметь normalExit Throwable; Бросьте это куда угодно, вы бы назвали exit в GUI, и убедитесь, что все вычищено.

0 голосов
/ 18 декабря 2008

Мне удалось найти файл ошибок jvm.
Похоже, что-то случилось в нативной ветке "AWT-Windows".

=> 0x02acf000 JavaThread "AWT-Windows" демон [_thread_in_native, id = 3616, стек (0x02eb0000,0x02f00000)]

siginfo: ExceptionCode = 0xc0000005, адрес записи 0xe2789280

Регистры: EAX = 0x234f099c, EBX = 0x00001400, ECX = 0x00000100, EDX = 0xe2789280 ESP = 0x02eff4a4, EBP = 0x00000400, ESI = 0x234f099c, EDI = 0xe2789280 EIP = 0x6d02bcbd, EFLAGS = 0x00010206

вершина стека: (sp = 0x02eff4a4) 0x02eff4a4: 02eff500 00000100 02eff584 00000100
0x02eff4b4: 6d0a5697 00000400 00000400 00000100
0x02eff4c4: 00000100 02eff700 02eff500 00000000
0x02eff4d4: 00000000 00000100 041ac3a0 00000100
0x02eff4e4: 00182620 00000400 e2789280 00000000
0x02eff4f4: 00000000 00000100 00000100 00000000
0x02eff504: 00000000 00000100 00000100 00000000
0x02eff514: 00000000 00000004 00000400 00000000

Инструкции: (pc = 0x6d02bcbd)
0x6d02bcad: 00 00 00 8b 4c 24 14 8b e9 c1 e9 02 8b f0 8b fa
0x6d02bcbd: f3 a5 8b cd 83 e1 03 f3 a4 8b 74 24 18 8b 4c 24

Стек: [0x02eb0000,0x02f00000], sp = 0x02eff4a4, свободное пространство = 317k
Собственные кадры: (J = скомпилированный код Java, j = интерпретированный, Vv = код VM, C = собственный код)
C [awt.dll + 0x2bcbd]

[ошибка произошла во время сообщения об ошибке (печать собственного стека), id 0xc0000005]

фреймы Java: (J = скомпилированный код Java, j = интерпретированный, Vv = код VM)
j sun.awt.windows.WToolkit.eventLoop () V + 0
j sun.awt.windows.WToolkit.run () V + 69
j java.lang.Thread.run () V + 11
v ~ StubRoutines :: call_stub

0 голосов
/ 18 декабря 2008

приложение работает на Java 1.6. и весь процесс сразу же неожиданно завершается.

Еще одна информация заключается в том, что приложение Swing запускается с помощью веб-запуска.

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

к сожалению, это происходило раньше и каждый раз в разные моменты, поэтому я не смог воспроизвести.

мы, вероятно, в конечном итоге будем использовать предложение Thread.setDefaultUncaughtExceptionHandler () и посмотрим, сможем ли мы получить больше информации.

больше мыслей приветствуются. Большое спасибо за помощь

0 голосов
/ 18 декабря 2008

Я не знаю, что вы подразумеваете под "просто умирает".

  • Будет ли пользовательский интерфейс по-прежнему перерисовываться, если вы перетаскиваете его за край экрана, а затем снова в него?
  • Весь процесс в конечном итоге неожиданно завершается?
  • Весь ли процесс немедленно неожиданно завершается?

Предполагая, что пользовательский интерфейс все еще работает, когда вы нажимаете кнопку, и кажется, что ничего не происходит, еще один простой способ диагностировать, что может быть не так, - отслеживать использование процессора и памяти этим процессом. Диспетчер задач (или, лучше, Process Explorer), если вы находитесь в Windows; ps если вы знакомы с Unix (и, возможно, с Mac). Сначала проверьте, сколько ЦП использует этот процесс.

Если это 0%, то у вас, вероятно, есть что-то мягкое, например, кнопка без слушателя (и, следовательно, нажатие на нее не имеет никакого эффекта).

Если это 100%, то у вас, вероятно, какая-то бизнес-логика работает как безумная, возможно, в бесконечном цикле. На две вещи стоит обратить внимание: во-первых, проверьте использование памяти и посмотрите, будет ли она расти; ошибка может приводить к созданию большого количества объектов, и в конечном итоге вам не хватит памяти. Невозможно сказать наверняка, не зная, что делает код. Вторая вещь упоминается выше: перетащите пользовательский интерфейс за экран, а затем обратно. EDT Java (Thread Dispatch Thread) отвечает за обработку всех событий пользовательского интерфейса, включая перерисовку пользовательского интерфейса, когда он становится видимым; если он этого не делает, то вы знаете, что в EDT работает что-то, чего не должно быть, не позволяя ему дойти до выполнения таких операций, как перерисовка. Насколько я знаю, бизнес-логика работает просто отлично, но занимает некоторое время и затягивает EDT.

(Если это чуть меньше 50%, 33%, 25% и т. Д., Значит, вы работаете на машине с несколькими процессорами; см. 100% выше ...)

Однако из вашего описания (а именно, «журналы только что заканчиваются») звучит так, будто ваш пользовательский интерфейс или бизнес-логика ждут чего-то, что никогда не придет, поэтому у вас будет 0% ЦП в этом процессе. В любом случае стоит проверить, так как это быстро и может предотвратить ненужную охоту на насекомых в неправильном месте.

0 голосов
/ 18 декабря 2008

У вас должен быть прослушиватель событий, ожидающий события щелчка мыши. Вы проследили через этот код до определенной строки?

Код должен по крайней мере доходить до первой строки, я не вижу, что слушатель событий не работает.

Тебе нужно немного его сломать.

И если у него всего одна строка, вам нужно углубляться в этот код, пока у вас не будет более одной строки или пока вы не сможете выделить его еще немного ...

0 голосов
/ 18 декабря 2008

Попробуйте перенаправить стандартный вывод - вы, вероятно, увидите там трассировку стека исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...