Перехват исключения из другого запущенного Java-приложения - PullRequest
6 голосов
/ 16 сентября 2011

Я столкнулся с проблемой, когда у меня есть программа (не написанная мной, кем-то другим), я хочу запустить 24/7, но иногда она вылетает.Обычно это не проблема, потому что я могу просто создать наблюдатель процесса, который проверяет, произошел ли сбой, и затем перезапускает его при необходимости.

Но эта конкретная программа иногда выдает исключение и выводит егографический интерфейс, который интегрирован в него.В этом случае программа не падает вообще.Интерфейс остается включенным, но реальная функциональность сервера недоступна.

Можно ли как-то перехватить эту информацию из этого процесса?

Ответы [ 5 ]

4 голосов
/ 16 сентября 2011

Вы хотите использовать Интерфейс инструментов виртуальной машины Java .Я не могу дать вам код, чтобы поймать ваше исключение, но это где искать.Вам придется проделать определенную детективную работу, чтобы найти класс, который выдает исключение, или, по крайней мере, найти какой-то индикатор того, что оно было сгенерировано.

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

2 голосов
/ 16 сентября 2011

Это может работать, а может и не работать, но если при отображении приложения возникает ошибка и сервер перестает работать, снижается ли использование памяти?Если это так, вы, вероятно, могли бы просто добавить некоторую логику в монитор процесса, чтобы вызвать команду windows tasklist, чтобы увидеть, не падает ли использование памяти ниже некоторого порога.Вам нужно будет проверить, сколько памяти программа обычно использует и сколько она использует после ошибки.

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

2 голосов
/ 16 сентября 2011

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

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

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

Редактировать 2: я представил второй, более точный ответ. Смотри ниже.

1 голос
/ 16 сентября 2011

Без возможности перестроить приложение, как правило, вам не повезло, если вы не предпримете какой-то обширный взлом.Вот один вариант, который я могу придумать.

Скорее всего, приложение заменяет System.out и / или System.err собственной потоковой реализацией.Если это так, вы можете попытаться найти класс для этого потока и заменить его своей собственной оболочкой с тем же именем.Вы можете переименовать оригинальный класс, используя jarjar.В ваппере вы можете предоставить консольный вывод для обнаружения исключения.

1 голос
/ 16 сентября 2011

Является ли другая программа Java? Посмотрите на AspectJ , вы можете взломать что-нибудь, используя это, если у вас есть контроль над запуском программы.

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