JVM - 没有显式调用的打印堆栈跟踪

时间:2012-05-09 18:13:53

标签: java jvm stack-trace jvm-arguments

java中是否有一种方法可以在不阻止代码修改的情况下在catch块中打印任何异常的堆栈跟踪。我被告知有一个JVM arg可以用来产生所有调试异常的堆栈跟踪,虽然我找不到任何关于这个的文档。我能想到的唯一解决方案是使用aspectj并在创建的任何异常上创建一个方面并打印堆栈跟踪。我希望有一个比方面更好的解决方案。

谢谢, 史蒂夫。

- Edit-- 所以我想知道的是让我说我​​有这个代码:     尝试{         抛出新的异常();     }     catch(例外e){     //忽略异常     }

我希望看到e.printStackTrace(),即使没有调用它。这可以帮助调试我看到的jvm崩溃,并且还有很多错误隐藏。

2 个答案:

答案 0 :(得分:2)

正如Marko Topolnik所说,记录任何异常可能需要一些工作,但您也可以实现一个自定义未捕获的异常处理程序来处理未捕获的异常。

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    private final Logger log = Logger.getLogger("EXCEPTION");

    public void uncaughtException(final Thread t, final Throwable e) {
        log.logp(Level.SEVERE, "EXCEPTION", "", "Unhandled exception in thread " + t.getName() + ": ", e);
    }
});

答案 1 :(得分:0)

更好的解决方案只适用于未处理的例外。没有一流的支持来记录正常运行的代码中发生的任何异常。我建议您尝试使用方面并拦截Throwable构造函数调用,如果可能的话。如果可能的话,你可能仍会得到误报,因为实例化异常并不需要抛出它。