Как сообщить обо всех исключениях в JVM, будь то собственный или сторонний код? - PullRequest
2 голосов
/ 21 января 2010

Есть ли способ регистрировать все исключения, происходящие в JVM?

Система построена из большого количества меньших компонентов, предоставленных различными группами. Все они работают в одной и той же JVM (под Weblogic).

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

Я бы хотел использовать ту же функцию, которую JDB использует в среде DEV / SIT / UAT, чтобы сократить время разрешения проблемы. В PTE и PROD, хотя средство должно быть не только выключено, но

  • не влияет на производительность
  • не требует изменения кода для его отключения.

Конечно, я могу подключить JDB к каждому экземпляру сервера, работающего в DEV / SIT. Это возможно, я думаю ... но есть два основных недостатка:

  • делает настройку более сложной
  • JDB останавливается при возникновении исключения; нужен сценарий или что-то, чтобы он продолжался

Так что мне интересно, есть ли способ, который это делает, например, Runtime.traceExceptions (...)?

Ответы [ 4 ]

4 голосов
/ 21 января 2010

Насколько я знаю, для этого не существует официального API Java, кроме API отладки, который можно было бы использовать и изнутри виртуальной машины, которая должна быть отлажена.

Более простой и быстрый способ получать уведомления о каждом исключении, которое создается во время выполнения, - это взломать некоторый код трассировки непосредственно в конструктор (ы) класса Throwable, скомпилировать его и поместить в bootclasspath перед rt.jar. Это, конечно, ничего не нужно делать в версии выпуска, но это может быть очень полезно для анализа кода, который где-то ловит исключения и не сообщает о них должным образом.

В ответ на комментарии:

Относительно API отладчика: в последний раз, когда я делал что-то подобное, я использовал JVMDI для создания собственной библиотеки JNI / JVMDI и обращался к ней изнутри виртуальной машины. Он работает и позволяет вам делать все виды проводных вещей, которые Java обычно не предлагает, но я бы посчитал это еще более взломанным, чем использование пропатченного класса Throwable. Кроме того, JVMDI устарел и был заменен на JVM TI начиная с Java 1.6. Я не знаю, если и как вы можете сделать что-то подобное с этим новым API отладчика.

Использование модифицированного Throwable - это быстро, легко получить правильное решение, само по себе не приводит к ухудшению производительности, а также даже не действительно хакерский, если вы контролируете среду выполнения. Вы могли бы думать о каком-то АОП. ;) Но я бы по-прежнему использовал его только для того, чтобы в противном случае было трудно обнаружить ошибки, а не в рабочем коде или только в крайнем случае. Нечто подобное не должно рассматриваться как часть дизайна. Лучшим долгосрочным подходом было бы добиться того, чтобы все ваши группы разработчиков договорились о каком-то распространенном исключении.

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

1 голос
/ 21 января 2010

Я бы, вероятно, разархивировал JDK, изменил «Исключение», чтобы записать ваше исключение, а затем повторно разархивировать его.

Это довольно разумное решение, которое не вызовет никаких проблем - классы JDK, по большей части, являются просто стандартными классами Java.

Возможно, вы сможете сделать это без изменения JDK, манипулируя путем к классу, чтобы прочитать вашу версию «Exception» перед чтением версии JDK - таким образом, ее будет не так сложно распространять.

0 голосов
/ 26 июня 2013

На Fedora есть проект - ABRT - инструмент для автоматического сообщения об ошибках.

Также сообщается о невыявленных исключениях JVM.

Прямо сейчас (2013) предпринимаются усилия, чтобы он также перехватывал исключения JBoss AS / EAP / WildFly.

Оставайтесь с нами, чтобы знать, когда это произойдет: https://fedorahosted.org/abrt/milestone/Support_for_JAVA_exceptions

0 голосов
/ 21 января 2010

GDB предназначен для программ, созданных GCC. Если вы отлаживаете приложение Java, я предлагаю вам использовать отладчик Java в вашей среде IDE. Может использоваться для ловушки любого сгенерированного исключения.

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

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