如何在Java中获取当前堆栈跟踪,就像在.NET中你可以使用Environment.StackTrace
一样?
我找到了Thread.dumpStack()
,但这不是我想要的 - 我想要获取堆栈跟踪,而不是将其打印出来。
如何在Java中获取当前堆栈跟踪,就像在.NET中你可以使用Environment.StackTrace
一样?
我找到了Thread.dumpStack()
,但这不是我想要的 - 我想要获取堆栈跟踪,而不是将其打印出来。
您可以使用Thread.currentThread().getStackTrace()
方法。
这个方法会返回一个 StackTraceElement
数组,表示程序的当前堆栈跟踪。
String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e);
。该代码可以获得完整的堆栈跟踪信息。 - ripper234new Throwable().getStackTrace()
更快,因为它不需要检查 this != Thread.currentThread()
,并且避免了通过子类(Exception extends Throwable
)调用可能存在的JVM开销。 - VladStackTraceElement[] st = Thread.currentThread().getStackTrace();
如果你不关心堆栈的第一个元素是什么,那么这种方法就可以。
StackTraceElement[] st = new Throwable().getStackTrace();
如果这很重要,那么您当前方法的位置将被定义。
(new Throwable()).getStackTrace()
的执行速度更快(参见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6375302)。 - MightyEThread.currentThread().getStackTrace()
来说总是这种情况),它现在会执行 (new Exception()).getStackTrace()
。 - M. Justinfor (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
System.out.println(ste + "\n");
}
new Exception().printStackTrace(System.out)
来调用。我记得for循环可能会有更少的开销,但你应该只在调试时使用它。 - Jaapfor (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
if(ste.toString().contains("mypackages")){
System.out.println(ste);
}
}
- nbyTony在接受的回答中发表了评论,提供了似乎是最好的答案,实际上回答了原帖作者的问题:
Arrays.toString(Thread.currentThread().getStackTrace()).replace( ',', '\n' );
...这位 OP 并没有询问如何从 Exception
的堆栈跟踪中获取 String
。虽然我非常喜欢 Apache Commons,但当有像上面那样简单的东西时,没有逻辑上的理由使用外部库。
Thread.getAllStackTraces()
,它会给你一个Map<Thread, StackTraceElement[]>
。当Hotspot需要safepoint时,它将safepoint所有线程。Zing可以将单个线程带到safepoint而不干扰其他线程。获取堆栈跟踪需要一个safepoint。Thread.getAllStackTraces()
只获取所有堆栈跟踪并仅停止所有线程一次。当然,您必须找出您实际感兴趣的映射。 - Ralf HThread.currentThread().getStackTrace();
JDK1.5开始提供此功能。
对于较旧版本,您可以将exception.printStackTrace()
重定向到StringWriter()
:
StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
new Throwable().getStackTrace()
自JDK1.4以来就可用。 - Holger你可以使用Apache的commons库来实现:
String fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
的任何人参考,完整代码为:org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
。 - fileoffsetorg.apache.commons.lang3
时,我最初忽略了--导入使用lang3
而不是lang
,并用getStackTrace
替换了getFullStackTrace
。 - ggkmathExceptionUtils.getStackTrace(new Throwable())
表达式获取堆栈跟踪非常棒。 - Sergey Vyacheslavovich Brunov在Android上更简单的方法是使用以下代码:
import android.util.Log;
String stackTrace = Log.getStackTraceString(exception);
另一个解决方案(仅 35 31 个字符):
new Exception().printStackTrace();
new Error().printStackTrace();
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] infos = bean.dumpAllThreads(true, true);
for (ThreadInfo info : infos) {
StackTraceElement[] elems = info.getStackTrace();
// Print out elements, etc.
}
如上所述,如果您只想获取当前线程的堆栈跟踪信息,则更容易-只需使用Thread.currentThread().getStackTrace()
;
System.err.println(elems[i])
)。片段中的第二行缺少bean.
在dumpAllThreads
之前,但我想大多数人都能解决这个问题。 - George Hawkins Thread.dumpStack()
这是一种更简单的方式,因为它有一个优点,即当可能根本不存在问题时,不需要构建异常或可抛出对象,并且这种方法更加直接。
new Exception("Stack trace").printStackTrace();
,因此实际上它正在构建一个Throwable。 - Florent