3

Java でスレッドの現在のスタック トレースを取得しようとしています。次の方法を調べました。

  1. 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
4

1 に答える 1

2

より効率的なJavaのスレッドの現在のスタックトレースを取得できる他のアプローチはありますか?

いいえ。thread.printStackTrace()(またはgetStackTrace()) が正しい方法です。現在のスレッドの場合はException内部的に使用しますが、別のスレッドの場合はスタック トレースを直接生成します。

追加することの 1 つは、スレッドのスタック トレースを取得したいが、それを使用するかどうかわからない場合は、例外を保存してから、getStackTrace()必要な場合にのみ呼び出す方が効率的であるということです。Exception呼び出しが行われるまで、スタック トレースは完全には肉付けされません。詳細については、コードを参照しThrowable.getOurStackTrace()てください。

于 2013-04-09T03:25:39.347 に答える