确定当前调用堆栈(用于诊断目的)

时间:2009-04-01 16:12:43

标签: java stack-trace

出于诊断目的,我有时需要存储导致给定状态转换的调用堆栈(例如授予锁定,提交事务等),以便以后出现问题时我可以找出最初触发的是谁国家转型。

目前,我知道检索调用堆栈的唯一方法看起来像下面的代码片段,我认为非常难看:

StackTraceElement[] cause;
try {
  throw new Exception();
} catch (Exception e) {
  cause = e.getStackTrace();
}

有人知道更好的方法吗?

4 个答案:

答案 0 :(得分:82)

我认为你可以得到同样的东西:

StackTraceElement[] cause = Thread.currentThread().getStackTrace();

答案 1 :(得分:12)

好吧,你可以通过不实际抛出异常来稍微改进它。

Exception ex = new Exception();
ex.fillInStackTrace();
StackTraceElement[] cause = ex.getStackTrace();

实际上,我刚检查过:构造函数已经调用了fillInStackTrace()。所以你可以简化它:

StackTraceElement[] cause = new Exception().getStackTrace();

这实际上是Thread.getStackTrace()在当前线程上调用时的作用,因此您可能更喜欢使用它。

答案 2 :(得分:3)

如果你想把它作为一个字符串并使用Apache Commons:

org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(new Throwable())

答案 3 :(得分:0)

自JDK 9起有一个新选项:StackWalker

它不像Thread.currentThread()。getStackTrace()那样昂贵。

另请参阅How Expensive is Thread.getStackTrace()?