首页 > 学院 > 开发设计 > 正文

通过继承SecurityManager实现系统退出检查

2019-11-08 02:21:34
字体:
来源:转载
供稿:网友

有时会遇到一个问题,系统运行时忽然退出,怀疑执行了System.exit方法,但是无法排查是哪里调用。可通过java的SecurityManager机制来进行检查。

实现一个继承SecurityManager的子类,重写checkExit方法,并通过 -Djava.security.manager设置,就可监测到哪里执行了System.exit方法。

如下列代码,将执行了System.exit方法打印出来

public class ExitPRintSecurityManager extends SecurityManager { private final int runtimeStackIndex = 3; @Override public void checkExit(int paramInt) { String exitName = "Runtime.exit"; StackTraceElement[] stack = Thread.currentThread().getStackTrace(); if (stack.length > runtimeStackIndex) { int sourceIndex = runtimeStackIndex; StackTraceElement source = stack[sourceIndex]; if ("java.lang.System".equals(source.getClassName()) && "exit".equals(source.getMethodName())) { source = stack[++sourceIndex]; exitName = "System.exit"; } System.out.println(exitName + " in " + source); System.out.println("Stack trace as follows:"); printStack(sourceIndex, stack); } else { System.out.println("Can not print System.exit"); } } private void printStack(int sourceIndex, StackTraceElement[] stack){ for (int i = sourceIndex - 1; i < stack.length; i++) { System.out.println(" " + stack[i]); } } @Override public void checkPermission(Permission perm, Object context) { // allow anything. } @Override public void checkPermission(Permission paramPermission) { // allow anything. }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表