有没有一种方法可以记录 Java 中调用 System.exit 的堆栈跟踪

Vex*_*toR 4 java systemexit stack-trace

我认为有一种方法可以做到这一点SecurityManager,但我不想为此在应用程序中引入它。

有没有办法使用其他解决方案捕获并记录所谓的 exit() 的堆栈跟踪?

小智 7

使用关闭钩子怎么样?它可能是这样的:

Thread printStackTracesOnShutdownHook = new Thread(() -> {
    LOG.info("Shutdown hook called");
    for (Map.Entry<Thread, StackTraceElement[]> pair : 
             Thread.getAllStackTraces().entrySet()) {
        LOG.info(pair.getKey() + " : " + Arrays.toString(pair.getValue()));
    }
});

Runtime.getRuntime().addShutdownHook(printStackTracesOnShutdownHook);
Run Code Online (Sandbox Code Playgroud)

您可以将此代码添加到应用程序中的某个位置(它将被执行的位置)。然后在关闭时printStackTracesOnShutdownHook将写入日志所有堆栈跟踪。并且您将能够从这些 stackTrace 中找到System.exit()调用的位置。