我有基于 Java 的 Windows 桌面应用程序。
我在我的应用程序中保留了defaultuncaughtexceptionahandler 和shutdown hook。
我有一些称为退出点的用户,例如,用户单击退出,一些错误条件等。所有用户退出点都有正确的日志,后面将是登录关闭 Hook 。
现在,对于我的一个用户来说,应用程序时不时地退出。这里用户没有调用任何用户退出点。打印关闭 Hook 日志。 defaultuncaughtException 处理程序没有异常。
我无法找到谁调用了 system.exit 以及 shutdown hook 。 我能以某种方式找到调用 shutdown hook 或 system.exit () 的内容吗? 打印关闭 Hook 让我认为这是一次正确的 jvm 关闭而不是突然的关闭。
最诚挚的问候, 索拉夫
最佳答案
如果您怀疑有人显式调用 System.exit(…)
或类似函数,您可以使用 SecurityManager
拦截它:
System.setSecurityManager(new SecurityManager() {
@Override
public void checkExit(int status) {
new Exception("exit attempt with return code "+status).printStackTrace();
}
// note that all dedicated check... methods delegate to the two below,
// so overriding these is sufficient to enable all other actions
@Override
public void checkPermission(Permission perm, Object context) { }
@Override
public void checkPermission(Permission perm) { }
});
但是,这不会拦截由外部事件(例如 TERM 信号等)引起的关闭。
关于java - 找出谁调用了 jvm shutdown hook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42091522/