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

2022-08-31 17:48:30

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

目前,我所知道的检索调用堆栈的唯一方法类似于以下代码片段,我认为它非常丑陋:

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

有人知道更好的方法来实现这一目标吗?


答案 1

我认为你可以得到同样的事情:

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

答案 2

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

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

实际上,我刚刚检查了:构造函数已经调用了。因此,您可以将其简化为:fillInStackTrace()

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

这实际上是Thread.getStackTrace()在当前线程上调用它时所做的事情,所以你可能更喜欢使用它。


推荐