2011-09-16 17 views
6

Wcześniej znalazłem się w sytuacji, w której mam program (nie napisany przeze mnie, przez kogoś innego) Chcę działać 24/7, ale czasami się zawiesza. Zwykle nie stanowiłoby to problemu, ponieważ mogę po prostu utworzyć obserwator procesów, który sprawdzi, czy się zawiesił, a następnie w razie potrzeby ponownie go uruchomi.Złapanie wyjątku od innej działającej aplikacji Java

Ale ten konkretny program, czasami zgłasza wyjątek i wyprowadza go do interfejsu graficznego, który jest zintegrowany z nim. W tym przypadku program się nie zawiesza. Interfejs pozostaje w górze, ale rzeczywista funkcjonalność serwera jest niedostępna.

Czy jest jakiś sposób, aby przechwycić te informacje z tego procesu?

+0

Z jakiego systemu operacyjnego korzystasz? – Windle

+0

czy masz dostęp do kodu źródłowego tej aplikacji? a jeśli tak, czy możesz go zmodyfikować? – aav

+0

@Windle: Działa na Windows 7, ale równie dobrze mogę to uruchomić również w Linuksie. Wolałbym jednak rozwiązanie dla Windows. –

Odpowiedz

4

Chcesz użyć urządzenia Java Virtual Machine Tools Interface. Nie mogę podać kodu, aby uchwycić wyjątek, ale to jest miejsce, w którym należy szukać. Będziesz musiał wykonać jakąś pracę detektywistyczną, aby znaleźć klasę, która rzuca wyjątek, lub przynajmniej znaleźć wskaźnik, że został rzucony.

Edycja: Możesz również spróbować zadzwonić do sprzedawcy, aby sprawdzić, czy zna jakiś sposób. Możesz również sprawdzić, czy zapisuje wyjątek do pliku dziennika, który możesz następnie obejrzeć.

+0

Zajrzę do tego. Znam specyficzny wyjątek, który rzuca, ponieważ wyrzuca go w szczegółach do GUI. Naprawdę chodzi mi tylko o ten wyjątek, ponieważ serwer w żaden sposób go nie obsługuje. –

1

Czy inny program to Java? Spójrz na AspectJ, być może uda ci się zhakować coś z niego korzystającego, jeśli masz kontrolę nad uruchomieniem programu.

+0

Jedyne, jakie mam, to plik wykonywalny, który mogę uruchomić. Czy to nadal będzie możliwe? –

+1

AspectJ działa tylko w Javie. Jeśli jest to plik wykonywalny systemu Windows, prawdopodobnie będziesz musiał sprawdzić tytuł okna i zabić, a następnie ponownie uruchomić proces. –

+0

Chciałbym, ale to nie działa w ten sposób. Wyprowadza go do pola tekstowego w interfejsie, a nie do tytułu. –

2

Zakładam, że nie ma dostępu do kodu źródłowego, więc jeśli to jest wyprowadzanie do GUI odpowiedź brzmi: nie. Nawet jeśli mógłbyś dołączyć do działającego procesu, musiałbyś przechwycić wyjątek, ale został on przechwycony i wysłany do GUI, a nie wyrzucony z aplikacji.

Teoretycznie można zeskanować aplikację. Nie znam żadnych konkretnych narzędzi do robienia tego, ale mogą tam być.

Edit: I może się mylić powyżej, sprawdź post here gdzie uzyskać stos z gwintem jezdnego. Prawdopodobnie nie będziesz w stanie uchwycić wyjątku w ten sposób, ale jeśli masz szczęście, śledzenie stosu będzie wyglądać zupełnie inaczej, gdy program będzie działał normalnie w porównaniu do sytuacji, gdy wyjątek został zgłoszony.

Edytuj 2: Przesłałem drugą, dokładniejszą odpowiedź. Zobacz poniżej.

+0

Zgaduję, że jest to najlepsza droga do przebycia. Jeśli zostanie wydrukowany do System.err/out, zobaczysz dużo danych wyjściowych i możesz zabić proces (usunięcie utworzonych elementów GUI). –

1

Bez możliwości przebudowania aplikacji na ogół nie masz szczęścia, chyba że wykonasz intensywne hakowanie. Oto jedna z opcji, którą mogę wymyślić.

Najprawdopodobniej aplikacja zastępuje System.out i/lub System.err własną implementacją strumienia. W takim przypadku możesz spróbować zlokalizować klasę dla tego strumienia i zastąpić ją własnym opakowaniem o tej samej nazwie. Możesz zmienić nazwę oryginalnej klasy używając jarjar. W wapper można dostarczyć wyjście konsoli, aby wykryć wyjątek.

+0

Jeśli jest to program w języku Java i masz plik wykonywalny, prawdopodobnie jest on zawijany. Sprawdź Launch4J, ponieważ istnieje całkiem spora szansa, że ​​właśnie tego użyli. Wyciągnięcie słoika (licencjonowanie na bok) może nie być niemożliwe. –

2

To może lub nie może pracować, ale jeśli po wyświetleniu aplikacyjne to błąd i serwer przestaje działać ma zużycie pamięci spadnie? Jeśli tak, prawdopodobnie możesz dodać logikę do monitora procesu, aby wywołać komendę Windows tasklist, aby sprawdzić, czy użycie pamięci spadnie poniżej pewnego progu. Będziesz musiał sprawdzić, ile pamięci normalnie używa program i ile wykorzystuje po wystąpieniu błędu.

Skoro powiedział, że funkcjonalność serwer przestaje działać, innym rozwiązaniem mogłoby być napisać prosty program, który w zasadzie tylko pingi serwer jaki kiedykolwiek często chcesz się upewnić, że jest nadal w górę. Jeśli nie, zabij proces i uruchom go ponownie.

Powiązane problemy