获取与线程相关的堆栈跟踪信息

3

我正在尝试获取Java线程的当前堆栈跟踪。我已经尝试了以下几种方法:

  1. 使用java.lang.Thread类的dumpStack()方法是打印当前线程堆栈跟踪最简单的方法之一。

  2. 使用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

1
使用 Thread.dumpStack 和创建异常并打印其堆栈跟踪几乎完全相同。在内部,dumpStack 方法只是创建了一个异常,并执行了您使用 Throwable 执行的操作。使用 Thread.getStackTrace 将为您提供更多灵活性,以操纵返回的信息。 - Perception
1个回答

2
有没有其他更有效的方法来获取Java中线程的当前堆栈跟踪?
没有。使用thread.printStackTrace()(或getStackTrace())是正确的方法。如果它是当前线程,则在内部使用异常,但如果它是另一个线程,则直接生成堆栈跟踪。
需要补充一点的是,如果您想获取线程的堆栈跟踪,但不确定是否会使用它,最好保存异常,然后只在需要时调用getStackTrace()。在调用之前,Exception中的堆栈跟踪并不完整。有关详细信息,请参阅Throwable.getOurStackTrace()的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接