Намерете от ShutdownHook защо програмата излиза

Ако имам Java програма, която може да излезе по различни причини, като:

  • тъй като основният прозорец, който е настроен на "излизане при затваряне", беше затворен

  • защото има някои System.exit( 0 ) в кода

  • тъй като изобщо няма повече прозорец (и нито един не е настроен да излиза при затваряне), но все още има няколко работещи нишки, тогава в един момент има само демон нишки, работещи и следователно програмата излиза.

И имам инсталирана кука за изключване (която работи добре).

Има ли някакъв начин да разбера от моята кука за изключване какво е причинило излизането на програмата Java?

(обърнете внимание, че не питам дали е добра идея или не System.exit(...) да се разпространява в кодовата база: това не е темата на този въпрос)

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


person Cedric Martin    schedule 22.11.2011    source източник


Отговори (2)


Можете да добавите SecurityManager, който ще бъде извикан при излизане от системата (за да определи дали е разрешен). Можете да запишете къде е било извикано за по-късно или да се справите с него в SecurityManager.

person Peter Lawrey    schedule 22.11.2011
comment
какво имате предвид под Можете да запазите къде това е извикано за по-късно... Ще ми позволи ли SecurityManager да получа точния клас/ред, в който, например, System.exit повикване? - person Cedric Martin; 22.11.2011
comment
Можете да получите проследяване на стека с Thread.currentThread().getStackTrace(). SecurityManager се извиква, когато се изпълняват чувствителни към сигурността операции (в противен случай това е просто клас/обект) - person Peter Lawrey; 22.11.2011
comment
Във вашия мениджър за сигурност можете да конструирате Throwable, след което да извлечете проследяването на стека от него, като използвате printStackTrace() или getStackTrace(). - person John Haager; 22.11.2011

Вашата кука за изключване просто ще стартира вашата изпълняваема логика в отделна нишка, когато JVM се изключва. Не можете да направите нищо повече с това.

person Drona    schedule 22.11.2011