我正在尝试获取Java线程的当前堆栈跟踪。我已经尝试了以下几种方法:
使用java.lang.Thread类的dumpStack()方法是打印当前线程堆栈跟踪最简单的方法之一。
使用Throwable类的printStackTrace()方法也可以打印堆栈跟踪。
还有其他更有效的方法可以获取Java线程的当前堆栈跟踪吗?
下面是我设计的类..
public class StackTraceExample
{
private static final Logger logger = Logger.getLogger(StringReplace.class.getName());
public static void main(String args[])
{
//calling a method to print stack trace further down
first();
}
public static void first()
{
second();
}
private static void second()
{
third();
}
private static void third()
{
//If you want to print stack trace on console than use dumpStack() method
System.err.println("Stack trace of current thread using dumpStack() method");
Thread.currentThread().dumpStack();
//This is another way to print stack trace from current method
System.err.println("Printing stack trace using printStackTrace() method of Throwable ");
new Throwable().printStackTrace();
//If you want stack trace as StackTraceElement in program itself than
//use getStackTrace() method of Thread class
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
//Once you get StackTraceElement you can also print it to console
System.err.println("displaying Stack trace from StackTraceElement in Java");
for(StackTraceElement st : stackTrace)
{
// System.err.println(st);
}
}
}
输出结果:
Stack trace of current thread using dumpStack() method
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1249)
at test.StringReplace.third(StringReplace.java:38)
at test.StringReplace.second(StringReplace.java:31)
at test.StringReplace.first(StringReplace.java:27)
at test.StringReplace.main(StringReplace.java:23)
Printing stack trace using printStackTrace() method of Throwable
java.lang.Throwable
at test.StringReplace.third(StringReplace.java:42)
at test.StringReplace.second(StringReplace.java:31)
at test.StringReplace.first(StringReplace.java:27)
at test.StringReplace.main(StringReplace.java:23)
displaying Stack trace from StackTraceElement in Java
Thread.dumpStack
和创建异常并打印其堆栈跟踪几乎完全相同。在内部,dumpStack
方法只是创建了一个异常,并执行了您使用Throwable
执行的操作。使用Thread.getStackTrace
将为您提供更多灵活性,以操纵返回的信息。 - Perception